非线性优化_曲线拟合_Ceres_最小二乘法示例
高翔 slam 14 讲 chapter 6
1. 求参数 abc, 优化 y = exp(a* x^2 + b*x + c)
#include <iostream>
#include <opencv2/core/core.hpp>
#include <ceres/ceres.h>
#include <chrono>using namespace std;// 代价函数的计算模型
struct CURVE_FITTING_COST
{CURVE_FITTING_COST ( double x, double y ) : _x ( x ), _y ( y ) {}// 残差的计算template <typename T>bool operator() (const T* const abc, // 模型参数,有3维T* residual ) const // 残差{residual[0] = T ( _y ) - ceres::exp ( abc[0]*T ( _x ) *T ( _x ) + abc[1]*T ( _x ) + abc[2] ); // y-exp(ax^2+bx+c)return true;}const double _x, _y; // x,y数据
};int main ( int argc, char** argv )
{double a=1.0, b=2.0, c=1.0; // 真实参数值int N=100; // 数据点double w_sigma=1.0; // 噪声Sigma值cv::RNG rng; // OpenCV随机数产生器double abc[3] = {0,0,0}; // abc参数的估计值vector<double> x_data, y_data; // 数据cout<<"generating data: "<<endl;for ( int i=0; i<N; i++ ){double x = i/100.0;x_data.push_back ( x );y_data.push_back (exp ( a*x*x + b*x + c ) + rng.gaussian ( w_sigma ));cout<<x_data[i]<<" "<<y_data[i]<<endl;}// 构建最小二乘问题ceres::Problem problem;for ( int i=0; i<N; i++ ){problem.AddResidualBlock ( // 向问题中添加误差项// 使用自动求导,模板参数:误差类型,输出维度,输入维度,维数要与前面struct中一致new ceres::AutoDiffCostFunction<CURVE_FITTING_COST, 1, 3> ( new CURVE_FITTING_COST ( x_data[i], y_data[i] )),nullptr, // 核函数,这里不使用,为空abc // 待估计参数);}// 配置求解器ceres::Solver::Options options; // 这里有很多配置项可以填options.linear_solver_type = ceres::DENSE_QR; // 增量方程如何求解options.minimizer_progress_to_stdout = true; // 输出到coutceres::Solver::Summary summary; // 优化信息chrono::steady_clock::time_point t1 = chrono::steady_clock::now();ceres::Solve ( options, &problem, &summary ); // 开始优化chrono::steady_clock::time_point t2 = chrono::steady_clock::now();chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );cout<<"solve time cost = "<<time_used.count()<<" seconds. "<<endl;// 输出结果cout<<summary.BriefReport() <<endl;cout<<"estimated a,b,c = ";for ( auto a:abc ) cout<<a<<" ";cout<<endl;return 0;
}
运行结果:
2. 求参数 abc , 优化 y = a* x^3 + b*x + c
#include <iostream>
#include <opencv2/core/core.hpp>
#include <ceres/ceres.h>
#include <chrono>using namespace std;// 代价函数的计算模型 y = a * x^3 + b * x + c;
struct CURVE_COST_FUNCTION
{double mX, mY;CURVE_COST_FUNCTION(double x, double y) : mX(x), mY(y) {}template <typename T>bool operator()(const T *const a, const T *const b, const T *const c, T *residual) const{residual[0] = mY - (a[0] * mX * mX * mX + b[0] * mX + c[0]);return true;}
};int main(int argc, char **argv)
{double a = 10.0, b = 2.0, c = 3.0; // 真实参数值int N = 100; // 数据点double w_sigma = 0.2; // 噪声Sigma值cv::RNG rng; // OpenCV随机数产生器double abc[3] = {4, 0, 0}; // abc参数的估计值vector<double> x_data, y_data; // 数据cout << "generating data: " << endl;for (int i = 0; i < N; i++){double x = i / 100.0;x_data.push_back(x);y_data.push_back(a * x * x * x + b * x + c + rng.gaussian(w_sigma));cout << x_data[i] << " " << y_data[i] << endl;}// 构建最小二乘问题ceres::Problem problem;for (int i = 0; i < N; i++){problem.AddResidualBlock(new ceres::AutoDiffCostFunction<CURVE_COST_FUNCTION, 1, 1, 1, 1>(new CURVE_COST_FUNCTION(x_data[i], y_data[i])),nullptr,&abc[0],&abc[1],&abc[2]);}// 配置求解器ceres::Solver::Options options;options.linear_solver_type = ceres::DENSE_SCHUR;options.minimizer_progress_to_stdout = true;// 输出结果ceres::Solver::Summary summary;ceres::Solve(options, &problem, &summary);cout << summary.BriefReport() << endl;cout << summary.final_cost << endl;cout << "estimated a,b,c = ";for (auto a : abc)cout << a << " ";cout << endl;return 0;
}
运行结果:
非线性优化_曲线拟合_Ceres_最小二乘法示例相关推荐
- 计算机最小二乘法拟合,数值计算_第6章 曲线拟合的最小二乘法.doc
数值计算_第6章 曲线拟合的最小二乘法.doc 还剩 29页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 ...
- 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法
<数值计算_第6章曲线拟合的最小二乘法>由会员分享,可在线阅读,更多相关<数值计算_第6章曲线拟合的最小二乘法(23页珍藏版)>请在人人文库网上搜索. 1.第6章 曲线拟合的最 ...
- 数值计算方法第五章—曲线拟合的最小二乘法
曲线拟合的最小二乘法 本文参考书为马东升著<数值计算方法> 最小二乘法 与插值法的区别:只需"逼近" f(x)f(x)f(x) ,而不用满足插值原则(即经过插值节点) ...
- api数据接口文档_接口文档示例(Taobao/jd/pinduoduo/开放接口调用)
api数据接口文档_接口文档示例 本文主要是提供了一个接口文档的范文,内容修订历史.目录.时序图.接口要素描述.接口说明.使用示例.字典.FAQ. 使用MD格式文档(makedown),选择原因,容 ...
- 《数值分析》李庆扬 03 曲线拟合的最小二乘法
# 写于2021.01.05 # 教材<数值分析> 第五版 李庆扬 王能超 易大义 # 只总结了考试需要的内容:无加权的最小二乘的计算 # 总结不易 望赞鼓励 0 内容串联 1. 误差分析 ...
- 多项式曲线拟合之最小二乘法推导
1.多项式曲线拟合之最小二乘法 1.1 问题来源 1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星.经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置.随后 ...
- 如何用python画雪人_pygame画雪人_函数与图形示例.py
"""pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...
- 4.6 曲线拟合的最小二乘法
4.6.1 最小二乘问题的提法 学习目标: 要学习曲线拟合的最小二乘法,我会按照以下步骤进行: 理解最小二乘法的基本思想和原理,即在已知数据的情况下,通过拟合一条曲线,使得曲线与数据之间的误差最小化. ...
- 用python画雪人-pygame画雪人_函数与图形示例.py
"""pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...
- xml格式是什么示例_什么是对抗示例?
xml格式是什么示例 In recent times, Machine Learning (a subset of Artificial Intelligence) has been at the f ...
最新文章
- SAP RETAIL 为物料组指派Merchandise Hierarchy Level Code
- Forbidden You don#39;t have permission to access / on this server.
- Openshift API部分源码学习笔记(一)
- 如何在Ubuntu 18.04上安装Django
- 纯css页面变灰度兼容ie、firefox、chrome、opera、safari
- CentOS 6虚拟机Hadoop安装教程
- 地理建模——显著性检验
- Windows下的CMake下载与安装
- JDK11下载安装、JRE生成、环境配置
- 【调用接口实现自动抠图】
- python任务栏都隐藏了_请问如何始终隐藏WINDOWS任务栏?
- 电机与拖动(戚金清版)学习整理
- 大伽「趣」说AI:腾讯云在多个场景中的AI落地实践
- 360p2刷无线打印服务器,360P2路由器怎么修改无线信道?-360安全路由P2的WiFi信道修改教程?...
- v-if条件判断及v-show
- Android反编译锁机文件
- OpenHarmony代码下载编译流程记录
- 全量发布与灰度发布(APP版本发布)
- 第6章 详细设计(软件工程导论 第6版)
- 微信企业号手机端清理缓存
热门文章
- Linux怎么删除tomcat日志,Linux下定时切割Tomcat日志并删除指定天数前的日志记录...
- 关于LoadRunner的Snapshots
- 安卓手机作为中继器-连接Wifi共享该Wifi给PC和手机
- 第二篇:ssh.invoke_shell() 切换root出现的新问题
- Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
- 华山论剑之JAVA三大代码生成工具:Lombok、AutoValue和Immutables
- js截取字符长度加省略号
- PostGis路径分析
- Vue学习之从入门到神经(两万字收藏篇)
- Asp.Net数据控件遍历