C++最小二乘拟合 (高阶最小二乘拟合)(附C++代码)
配置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
矩阵。
准备数据
由于Python
的Matplotlib
库可以很好地可视化数据,所以选用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++代码)相关推荐
- C++最小二乘拟合 (高阶最小二乘拟合)(附C++代码)
配置Eigen矩阵运算库 后续计算需要利用矩阵运算来求解拟合系数,用到Eigen矩阵运算库,配置方法可自行搜索或MacOs可以参考Mac配置Eigen库进行配置. 拟合原理 以二次曲线拟合为例,拟合曲 ...
- C++最小二乘拟合 (高阶最小二乘拟合)
文章目录 原文链接: https://blog.csdn.net/weixin_44344462/article/details/88850409 https://blog.csdn.net/xsz5 ...
- 【台大郭彦甫】Matlab入门教程超详细学习笔记六:高阶绘图(附PPT链接)
高阶绘图 前言 一.进阶二维绘图 1. 对数图 2.一图双y轴 3. 直方图 4. 条形图 5. 饼状图 6. 极坐标图 7. 阶梯图与取样图 8. 箱线图以及误差线图 9. 填充图 二.配色 1.R ...
- 【lssvm预测】基于天鹰算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码
1 简介 短时交通流预测是实现智能交通控制与管理,交通流状态辨识和实时交通流诱导的前提及关键,也是智能化交通管理的客观需要.到目前为止,它的研究结果都不尽如人意.现有的以精确数学模型为基础的传统预测方 ...
- 基于MATLAB的B样条插值拟合算法与分段多项式(附完整代码)
一. B样条函数 B样条函数的MATLAB代码如下: S=spapi(k,x,y) %k为用户选定的B样条阶次,一般以4和5居多 例题1 分别用B样条函数对y和f(x)中的自选数据进行5次B样条函数拟 ...
- OpenCV椭圆拟合ellipse fitting的实例(附完整代码)
OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 #include &quo ...
- MATLAB中BP神经网络用于回归拟合算法实现(另附GRNN代码)
BP神经网络:是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络.神经网络是把生活中的常见情节推 ...
- 【回归预测-lssvm】基于粒子群算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 【lssvm回归预测】基于遗传算法优化最小二乘支持向量机GA-lssvm实现数据回归预测附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
最新文章
- thymeleaf+layui 展示table 报500
- crt证书linux使用,linux下使用openssl生成https的crt和key证书
- 单域名多php,php多域名单站点路由
- SQLSERVER中如何忽略索引提示
- linux5.5 dvd安装教程,linux 5.5 yum的安装方法(ftp)
- split逗号分割中文出现乱码java_Java中URL传中文时乱码的问题解决方案
- 读《构建之法》1-5章
- 【Foreign】采蘑菇 [点分治]
- akshare双均线backtrader
- 将Nginx添加到系统服务(使其可使用service命令控制)
- 基于微流域划分的洪水淹没分析
- Python Tkinter 音乐播放器 Demo
- 转:多玩网总裁李学凌:在腾讯阴影下
- dlna android电视,DLNA怎么用?DLNA连接智能电视和电脑的方法分享
- “剧情+综艺” 助推国潮文化破圈
- 【obs】转载:OBS直播严重延迟和卡顿怎么办?
- LAZADA四大行业最新趋势选品指南!菲律宾Bday大促活动报名
- 王爽 《汇编语言》之寄存器
- 桌面云、云桌面的区别
- 服务注册与发现(中)