高斯牛顿法求非线性最小二乘的步骤和c++代码实现

2023-11-15

slam图优化的本质是一个非线性优化问题.

Gauss-Newton求解步骤:

1 线性化误差函数:

2 构建线性系统:

 

3 求解线性系统:

4 更新解,并不断迭代直至收敛:

一个简单的代码实现:

一维参数xy,高维变为对应的矩阵即可.

#include <iostream>
#include <opencv2/opencv.hpp>
#include <Eigen/Core>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

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;                                 // OpenCV随机数产生器
  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));
  }
  
  // 开始Gauss-Newton迭代
  int iterations = 100;    // 迭代次数
  double cost = 0, lastCost = 0;  // 本次迭代的cost和上一次迭代的cost
  
  for (int iter = 0; iter < iterations; iter++) {
    Matrix3d H = Matrix3d::Zero();             // Hessian = J^T W^{-1} J in Gauss-Newton
    Vector3d b = Vector3d::Zero();             // bias
    cost = 0;
    for (int i = 0; i < N; i++) {
      double xi = x_data[i], yi = y_data[i];  // 第i个数据点
      double error = yi - exp(ae * xi * xi + be * xi + ce);
      Vector3d J; // 雅可比矩阵
      J[0] = xi * xi * exp(ae * xi * xi + be * xi + ce);  // de/dae
      J[1] = xi * exp(ae * xi * xi + be * xi + ce);  // de/dbe
      J[2] = exp(ae * xi * xi + be * xi + ce);  // de/dce
      H += inv_sigma * inv_sigma * J * J.transpose();
      b += inv_sigma * inv_sigma * error * J;
      cost += error * error;       // 累加数据的误差二范数
    }
 
    // 求解线性方程 Hx=b
    Vector3d dx = H.ldlt().solve(b);
    // 无效解
    if (isnan(dx[0])) {
      cout << "result is nan!" << endl;
      break;
    }
    // 迭代值变大,则终止迭代
    if (iter > 0 && cost >= lastCost) {
      cout << "cost: " << cost << ">= last cost: " << lastCost << ", break." << endl;
      break;
    }
    // 更新解
    ae += dx[0];
    be += dx[1];
    ce += dx[2];
    lastCost = cost;
    // 记录迭代过程
    cout << "total cost: " << cost << ", \t\tupdate: " << dx.transpose() <<
         "\t\testimated params: " << ae << "," << be << "," << ce << endl;
  }
  cout << "estimated abc = " << ae << ", " << be << ", " << ce << endl;
  return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高斯牛顿法求非线性最小二乘的步骤和c++代码实现 的相关文章

  • C++11 constexpr简单用法

    关键字 constexpr 是C 11中引入的关键字 声明为constexpr类型的变量 编译器会验证该变量的值是否是一个常量表达式 声明为constexpr的变量一定是一个常量 而且必须用常量表达式初始化 constexpr int mf

