求解非线性最小二乘法 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;
// 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; }};
struct my_functor : Functor<double>
{// 输出个数必须大于输入个数, 故用2不用1;my_functor(void): Functor<double>(2, 2) {}int operator()(const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const{// Implement y = 10*(x0+3)^2 + (x1-5)^2fvec(0) = 10.0*pow(x(0)+3.0,2) + pow(x(1)-5.0,2);fvec(1) = 0;return 0;}
};
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相关推荐
- 非线性最小二乘法之Gauss Newton、L-M、Dog-Leg
非线性最小二乘法之Gauss Newton.L-M.Dog-Leg 最快下降法 假设hTF′(x)<0h^TF'(x) ,则h是F(x)F(x)下降方向,即对于任意足够小的α>0\alph ...
- 最小覆盖模型matlab_数学规划模型的matlab求解 非线性最小二乘lsqnonlin
数学规划模型是优化模型的一种,包括线性规划模型(目标函数和约束条件都是线性函数的优化问题); 非线性规划模型(目标函数或者约束条件是非线性的函数); 整数规划(决策变量是整数值得规划问题); 多目标规 ...
- 非线性最小二乘法 python_[数值计算] 数据拟合——非线性最小二乘法
前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合--线性最小二乘法zhuanlan.zhihu.com 现在来看另一个问题:非线性最小二乘法 1. 定义 首先是如何定义这里这 ...
- Ceres Solver 官方教程学习笔记(十二)——非线性最小二乘法建模Modeling Non-linear Least Squares (下)
这一部分主要是最后的Problem比较重要. 带条件的代价函数ConditionedCostFunction 这个类使用户可以在使用封装好的代价函数的同时,对残差值加入一定的条件限制.举个例子,现在已 ...
- 【scipy】Python调用非线性最小二乘法
文章目录 简介与构造函数 迭代策略 雅可比矩阵 测试 简介与构造函数 在scipy中,非线性最小二乘法的目的是找到一组函数,使得误差函数的平方和最小,可以表示为如下公式 arg minfiF(x)= ...
- 非线性方程组牛顿迭代法matlab,matlab实现牛顿迭代法求解非线性方程组
<matlab实现牛顿迭代法求解非线性方程组>由会员分享,可在线阅读,更多相关<matlab实现牛顿迭代法求解非线性方程组(5页珍藏版)>请在人人文库网上搜索. 1.matla ...
- python牛顿法解非线性方程组_matlab实现牛顿迭代法求解非线性方程组.pdf
matlab实现牛顿迭代法求解非线性方程组.pdf matlab 实现牛顿迭代法求解非线性方程组实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cosx2*x3-1/20 x12-81 ...
- 求解多变量非线性全局最优解_一种求解非线性约束优化全局最优的新方法
一种求解非线性约束优化全局最优的新方法 刘子军,吕柏权,曹媛, (上海大学 机电工程与自动化学院 上海 200072) [摘要] 本文提出了一种求解非线性约束优化的全局最优的新方法-它是基于利用非线 ...
- matlab矩阵方程奇异,matlab求解非线性方程组 牛顿迭代发 奇异矩阵
求高手帮忙看看下面的程序怎么改 牛顿迭代法 求解后现实矩阵奇异,跪求高手 -------------------------------- %首先建立函数fun %储存方程组编程如下将fun.m ...
最新文章
- Http请求Response Code含义
- 初学PX4之飞控算法
- 正则中除了空格还有什么标识间距
- IBase component cannot be created and deleted in the same second
- mysql lepus_MySQL 监控软件lepus天兔
- C语言实现多线程排序
- 国贸专业要考计算机二级,国贸专业考计算机二级有没有必要
- python-变量操作-字符串
- 双极结型三极管及放大电路基础
- 12010.linux应用程序之spi
- 【转载】MySQL -- SET NAMES utf8
- 数据在各层之间的发送过程
- java interruptedexception_如何正确的处理InterruptedException
- 修改服务器cimc地址,【交换机在江湖】实战案例十三 HUAWEI S系列交换机802.1x特性对接H厂商IMC服务器配置指导...
- matlab中常用符号
- Centos7 [Errno 14] curl#37 - Couldn't open file /mnt/Packages/repodata/repomd.xml
- html语言左对齐是什么,html - 如何左对齐标签?
- 阿里云国际版免费试用套餐使用教程
- java计算机毕业设计教师教学质量评估系统MyBatis+系统+LW文档+源码+调试部署
- leetcode17 Sum of Two Integers