求解非线性最小二乘法 Eigen
生活随笔
收集整理的這篇文章主要介紹了
求解非线性最小二乘法 Eigen
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// 利用Eigen 求解非線性最小二乘;
// 示例:<span style="font-family: Arial, Helvetica, sans-serif;">y = 10*(x0+3)^2 + (x1-5)^2</span><pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;">#include "math.h"</span>
#include "iostream"
#include "vector"
#include "list"using namespace std;#include "Eigen/Dense"
#include "Eigen/Core"
#include <unsupported/Eigen/NonLinearOptimization>
#include <unsupported/Eigen/NumericalDiff>using namespace Eigen;
int main(int argc, char *argv[]) {Eigen::VectorXd x(2);x(0) = 1.0;x(1) = 3.0;my_functor functor;Eigen::NumericalDiff<my_functor> numDiff(functor);Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);Eigen::VectorXd y(2);functor.operator()(x, y);std::cout << "x first input: \n" << x << std::endl;std::cout<<"y first outpout: \n" << y << std::endl;lm.parameters.maxfev = 1000;lm.parameters.xtol = 1.0e-8;int iRet = lm.minimize(x);std::cout << "迭代次數:\n"<<lm.iter << std::endl;std::cout << "計算標志:\n" << iRet << std::endl;std::cout << "x finnal: \n" << x << std::endl;functor.operator()(x, y);std::cout<<"y outpout((minimized): \n" << y << std::endl;return 0; }
// Generic functor template<typename _Scalar, int NX = Eigen::Dynamic, int NY = Eigen::Dynamic> struct Functor {typedef _Scalar Scalar;enum {InputsAtCompileTime = NX,ValuesAtCompileTime = NY};typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1> InputType;typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1> ValueType;typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;int m_inputs, m_values;Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}int inputs() const { return m_inputs; }int values() const { return m_values; }};
int main(int argc, char *argv[]) {Eigen::VectorXd x(2);x(0) = 1.0;x(1) = 3.0;my_functor functor;Eigen::NumericalDiff<my_functor> numDiff(functor);Eigen::LevenbergMarquardt<Eigen::NumericalDiff<my_functor>,double> lm(numDiff);Eigen::VectorXd y(2);functor.operator()(x, y);std::cout << "x first input: \n" << x << std::endl;std::cout<<"y first outpout: \n" << y << std::endl;lm.parameters.maxfev = 1000;lm.parameters.xtol = 1.0e-8;int iRet = lm.minimize(x);std::cout << "迭代次數:\n"<<lm.iter << std::endl;std::cout << "計算標志:\n" << iRet << std::endl;std::cout << "x finnal: \n" << x << std::endl;functor.operator()(x, y);std::cout<<"y outpout((minimized): \n" << y << std::endl;return 0; }
// 最終看到輸出了x = [-3.0, 5.0]. 使得目標最小!
總結
以上是生活随笔為你收集整理的求解非线性最小二乘法 Eigen的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RFID仓库管理解决方案,挑选RFID仓
- 下一篇: 烟花仓库智能管理-RFID仓库管理解决方