随机推荐

  • 如何使用GPT-4:一步步指南

    人工智能技术的发展 让自然语言处理成为了一个备受关注的领域 其中 GPT 4是当今最先进的自然语言处理模型之一 本文将详细介绍如何使用GPT 4进行自然语言生成 第一步 了解GPT 4 GPT 4是由OpenAI开发的自然语言处理模型 它采
  • Linux笔记--Shell编程入门

    查看当前环境下使用的shell 可以使用 echo SHELL 运行shell shell脚本是纯文本文件 通常以 sh作为后缀名 方便系统识别文件类型 但不是必需的 脚本文件中的第一行要指明系统使用哪种shell解释该shell文件 如
  • 计算机不显示桌面文件夹,电脑保存文件路径不显示桌面怎么办

    摘要 腾兴网为您分享 电脑保存文件路径不显示桌面怎么办 掌上电力 信达期货 小米手环 天翼购等软件知识 以及晒课网 国寿e门店 鼠标同步器 奇人怪事之谜 江西农村信用社 e视网 三星3200打印机驱动 超级人脉 晒黑的图片 烟花flash
  • kettle案例11-排序记录

    参考 ETL数据整合与处理 任务3 1 排序是对数据中心的无序记录 按照自然或客观规律 根据关键字段大小递增或递减的次序 对记录重新排列的过程 为了得出学生的成绩排名 需要对 2019年11月月考数学成绩 xls 文件 使用 排序记录 组件
  • JavaWeb图表插件的小研究

    背景 最近的一个项目中 对数据的统计分析有很大的要求 这就要求有一款很强大的报表 图表插件 因此 组长给分了任务 让我们各自去研究不同的图表插件 用了一两天的时间 对java这块的图表插件做了一个简单的研究 java方向的图报表还是有很多很
  • 小熊派BearPi-HM nano开发板 -- 前期准备

    课前准备 1 小熊派BearPi HM nano开发板 2 E53农业案例拓展版 3 学习资料 Ubuntu20 04版本 学习视频 学习课件 案例等等 安装教程 Ubuntu20 04安装及配置 开发环境Windows和Ubuntu的配置
  • STM32CubeMX ADC采样的坑

    1 选用了ADC1 IN15 ADC1 IN16 ADC1 IN17 ADC1 IN18会发现有的通道不能用 解决方法 把Sequencer设置为not fully configurable 这样子的弊端是无法再设置采样的先后优先级 但是
  • NBIOT模块连接巴法云实践(SIM7020)

    使用NBIOTSIM7020模块连接巴法云并进行数据通信 一 前期准备 1 巴法云新建主题 这里使用TCP协议 因此创建TCP设备云 2 模块 使用前焊接好模块天线 3 SIM卡 物联专用卡 4 USB UART接口 5 杜邦线4根 6 串
  • Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

    文章目录 一 企业镜像源 1 阿里云 2 网易163 3 搜狐镜像 4 华为 二 高校镜像源 1 清华源 2 北京大学 3 中国科学技术大学源 USTC 4 上海交通大学 5 山东大学 6 吉林大学开源镜像站 7 哈尔滨工业大学开源镜像站
  • 像素鸟 代码 html,2021-04-05像素鸟代码

    html gt Document margin 0 padding 0 game width 800px height 600px background url images sky png position relative overfl
  • umi页面跳转定位问题

    突然发现 在umi页面中 如果没有设置页面定位 那么在页面中部或者底部点击跳转到下一页 会默认跳转到该页面对应的中部或者下部的位置 那么 如果想要在跳转时 直接定位到页面的头部 应该怎么做呢 首先 确定需求 目前项目的需求是 无论从上一页的
  • Access&Trunk&单臂路由

    一 实验要求 要求 1 pc1属于vlan10 配置静态IP地址192 168 1 2 24 2 pC2属于vlan20 配置静态IP地址192 168 2 2 24 3 LSw1交换机上配置PC1和PC2的网关地址 分别为192 168
  • 免费版对象存储【minIO】CentOS部署实践记录 2021

    之前一直用的七牛 不过是收费的 然后有些定制化需求 可能比较看重预算 然后就有了这篇开源方式 minio 一 简介 官方文档 http docs minio org cn docs MinIO 是一个基于Apache License v2
  • react打包成html5,create-react-app项目打包相关问题

    Q1 yarn build打包生成的文件直接点击index html报错 打不开 导致的问题是yarn build打包生成的文件部署到服务器时只能在服务器根目录 如果在其他文件夹里面会报错 A1 默认情况下 index html中引入js和
  • XSS-5注入靶场闯关(小游戏)——第五关

    一 首先先尝试 查看源代码 可以看到 他前面有一个引号 并且
  • 做出刷屏文字的6大哲学

    title 做出刷屏文字的6大哲学 date 2019 09 05 23 39 16 tags 刷屏 文字 哲学 published true hideInList false feature https s2 ax1x com 2019
  • 遥感影像语义分割论文笔记(二)Category Boundary Detection Network

    A semantic segmentation method with category boundary for Land Use and Land Cover LULC mapping of Very High Resolution V
  • 配置 gitlab https 访问

    文章目录 1 备份 2 生成SSL证书 3 配置文件 4 重启 5 访问 1 备份 docker exec ti gitlab ce gitlab rake gitlab backup create 2 生成SSL证书 yum instal
  • 药物 3D 打印新突破:圣地亚哥大学用机器学习筛选喷墨打印生物墨水,准确率高达 97.22%

    内容一览 药物喷墨打印是一种高度灵活和智能化的制药方式 据相关报告统计 该领域市场规模将在不久的未来呈现指数级增长 过往 筛选合适生物墨水的方法费时且费力 因此也成为药物喷墨打印领域面临的主要挑战之一 为解决这一问题 国际药剂学期刊 Int
  • 高斯牛顿法求非线性最小二乘的步骤和c++代码实现

    slam图优化的本质是一个非线性优化问题 Gauss Newton求解步骤 1 线性化误差函数 2 构建线性系统 3 求解线性系统 4 更新解 并不断迭代直至收敛 一个简单的代码实现 一维参数xy 高维变为对应的矩阵即可 include