说明,本文章的源代码来着于网络,本人已在实际项目中反复使用过,证明没问题。

1.简介

已知曲线上的n个点,可以使用某条曲线去拟合,使得整体上所有的点都逼近曲线,可以使用不同的角度去判断整体逼近,最小二乘法是使用偏差平方和最小的方式。

2.C语言实现

static void gauss_solve(int n,double A[],double x[],double b[]);double *tempx = NULL,*tempy = NULL,*sumxx = NULL,*sumxy = NULL,*ata = NULL;/*==================polyfit(n,x,y,poly_n,a)===================*/
/*=======拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
/*=====n是数据个数 xy是数据值 poly_n是多项式的项数======*/
/*===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====*/
void polyfit(int n,double x[],double y[],int poly_n,double p[])
{int i,j;//double *tempx,*tempy,*sumxx,*sumxy,*ata;#if   0tempx = (double *)calloc(n , sizeof(double));sumxx = (double *)calloc((poly_n*2+1) , sizeof(double));tempy = (double *)calloc(n , sizeof(double));sumxy = (double *)calloc((poly_n+1) , sizeof(double));ata = (double *)calloc( (poly_n+1)*(poly_n+1) , sizeof(double) );
#elsetempx = (double *) mymalloc( SRAMIN ,n*sizeof(double));sumxx = (double *) mymalloc( SRAMIN ,(poly_n*2+1)*sizeof(double));tempy = (double *) mymalloc( SRAMIN ,n*sizeof(double));sumxy = (double *) mymalloc( SRAMIN ,(poly_n+1)*sizeof(double));ata   = (double *) mymalloc( SRAMIN ,(poly_n+1)*(poly_n+1)*sizeof(double));
#endiffor (i=0;i<n;i++){tempx[i]=1;tempy[i]=y[i];}for (i=0;i<2*poly_n+1;i++){for (sumxx[i]=0,j=0;j<n;j++){sumxx[i]+=tempx[j];tempx[j]*=x[j];}}for (i=0;i<poly_n+1;i++){for (sumxy[i]=0,j=0;j<n;j++){sumxy[i]+=tempy[j];tempy[j]*=x[j];}}for (i=0;i<poly_n+1;i++){for (j=0;j<poly_n+1;j++){ata[i*(poly_n+1)+j]=sumxx[i+j];}}gauss_solve(poly_n+1,ata,p,sumxy);#if   0free(tempx);free(sumxx);free(tempy);free(sumxy);free(ata);
#else myfree( SRAMIN,tempx); myfree( SRAMIN,sumxx);myfree( SRAMIN,tempy);myfree( SRAMIN,sumxy);myfree( SRAMIN,ata);
#endif
}/*============================================================*/高斯消元法计算得到  n 次多项式的系数n: 系数的个数ata: 线性矩阵sumxy: 线性方程组的Y值p: 返回拟合的结果
/*============================================================*/
static void gauss_solve(int n,double A[],double x[],double b[])
{int i,j,k,r;double max;for (k=0;k<n-1;k++){max=fabs(A[k*n+k]);   // find maxmum r=k;for (i=k+1;i<n-1;i++){if (max<fabs(A[i*n+i])){max=fabs(A[i*n+i]);r=i;}}if (r!=k){for (i=0;i<n;i++)       //change array:A[k]&A[r]{max=A[k*n+i];A[k*n+i]=A[r*n+i];A[r*n+i]=max;}max=b[k];                    //change array:b[k]&b[r]b[k]=b[r];b[r]=max;}for (i=k+1;i<n;i++){for (j=k+1;j<n;j++)A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];b[i]-=A[i*n+k]*b[k]/A[k*n+k];}} for (i=n-1;i>=0;x[i]/=A[i*n+i],i--){for (j=i+1,x[i]=b[i];j<n;j++)x[i]-=A[i*n+j]*x[j];}
}

3 实验验证

使用VC验证:

int main(int argc, char* argv[])
{double P[6];double xx[4] = {27.5,32.5,37.5,42.5};double yy[4] = {1.2,0.8,0.6,0.4};// 拟合 y = p1*x^2 + p2*x + p3 // 特别注意这里是的顺序 !!!polyfit(4, xx, yy, 2, P);printf("y = %f*x^2 + %f*x + %f\r\n\r\n",P[2],P[1],P[0]);return 0;
}

输出结果:

这里我们为了验证准确性,我们使用matlab也拟合一遍,看结果是否一致。

xx = [27.5 32.5 37.5 42.5];
yy = [1.2 0.8 0.6 0.4];
plot(xx,yy);

图1 matlab曲线拟合

可以看到,最终matlab拟合的曲线和C语言运行拟合的曲线完全一致,另外本人在实际工程中也多次使用验证过没问题的。

最小二乘法实现曲线拟合相关推荐

  1. 最小二乘法多项式曲线拟合原理与实现--转

    原文地址:http://blog.csdn.net/jairuschan/article/details/7517773/ 概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过 ...

  2. 最小二乘法多项式曲线拟合数学原理及其C++实现

    目录 0 前言 1 最小二乘法概述 2 最小二乘法求解多项式曲线系数向量的数学推导 2.1 代数法 2.2 矩阵法 3 代码实现 4 总结 参考 0 前言 自动驾驶开发中经常涉及到多项式曲线拟合,本文 ...

  3. 最小二乘法多项式曲线拟合原理与实现

    概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x). 原理 [原理部分由个人根据互联网上的资料进行总结,希望对大家能有用] ...

  4. python最小二乘法拟合三维曲线_python_numpy最小二乘法的曲线拟合

    在了解了最小二乘法的基本原理之后python_numpy实用的最小二乘法理解,就可以用最小二乘法做曲线拟合了 1.直线拟合 直线拟合 已知图中拟合数据的坐标,对图中的拟合数据进行直线拟合. 依旧使用最 ...

  5. 最小二乘法多项式曲线拟合原理与实现(错误地方已经修改底层补充自己写的java实现)

    目录(?) [-] 概念 原理 运行前提 代码 运行效果 概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x). 原理 [原 ...

  6. c++ 三次多项式拟合_最小二乘法多项式曲线拟合数学原理及其C++实现

    本文使用 Zhihu On VSCode 创作并发布 0 前言 自动驾驶开发中经常涉及到多项式曲线拟合,本文详细描述了使用最小二乘法进行多项式曲线拟合的数学原理,通过样本集构造范德蒙德矩阵,将一元 N ...

  7. 最小二乘法多项式曲线拟合及其python实现

    最小二乘法多项式曲线拟合及其python实现 多项式曲线拟合问题描述 最小二乘法 针对overfitting,加入正则项 python实现 运行结果 多项式曲线拟合问题描述 问题描述:给定一些数据点, ...

  8. 最小二乘法进行曲线拟合

    工作需求,这里记录一下数值插值和数值分析方面的算法,希望和大家一起进步. 曲线拟合的最小二乘定义 求一条曲线,使数据点均在离此曲线的上方或下方不远处,所求的曲线称为拟合曲线, 它既能反映数据的总体分布 ...

  9. C#最小二乘法进行曲线拟合及相关系数

    两个类: 类1: using System; using System.Collections.Generic; using System.Linq; using System.Text; names ...

最新文章

  1. 图片的略小图图片不显示的处理方法
  2. FreeMarker手册pdf
  3. 轻松为Windows系统快速配置多个网关
  4. 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
  5. Spring 事务失效的 8 大场景,面试官直呼666...
  6. PC端与虚拟机内容拷贝
  7. 易观的大数据革命 分析师与机器人协同办公
  8. Python 获取 网卡 MAC 地址
  9. python安装教程-Python安装包+安装教程
  10. JDK8下载安装与Win10下Java环境变量配置
  11. Unity 抗锯齿方案梳理
  12. 用Node.js申请缓存buffer报DEP0005错误的解决方法
  13. JavaScript里面的“类”
  14. 【面试题】755- 104道 CSS 面试题,助你查漏补缺(上)
  15. 同济大学2022年计算机考研复试是什么时候
  16. /dev/mapper/vg_xxx-lv_root 100% 磁盘打满解决方式及思路
  17. Halcon视觉软件应该如何系统学习?
  18. Unity3D RPG角色扮演游戏源码(上下)-----源代码分析----03-----有完整的注释解释-----GUI_Menu.cs脚本
  19. springboot健身房管理系统
  20. 宁盾动态口令技术案例 - 运用动态令牌dKey T6加强ERP登录安全

热门文章

  1. 从成本分析,CSDN总部为什么选择长沙落户
  2. HRNet-C32-3D
  3. matlab之sub2ind()函数
  4. python图形化显示股票数据
  5. 前端面试题系列——css盒子模型
  6. 申宝正规股票市场分化较为严重
  7. Logback异常日志监控告警
  8. 不可识别的数据库格式
  9. ffmpeg 安装(支持h.265)
  10. 使用uni-app完成电商类小程序流程