ceres拟合分段函数
假设优化函数为:
真实值: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拟合分段函数相关推荐
- 用python画分段函数图像_使用Python拟合分段函数
我试图用Numpy来拟合分段函数和绝对值.在 数学函数是 x<:p[1]:y=1+p[0]*abs((size+x-p[1])/size-size/2) x>:=p[1]:y= ...
- matlab可以拟合分段函数吗,如何用matlab拟合出分段函数
你要知道,你要拟合的是一个分段函数,这本身就不是一般的连续光滑函数. nlinfit之所以要有初值这一项,就是考虑到在某些变态的情况下,无法找到最小二乘函数的最小值,可能是一个局部的最小值,也可能根本 ...
- 使用最小二乘法拟合由分段函数构成的广义贝塔分布的参数
本文记录了用MATLAB中的lsqcurvefit函数拟合广义贝塔分布中的α和β参数的过程 广义贝塔分布的CDF(累积分布函数)如下: 其中l和r为偏离中心的程度,正规贝塔分布中没有l和r参数 而 即 ...
- python123计算分段函数_Python 专题四 python 科学计算
一.目录 第1章 软件包的安装和介绍 1 11 Python简介 1 12 安装软件包 2 121 Python(x,y) 2 122 Enthought Python Distribution (E ...
- 分段函数是不是一定初等函数_查漏补缺问题64:一个含多参数分段函数的连续性与可导性讨论...
一个含多参数分段函数的连续性与可导性讨论 题目: 设, 定义函数 (1) 讨论当满足什么条件时,函数在0点连续. (2) 讨论当满足什么条件时,函数在0点可导. (3) 讨论当满足什么条件时,函数的导 ...
- Java 求分段函数g(x)的值
题目描述 输入一个实数x,按下列方式求分段函数g(x)的值,输出时保留2位小数. x的取值范围 g(x)的值X<-40 0.75X-40≤x≤20 x^2(x的平方)x>20 x-6 输入 ...
- matlab的多项式拟合,函数求导,画函数曲线
给一列数据. 拟合出该数据的函数曲线.多项式拟合. 然后画出函数曲线来.以及给出函数形式. 求导. 再画出导数的曲线.以及给出导数函数形式. matlab代码: clc close all clear ...
- 塔菲尔曲线斜率的大小_分段函数函数值(自变量)大小(范围)的六种题型
分段函数函数值(自变量)大小(范围)的六种题型 分段函数是高中数学函数中重要的一种,它能结合多种函数和多种性质一起考查.一种常见的考查方法是已知函数的解析式,求函数值的大小或自变量的值的大小( ...
- Mathtype写分段函数的方法
安装了Mathtype,绑定了word和wps,可是怎么写分段函数呢? 方法在这里: 一.在MathType的左上角栅栏模板处选择左大括号 二.在右上角的矩阵模板出选择自己要使用的分区模板 三.分段输 ...
- 0046-简单的分段函数(二)
题目 简单的分段函数(二) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知下列分段函数,要求编一程序,输入 x,输出相应的 ...
最新文章
- iOS11、iPhone X、Xcode9 适配指南
- 华为-yolo系列详解
- 【经典回放】多种语言系列数据结构算法:归并排序
- python导包路径问题_python的导包问题
- 20个正则表达式必知(前端开发)
- aehyok.com的成长之路一——开篇
- 没有任何一个行业是没有竞争的
- 开启Windows文件共享必须开启的两个服务
- TurboMail助某水利委员会邮件通讯更新换血
- Hookswork多帐户跨平台MT4跟单软件的十二大优势:
- 霍尔编码器和电机驱动L298N
- 实战演习(四)——网络流量系统分析简介
- Emacs配置管理框架Cabbage – 介绍
- 沉舟侧畔千帆过,病树前头万木春
- 智能新时代-不一样的人机交互体验
- MYSQL No space left on device
- 谷歌为iPhone推新版本语音电话软件 北京网游分级制度今年启动(每日关注2010.1.27)
- 从零开始学习opencv——在虚拟环境下安装opencv环境
- python大学课程-Coursera上Python课程(公开课)汇总
- 快讯|ONES 通过 CMMI 3 级评估认证
热门文章
- 论坛报名 | DataFunCon:用户画像论坛
- android banner 不轮播,使用Android Banner来设置一个轮播图
- SpringBoot+Vue 微信支付API V3
- 关于JavaScript(JS)
- 基于Nginx日志的自动封异常ip和解封脚本
- 浅释丹道筑基功―—―混元桩【转载】
- 论文阅读:Action Genome: Actions as Composition of Spatio-temporal Scene Graphs
- echarts饼图南丁格尔玫瑰图属性设置
- 韩信点兵python算法_韩信点兵算法
- 双人小游戏—五子棋(c语言)