配置Eigen矩阵运算库

后续计算需要利用矩阵运算来求解拟合系数,用到Eigen矩阵运算库,配置方法可自行搜索或MacOs可以参考Mac配置Eigen库进行配置。

拟合原理

以二次曲线拟合为例,拟合曲线应满足以下方程:

a∗X2+b∗X+c=ya*X^2 + b*X + c = ya∗X2+b∗X+c=y

如要要拟合的4个点为:

(3, 6)

(5, 8)

(6, 12)

(7, 4)

则有:

即有:

AW=BA W = BAW=B

ATAW=ATBA^TAW = A^TBATAW=ATB

(ATA)−1ATAW=(ATA)−1ATB(A^TA)^ {-1}A^TAW = (A^TA)^{-1}A^TB(ATA)−1ATAW=(ATA)−1ATB

W=(ATA)−1ATBW = (A^TA)^{-1}A^TBW=(ATA)−1ATB

由上面最后一个等式利用矩阵的转置与求逆,则可以得出其拟合曲线的系数W矩阵。

准备数据

由于PythonMatplotlib库可以很好地可视化数据,所以选用Python来生成数据文件——points.txt

代码如下,程序中设置的系数为a = 2.2, b = 1.4, c = -1.3

import numpy as np
import matplotlib.pyplot as plt# 设置点数
num = 100# 设置噪声系数
rate = 0# 生成数据
x = np.linspace(-10, 10, num)
y = []
a = 2.2
b = 1.4
c = -1.3for i in x:noise = np.random.random()temp = i + noise * ratey.append(a * pow(temp, 2) + b * temp + c)# 绘制曲线
plt.plot(x, y)
plt.show()# 写入文件
with open("./points.txt", 'w') as f:for i in range(num):f.write(str(x[i]))f.write("\t")f.write(str(y[i]))f.write("\n")

曲线为:

程序会在当前目录下生成points.txt文件。

C++最小二乘拟合代码

以下代码理论上可以完成N阶的曲线拟合,需要对参数N进行设置,并提供正确的数据点。

#include <Eigen/Core>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/Eigenvalues>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>using namespace std;int main() {// txt点数据文件路径const string fileName = "./points.txt";// 设置是几次拟合const int N = 2;// 创建两个vectorvector<float> x, y;// 读取文件ifstream f(fileName);if (!f) {cout << "数据文件打开失败" << endl;exit(EXIT_FAILURE);}float tempx, tempy;while (f >> tempx >> tempy) {x.push_back(tempx);y.push_back(tempy);}if (x.size() != y.size()) {cout << "数据文件内容有误" << endl;exit(EXIT_FAILURE);}// 创建A矩阵Eigen::MatrixXd A(x.size(), N + 1);for (unsigned int i = 0; i < x.size(); ++i) {  // 遍历所有点for (int n = N, dex = 0; n >= 1; --n, ++dex) {  // 遍历N到1阶A(i, dex) = pow(x[i], n);}A(i, N) = 1;  //}// 创建B矩阵Eigen::MatrixXd B(y.size(), 1);for (unsigned int i = 0; i < y.size(); ++i) {B(i, 0) = y[i];}// 创建矩阵WEigen::MatrixXd W;W = (A.transpose() * A).inverse() * A.transpose() * B;// 打印W结果cout << W << endl;
}

结果

程序输出为

2.2
1.4
-1.3

与设置的系数相吻合,但这是建立在噪声为0的情况下的结果,想要体验不同噪声对拟合结果的朋友可以在给出的Python程序中对rate参数进行修改。

C++最小二乘拟合 (高阶最小二乘拟合)(附C++代码)相关推荐

  1. C++最小二乘拟合 (高阶最小二乘拟合)(附C++代码)

    配置Eigen矩阵运算库 后续计算需要利用矩阵运算来求解拟合系数,用到Eigen矩阵运算库,配置方法可自行搜索或MacOs可以参考Mac配置Eigen库进行配置. 拟合原理 以二次曲线拟合为例,拟合曲 ...

  2. C++最小二乘拟合 (高阶最小二乘拟合)

    文章目录 原文链接: https://blog.csdn.net/weixin_44344462/article/details/88850409 https://blog.csdn.net/xsz5 ...

  3. 【台大郭彦甫】Matlab入门教程超详细学习笔记六:高阶绘图(附PPT链接)

    高阶绘图 前言 一.进阶二维绘图 1. 对数图 2.一图双y轴 3. 直方图 4. 条形图 5. 饼状图 6. 极坐标图 7. 阶梯图与取样图 8. 箱线图以及误差线图 9. 填充图 二.配色 1.R ...

  4. 【lssvm预测】基于天鹰算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码

    1 简介 短时交通流预测是实现智能交通控制与管理,交通流状态辨识和实时交通流诱导的前提及关键,也是智能化交通管理的客观需要.到目前为止,它的研究结果都不尽如人意.现有的以精确数学模型为基础的传统预测方 ...

  5. 基于MATLAB的B样条插值拟合算法与分段多项式(附完整代码)

    一. B样条函数 B样条函数的MATLAB代码如下: S=spapi(k,x,y) %k为用户选定的B样条阶次,一般以4和5居多 例题1 分别用B样条函数对y和f(x)中的自选数据进行5次B样条函数拟 ...

  6. OpenCV椭圆拟合ellipse fitting的实例(附完整代码)

    OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 #include &quo ...

  7. MATLAB中BP神经网络用于回归拟合算法实现(另附GRNN代码)

    BP神经网络:是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络.神经网络是把生活中的常见情节推 ...

  8. 【回归预测-lssvm】基于粒子群算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  9. 【lssvm回归预测】基于遗传算法优化最小二乘支持向量机GA-lssvm实现数据回归预测附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

最新文章

  1. thymeleaf+layui 展示table 报500
  2. crt证书linux使用,linux下使用openssl生成https的crt和key证书
  3. 单域名多php,php多域名单站点路由
  4. SQLSERVER中如何忽略索引提示
  5. linux5.5 dvd安装教程,linux 5.5 yum的安装方法(ftp)
  6. split逗号分割中文出现乱码java_Java中URL传中文时乱码的问题解决方案
  7. 读《构建之法》1-5章
  8. 【Foreign】采蘑菇 [点分治]
  9. akshare双均线backtrader
  10. 将Nginx添加到系统服务(使其可使用service命令控制)
  11. 基于微流域划分的洪水淹没分析
  12. Python Tkinter 音乐播放器 Demo
  13. 转:多玩网总裁李学凌:在腾讯阴影下
  14. dlna android电视,DLNA怎么用?DLNA连接智能电视和电脑的方法分享
  15. “剧情+综艺” 助推国潮文化破圈
  16. 【obs】转载:OBS直播严重延迟和卡顿怎么办?
  17. LAZADA四大行业最新趋势选品指南!菲律宾Bday大促活动报名
  18. 王爽 《汇编语言》之寄存器
  19. 桌面云、云桌面的区别
  20. 服务注册与发现(中)

热门文章

  1. 优秀的程序员热爱偷懒
  2. 电子商务网站功能模块汇总
  3. python自动化:实现自动回复QQ消息
  4. win下vscode无法激活conda环境
  5. 回想2020,仿佛就在昨天
  6. 广义相对论基础【1】狭义相对论中的张量
  7. android 日历动态图标,Android 日历action_search ActionBar更改home图标
  8. Crypress68013开发笔记
  9. 1326 银行存款输出
  10. 计算机教师上机守则,微机室教师守则.docx