当前位置: 首页 > news >正文

纯C++做多项式拟合

一、多项式拟合用途

当前有一组对应的x、y数据,希望通过这些数据点做出近似的多项式曲线:Y=···+nX^2+mX+c
其中多项式最高次数可调,返回各个参数及曲线的拟合度R^2

二、函数实现

参数中的order为设置的多项式最高次次数,coefficients为各次的系数

double polynomialFit(vector<double>& x, vector<double>& y, unsigned char order, vector<double>& coefficients){if (x.size() <= order || y.size() <= order) {return 0;}// 构建矩阵A和向量bint m = x.size();int n = order + 1;vector<vector<double>> A(n, vector<double>(n, 0));vector<double> b(n, 0);for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < m; k++) {A[i][j] += pow(x[k], i+j);}}for (int k = 0; k < m; k++) {b[i] += y[k] * pow(x[k], i);}}n = A.size();for (int i = 0; i < n; i++) {// 列主元素消去int maxRow = i;double maxVal = fabs(A[i][i]);for (int k = i + 1; k < n; k++) {if (fabs(A[k][i]) > maxVal) {maxVal = fabs(A[k][i]);maxRow = k;}}if (maxRow != i) {std::swap(A[i], A[maxRow]);std::swap(b[i], b[maxRow]);}// 消元过程for (int k = i + 1; k < n; k++) {double factor = A[k][i] / A[i][i];for (int j = i; j < n; j++) {A[k][j] -= factor * A[i][j];}b[k] -= factor * b[i];}}// 回代求解vector<double> result(n, 0);for (int i = n - 1; i >= 0; i--) {double temp = b[i];for (int j = i + 1; j < n; j++) {temp -= A[i][j] * result[j];}result[i] = temp / A[i][i];}coefficients = result;double SSR=0;double SST=0;double sumY = std::accumulate(std::begin(y),std::end(y),0.0);double avgY = sumY/y.size();for(uint16_t i=0;i<y.size();i++){double actY=0;for(unsigned char j=0;j<=order;j++){actY+=pow(x[i],j)*result[j];}SSR += pow(actY-y[i],2);SST += pow(y[i]-avgY,2);}double R = 1-SSR/SST;return R;
}

三、函数调用

vector<double> xs{0,0,0,0};
vector<double> selectX;
vector<double> selectY;
selectX.push_back(..);
...
selectY.push_back(..);
...
double R = polynomialFit(selectX,selectY,3,xs);
http://www.lryc.cn/news/359219.html

相关文章:

  • vulnhub靶场之FunBox-9
  • C# 变量与参数详解
  • CentOS7.9部署安装OpenGauss 5.0.2企业版
  • java基础-chapter15(io流)
  • mysql去除重复数据
  • MySQL基础索引知识【索引创建删除 | MyISAM InnoDB引擎原理认识】
  • SJ601-II垂直法阻燃性能测试仪
  • 瑞吉外卖项目学习笔记(二)后台系统的员工管理业务开发
  • Unity OutLine 模型外描边效果
  • CRLF注入漏洞
  • 理解接口回调及其在 RabbitMQ 中的实际运用
  • 大模型日报2024-05-31
  • HarmonyOS 鸿蒙DevEco:导入无法运行提示Sync failed
  • kafka的安装
  • 代码随想录算法训练营第36期DAY45
  • springboot+vue 社区养老服务系统
  • AI 赋能前端 -- 文本内容概要生成
  • orin部署tensorrt、cuda、cudnn、pytorch、onnx
  • 使用javacv对摄像头视频转码并实现播放
  • Linux网络-Socket套接字_Windows与Linux端双平台基于Udp传输协议进行多线程跨平台的服务器与客户端网络通信的简易聊天室实现
  • 20分钟快速入门SQL
  • 汇总区间,合并区间
  • Web程序设计-实验05 DOM与BOM编程
  • Window系统安装Docker
  • RabbitMQ不完整的笔记
  • 微软Edge浏览器深度解析:功能、同步、隐私与安全
  • 网络性能测试工具:iperf3介绍
  • scp:Linux系统本地与远程文件传输命令
  • python基础(习题、资料)
  • shell脚本免交互