一、Ceres简介

Ceres是一个最小二乘问题求解库,我们只需要定义待优化的问题,然后交给它计算即可。

① 基本概念
常用的最小二乘问题形式如下:

  • 参数块:x1x_1x1​, … xnx_nxn​等优化变量
  • 代价函数(残差块/误差项):fif_ifi​
  • 核函数:ρ(·),目标函数由许多平方项经过核函数求和自称

② 使用方法

  1. 定义每个参数块。参数块就是简单的向量,也可以是四元数、李代数等特殊的结构。
  2. 定义残差块的计算方式。残差块对参数块进行自定义计算,返回残差值,然后求平方和作为目标函数的值。
  3. 定义雅可比的计算方式。
  4. 把所有的参数块和残差块加入Ceres定义的Problem对象中,调用Solve函数求解

二、Ceres安装

首先下载Ceres的源代码

git clone https://github.com/ceres-solver/ceres-solver.git

安装ceres所需要的依赖

sudo apt install libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev

然后进入文件夹编译安装ceres,这里耗时比较久大概20min左右。

cd ceres-solver/
mkdir build
cd build
cmake ..
make
sudo make install

安装完成后,如果在/usr/local/include/ceres/目录下能找到Ceres的头文件,并且也有库文件/usr/local/lib/libceres.a,说明安装成功了,可以使用Ceres进行优化计算了。

ll /usr/local/include/ceres/
ll /usr/local/lib/libceres.a

三、使用Ceres拟合曲线

此示例程序依赖opencv、Eigen库,需要预先安装。

main.cpp文件代码程序如下:

#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;
};int main(int argc, char **argv) {//定义数据参数double ar = 1.0, br = 2.0, cr = 1.0;    //真实参数值double ae = 2.0, be = -1.0, ce = 5.0;   //估计参数值int N = 100;                            //数据点个数double w_sigma = 1.0;                   //噪声Sigma值double inv_sigma = 1.0 / w_sigma;cv::RNG rng;                            //随机数产生器//生成100个带高斯噪声的数据vector<double> x_data, y_data;for (int i = 0; i < N; i++){double x = i / 100.0;x_data.push_back(x);y_data.push_back(exp(ar * x * x + br * x + cr) + rng.gaussian(w_sigma * w_sigma));}double abc[3] = {ae, be, ce};//构建最小二乘问题ceres::Problem problem;for (int i = 0; i < N; i++){//添加误差项。使用自动求导,模板参数:误差类型、输出维度、输入维度、维数要与前面struct中一致problem.AddResidualBlock(new ceres::AutoDiffCostFunction<CURVE_FITTING_COST, 1, 3>(new CURVE_FITTING_COST(x_data[i], y_data[i])),nullptr,abc);//nullptr为核函数不使用为空,abc为待估计参数}//配置并运行求解器ceres::Solver::Options options;     //定义配置项options.linear_solver_type = ceres::DENSE_NORMAL_CHOLESKY;  //配置增量方程的解法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() << "s." << endl;  //输出求解耗时cout << summary.BriefReport() << endl;  //输出简要优化信息cout << "estimated a, b, c = ";for (auto a:abc)    //输出优化变量cout << a << " ";cout << endl;return 0;
}

CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.20)
project(ceresCurveFitting)
set(CMAKE_CXX_STANDARD 14)# OpenCV库
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})# Ceres库
find_package(Ceres REQUIRED)
include_directories(${CERES_INCLUDE_DIRS})# Eigen库
include_directories("/usr/include/eigen3")# 定义可执行文件
add_executable(ceresCurveFitting main.cpp)# 链接库
target_link_libraries(ceresCurveFitting ${OpenCV_LIBS})
target_link_libraries(ceresCurveFitting ${CERES_LIBRARIES})

