假设优化函数为:

真实值:a=1,b=2,c=1;

#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     // 残差{if(T(_x)<T(1)&&T(_x)>=T(0))residual[0] = T ( _y ) - ceres::exp ( abc[0]*T ( _x ) *T ( _x ) + abc[1]*T ( _x ) + abc[2] ); // y-exp(ax^2+bx+c)if(T(_x)>=T(1)&&T(_x)<T(2))residual[0] = T ( _y ) - ( abc[0]*T ( _x ) *T ( _x ) + abc[1]*T ( _x ) + abc[2] ); // y-(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;}for ( int i=N; i<2*N; i++ ){double x = i/100.0;x_data.push_back ( x );y_data.push_back (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<2*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;
}

结果如下:

estimated a,b,c = 0.954171 2.0839 0.971109

效果:

ceres拟合分段函数相关推荐

  1. 用python画分段函数图像_使用Python拟合分段函数

    我试图用Numpy来拟合分段函数和绝对值.在 数学函数是 x&lt:p[1]:y=1+p[0]*abs((size+x-p[1])/size-size/2) x&gt:=p[1]:y= ...

  2. matlab可以拟合分段函数吗,如何用matlab拟合出分段函数

    你要知道,你要拟合的是一个分段函数,这本身就不是一般的连续光滑函数. nlinfit之所以要有初值这一项,就是考虑到在某些变态的情况下,无法找到最小二乘函数的最小值,可能是一个局部的最小值,也可能根本 ...

  3. 使用最小二乘法拟合由分段函数构成的广义贝塔分布的参数

    本文记录了用MATLAB中的lsqcurvefit函数拟合广义贝塔分布中的α和β参数的过程 广义贝塔分布的CDF(累积分布函数)如下: 其中l和r为偏离中心的程度,正规贝塔分布中没有l和r参数 而 即 ...

  4. python123计算分段函数_Python 专题四 python 科学计算

    一.目录 第1章 软件包的安装和介绍 1 11 Python简介 1 12 安装软件包 2 121 Python(x,y) 2 122 Enthought Python Distribution (E ...

  5. 分段函数是不是一定初等函数_查漏补缺问题64:一个含多参数分段函数的连续性与可导性讨论...

    一个含多参数分段函数的连续性与可导性讨论 题目: 设, 定义函数 (1) 讨论当满足什么条件时,函数在0点连续. (2) 讨论当满足什么条件时,函数在0点可导. (3) 讨论当满足什么条件时,函数的导 ...

  6. Java 求分段函数g(x)的值

    题目描述 输入一个实数x,按下列方式求分段函数g(x)的值,输出时保留2位小数. x的取值范围 g(x)的值X<-40 0.75X-40≤x≤20 x^2(x的平方)x>20 x-6 输入 ...

  7. matlab的多项式拟合,函数求导,画函数曲线

    给一列数据. 拟合出该数据的函数曲线.多项式拟合. 然后画出函数曲线来.以及给出函数形式. 求导. 再画出导数的曲线.以及给出导数函数形式. matlab代码: clc close all clear ...

  8. 塔菲尔曲线斜率的大小_分段函数函数值(自变量)大小(范围)的六种题型

    分段函数函数值(自变量)大小(范围)的六种题型     分段函数是高中数学函数中重要的一种,它能结合多种函数和多种性质一起考查.一种常见的考查方法是已知函数的解析式,求函数值的大小或自变量的值的大小( ...

  9. Mathtype写分段函数的方法

    安装了Mathtype,绑定了word和wps,可是怎么写分段函数呢? 方法在这里: 一.在MathType的左上角栅栏模板处选择左大括号 二.在右上角的矩阵模板出选择自己要使用的分区模板 三.分段输 ...

  10. 0046-简单的分段函数(二)

    题目 简单的分段函数(二) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知下列分段函数,要求编一程序,输入 x,输出相应的 ...

最新文章

  1. iOS11、iPhone X、Xcode9 适配指南
  2. 华为-yolo系列详解
  3. 【经典回放】多种语言系列数据结构算法:归并排序
  4. python导包路径问题_python的导包问题
  5. 20个正则表达式必知(前端开发)
  6. aehyok.com的成长之路一——开篇
  7. 没有任何一个行业是没有竞争的
  8. 开启Windows文件共享必须开启的两个服务
  9. TurboMail助某水利委员会邮件通讯更新换血
  10. Hookswork多帐户跨平台MT4跟单软件的十二大优势:
  11. 霍尔编码器和电机驱动L298N
  12. 实战演习(四)——网络流量系统分析简介
  13. Emacs配置管理框架Cabbage – 介绍
  14. 沉舟侧畔千帆过,病树前头万木春
  15. 智能新时代-不一样的人机交互体验
  16. MYSQL No space left on device
  17. 谷歌为iPhone推新版本语音电话软件 北京网游分级制度今年启动(每日关注2010.1.27)
  18. 从零开始学习opencv——在虚拟环境下安装opencv环境
  19. python大学课程-Coursera上Python课程(公开课)汇总
  20. 快讯|ONES 通过 CMMI 3 级评估认证

热门文章

  1. 论坛报名 | DataFunCon:用户画像论坛
  2. android banner 不轮播,使用Android Banner来设置一个轮播图
  3. SpringBoot+Vue 微信支付API V3
  4. 关于JavaScript(JS)
  5. 基于Nginx日志的自动封异常ip和解封脚本
  6. 浅释丹道筑基功―—―混元桩【转载】
  7. 论文阅读:Action Genome: Actions as Composition of Spatio-temporal Scene Graphs
  8. echarts饼图南丁格尔玫瑰图属性设置
  9. 韩信点兵python算法_韩信点兵算法
  10. 双人小游戏—五子棋(c语言)