// Authors: Unknown. Please, if you are the author of this file, or if you // know who are the authors of this file, let us know, so we can give the // adequate credits and/or get the adequate authorizations. #ifndef NUMERICS_H #define NUMERICS_H #include "matrix.h" #include namespace libNumerics { class NumericsException {}; class SvdConvergenceError : public NumericsException {}; typedef double flnum; /// Solve system AX = B. bool solveLU(const matrix& A, const vector& B, vector& X); bool solveLU(matrix A, vector& B); /// Singular Value Decomposition class SVD { public: SVD(const matrix& A); matrix& U() { return m_U; } vector& W() { return m_W; } matrix& V() { return m_V; } matrix compose() const; private: matrix m_U, m_V; vector m_W; static flnum withSignOf(flnum a, flnum b); static flnum hypot(flnum a, flnum b); static void rotate(flnum& a, flnum& b, flnum c, flnum s); void compute(); void sort(); }; /// Levenberg-Marquardt minimization. class MinLM { static const flnum DEFAULT_RELATIVE_TOL; static const flnum DEFAULT_LAMBDA_INIT; static const flnum DEFAULT_LAMBDA_FACT; static const flnum EPSILON_KERNEL; public: MinLM(); flnum minimize(vector& P, const vector& ydata, flnum targetRMSE=0.1, int maxIters=300); virtual void modelData(const vector& P, vector& ymodel) const = 0; virtual void modelJacobian(const vector& P, matrix& J) const = 0; int iterations; flnum relativeTol; flnum lambdaInit; flnum lambdaFact; private: std::vector m_nullCols; void compress(matrix& JtJ, vector& B); void uncompress(vector& B); }; } // namespace libNumerics #endif