【Ceres基本使用方法】使用Ceres拟合曲线求解最小二乘问题相关推荐

  1. 奇异值分解(SVD)方法求解最小二乘问题

    奇异值分解(SVD)方法求解最小二乘问题 1 奇异值分解(SVD)原理 1.1 回顾特征值和特征向量 1.2 SVD的定义 1.3 求出SVD分解后的U,Σ,V矩阵 1.4 SVD的一些性质 2 线性 ...

  2. 【数学建模】基于随机机会约束规划方法对旅行商问题TSP求解

    前言 旅行商问题(Traveling Salesman Problem, abbr. TSP)是一个典型的组合优化难题,属于 NP 难题,在交通运输.管道铺设.路线选择等很多领域具有广泛应用,对这个问 ...

  3. Newmark方法和中心差分法求解单自由度时程曲线

    首先通过地震波绘制反应谱,随后根据周期为1s时的加速度反应谱值对地震加速度进行调幅,随后进行计算得到结构的位移时程曲线,速度时程曲线以及加速度反应谱 import numpy as np import ...

  4. matlab割平面方法程序,用割平面法求解整数规划问题max z=x1 x2, s.t.-x1 x2

    用lingo求解0-1整数规划的程序? min=x1+x2+x3;x1+x2>1;x2+x3>1;@bin(x1);@bin(x2);@bin(x3); Lingo求解0-1规划的问题 l ...

  5. c语言编程欧拉方法求近似值,欧拉法求解已知初值微分方程解

    1.原理 数值积分算法是求解知初值的微分方程的重要方法. 如已知微分方程 d(y)/d(t) = f(y, t) y(t0) = y0 方程两边对t积分就会有 此式表示原函数t1时刻的解y(t1)为原 ...

  6. ceres m_Ceres M游戏下载-Ceres M精灵纪元安卓版v1.1.27 - 起点软件园

    Ceres M是一款特色非常明显的西方魔幻RPG游戏,游戏中玩家将可以选择自己喜欢的英雄角色进行冒险,在这个拥有魔法能量的世界,你可以释放各种各样华丽炫酷的技能,丰富多样的玩法在等着你来开启,还在等什 ...

  7. ceres m_Ceres M游戏下载-Ceres M手游官网版下载v1.1.27-模拟MAX

    Ceres M是精灵世界的策略战争,不需要自己亲自上阵,现在起就是卡牌套路的合集,先当然是把这片区域可以拿到的资源和卡牌都全部拿到,没有放弃的理由,画风是日韩的特色的,不过在技能方面其实没有太大的区别 ...

  8. 《JAVA练习题目5》 请在类中定义计算阶乘的方法完成本题目的求解

    训练要点:类中的方法应该如何编写和调用.(10分) 题目内容: 输入一个10以内的整数n,计算1!+2!+-+n!的值,并输出该值. 输入格式: 10以内的一个整数 输出格式: 代表计算结果的一个整数 ...

  9. Eigen密集矩阵求解 2 - 求解最小二乘系统

    简介 本篇介绍如何使用Eigen求解线性最小二乘系统. 一个系统可能无精确的解,比如Ax=b的线性方程式,不存在解.这时,找到一个最接近的解x,使得偏差Ax-b尽可能地小,能够满足误差要求error- ...

最新文章

  1. socket与TcpListener/TcpClient/UdpClient 的区别及联系
  2. 2018全球技术展望报告
  3. CTFshow 信息收集 web5
  4. JVM中GC对象配置
  5. html js绑定键盘按键触发事件(按回车键登陆)
  6. publiccms实现多层级选项卡效果
  7. Apache服务配置
  8. jquery-通过按钮控制模态的显示与隐藏
  9. 视觉SLAM笔记(4) SLAM的数学表述
  10. 将xml转为txt_HZ文章转短视频工具v1.0 快速将文章转为短视频 自动配音 配字幕 配图...
  11. 免费真实增加网站访问量的方法
  12. 最简单的三极管音频放大电路
  13. 基于ATtiny85制作MIDI数字音乐盒
  14. 科幻作文关于计算机,智能科幻作文范文
  15. Faster R-CNN详解
  16. 马虎词汇教程21-25(转载)
  17. 用汇编语言编程的计算机
  18. myisam和innodb区别
  19. python抢票软件哪个好_买票回家难?软件加速包也无用?看我用python轻松抢票回家!...
  20. Python单元测试、Python文档测试

热门文章

  1. self.modules() 和 self.children()的区别
  2. C++新手入门学习笔记(跟着敲)
  3. [机器学习] 混淆矩阵和kappa系数
  4. numpy与线性代数(简易版)
  5. wget 和scp对比_curl与wget区别
  6. Contiki源码+原理+功能+编程+移植+驱动+网络(转)
  7. 刷题总结——Tree2cycle(hdu4714 树形dp)
  8. Spark修炼之道(基础篇)——Linux大数据开发基础:第二节:Linux文件系统、文件夹(一)...
  9. vs2010编译curl为static库及测试
  10. 关于公司通过CMMI3级认证