高翔 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_最小二乘法示例相关推荐

  1. 计算机最小二乘法拟合,数值计算_第6章 曲线拟合的最小二乘法.doc

    数值计算_第6章 曲线拟合的最小二乘法.doc 还剩 29页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 第 ...

  2. 曲线拟合最小二乘法对数c语言实现,数值计算_第6章曲线拟合的最小二乘法

    <数值计算_第6章曲线拟合的最小二乘法>由会员分享,可在线阅读,更多相关<数值计算_第6章曲线拟合的最小二乘法(23页珍藏版)>请在人人文库网上搜索. 1.第6章 曲线拟合的最 ...

  3. 数值计算方法第五章—曲线拟合的最小二乘法

    曲线拟合的最小二乘法 本文参考书为马东升著<数值计算方法> 最小二乘法 与插值法的区别:只需"逼近" f(x)f(x)f(x) ,而不用满足插值原则(即经过插值节点) ...

  4. api数据接口文档_接口文档示例(Taobao/jd/pinduoduo/开放接口调用)

    api数据接口文档_接口文档示例 本文主要是提供了一个接口文档的范文,内容修订历史.目录.时序图.接口要素描述.接口说明.使用示例.字典.FAQ.  使用MD格式文档(makedown),选择原因,容 ...

  5. 《数值分析》李庆扬 03 曲线拟合的最小二乘法

    # 写于2021.01.05 # 教材<数值分析> 第五版 李庆扬 王能超 易大义 # 只总结了考试需要的内容:无加权的最小二乘的计算 # 总结不易 望赞鼓励 0 内容串联 1. 误差分析 ...

  6. 多项式曲线拟合之最小二乘法推导

    1.多项式曲线拟合之最小二乘法 1.1 问题来源 1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星.经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置.随后 ...

  7. 如何用python画雪人_pygame画雪人_函数与图形示例.py

    """pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...

  8. 4.6 曲线拟合的最小二乘法

    4.6.1 最小二乘问题的提法 学习目标: 要学习曲线拟合的最小二乘法,我会按照以下步骤进行: 理解最小二乘法的基本思想和原理,即在已知数据的情况下,通过拟合一条曲线,使得曲线与数据之间的误差最小化. ...

  9. 用python画雪人-pygame画雪人_函数与图形示例.py

    """pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...

  10. xml格式是什么示例_什么是对抗示例?

    xml格式是什么示例 In recent times, Machine Learning (a subset of Artificial Intelligence) has been at the f ...

最新文章

  1. SAP RETAIL 为物料组指派Merchandise Hierarchy Level Code
  2. Forbidden You don#39;t have permission to access / on this server.
  3. Openshift API部分源码学习笔记(一)
  4. 如何在Ubuntu 18.04上安装Django
  5. 纯css页面变灰度兼容ie、firefox、chrome、opera、safari
  6. CentOS 6虚拟机Hadoop安装教程
  7. 地理建模——显著性检验
  8. Windows下的CMake下载与安装
  9. JDK11下载安装、JRE生成、环境配置
  10. 【调用接口实现自动抠图】
  11. python任务栏都隐藏了_请问如何始终隐藏WINDOWS任务栏?
  12. 电机与拖动(戚金清版)学习整理
  13. 大伽「趣」说AI:腾讯云在多个场景中的AI落地实践
  14. 360p2刷无线打印服务器,360P2路由器怎么修改无线信道?-360安全路由P2的WiFi信道修改教程?...
  15. v-if条件判断及v-show
  16. Android反编译锁机文件
  17. OpenHarmony代码下载编译流程记录
  18. 全量发布与灰度发布(APP版本发布)
  19. 第6章 详细设计(软件工程导论 第6版)
  20. 微信企业号手机端清理缓存

热门文章

  1. Linux怎么删除tomcat日志,Linux下定时切割Tomcat日志并删除指定天数前的日志记录...
  2. 关于LoadRunner的Snapshots
  3. 安卓手机作为中继器-连接Wifi共享该Wifi给PC和手机
  4. 第二篇:ssh.invoke_shell() 切换root出现的新问题
  5. Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
  6. 华山论剑之JAVA三大代码生成工具:Lombok、AutoValue和Immutables
  7. js截取字符长度加省略号
  8. PostGis路径分析
  9. Vue学习之从入门到神经(两万字收藏篇)
  10. Asp.Net数据控件遍历