最小二乘法三次多项式曲线拟合 算法 C++ 实现,该怎么处理

如题所述

/******************************************
//参考 ã€Šå¸¸ç”¨ç®—法程序集 ï¼ˆC语言描述 ç¬¬ä¸‰ç‰ˆ)》
 
//最小二乘法
//x[n] y[n] å·²çŸ¥è¾“å…¥
//n输入点个数
//a[m] è¿”回m-1次拟合多项式的m个系数
//m  æ‹Ÿåˆå¤šé¡¹å¼çš„项数,即拟合多项式的最高次为m-1
//dt[3] dt[0]返回拟合多项式与各数据点误差的平方和,
        dt[1]返回拟合多项式与各数据点误差的绝对值之和
        dt[2]返回拟合多项式与各数据点误差的绝对值的最大值
 
//
//拟合多项式的输出
//Y(x) = a0 + a1(x-X) + a2(x-X)^2 + â€¦â€¦ am(x-X)^m
// å…¶ä¸­X为已知点x的平均值
******************************************/
 
#include "math.h"
void pir1(x,y,n,a,m,dt)
int n,m;
double x[],y[],a[],dt[];

  int i,j,k;
  double z,p,c,g,q,d1,d2,s[20],t[20],b[20];
  for (i=0; i<=m-1; i++) a[i]=0.0;
  if (m>n) m=n;
  if (m>20) m=20;
  z=0.0;
  for (i=0; i<=n-1; i++) z=z+x[i]/(1.0*n);
  b[0]=1.0; d1=1.0*n; p=0.0; c=0.0;
  for (i=0; i<=n-1; i++)
  { p=p+(x[i]-z); c=c+y[i];}
  c=c/d1; p=p/d1;
  a[0]=c*b[0];
  if (m>1)
  { t[1]=1.0; t[0]=-p;
  d2=0.0; c=0.0; g=0.0;
  for (i=0; i<=n-1; i++)
  { q=x[i]-z-p; d2=d2+q*q;
  c=c+y[i]*q;
  g=g+(x[i]-z)*q*q;
  }
  c=c/d2; p=g/d2; q=d2/d1;
  d1=d2;
  a[1]=c*t[1]; a[0]=c*t[0]+a[0];
  }
  for (j=2; j<=m-1; j++)
  { s[j]=t[j-1];
  s[j-1]=-p*t[j-1]+t[j-2];
  if (j>=3)
    for (k=j-2; k>=1; k--)
      s[k]=-p*t[k]+t[k-1]-q*b[k];
    s[0]=-p*t[0]-q*b[0];
    d2=0.0; c=0.0; g=0.0;
    for (i=0; i<=n-1; i++)
    { q=s[j];
    for (k=j-1; k>=0; k--)
      q=q*(x[i]-z)+s[k];
    d2=d2+q*q; c=c+y[i]*q;
    g=g+(x[i]-z)*q*q;
    }
    c=c/d2; p=g/d2; q=d2/d1;
    d1=d2;
    a[j]=c*s[j]; t[j]=s[j];
    for (k=j-1; k>=0; k--)
    { a[k]=c*s[k]+a[k];
    b[k]=t[k]; t[k]=s[k];
    }
  }
  dt[0]=0.0; dt[1]=0.0; dt[2]=0.0;
  for (i=0; i<=n-1; i++)
  { q=a[m-1];
  for (k=m-2; k>=0; k--)
    q=a[k]+q*(x[i]-z);
  p=q-y[i];
  if (fabs(p)>dt[2]) dt[2]=fabs(p);
  dt[0]=dt[0]+p*p;
  dt[1]=dt[1]+fabs(p);
  }
  return;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

基于最小二乘法的多项式曲线拟合:从原理到c++实现
首先,介绍最小二乘法原理以及多项式拟合方法的两种实现方式:代数方式和矩阵方式。代数方式涉及求解多项式系数的公式推导,矩阵方式利用矩阵运算简化求解过程。接着,基于OpenCV库,以C++语言编写代码实现这两种方法。最后,通过一个完整的示例展示如何通过离散点集拟合出一条多项式曲线。代数方式求解过程中,首先...

求C或C++语言编写的用最小二乘法进行曲线拟合
Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3)\/\/(x,y,a,n,m,dt1,dt2,dt3 )\/\/double *x; \/*实型一维数组,输入参数,存放节点的xi值*\/ \/\/double *y; \/*实型一维数组,输入参数,存放节点的yi值*\/ \/\/double *a; \/*双精度实型一维...

怎么用C语言实现最小二乘法?
最小二乘法常用于根据实测数据求线性方程的最近似解。根据如图(图片引用于百度百科)的描述,利用C语言求,使用最小二乘法算法求线性方程的解,程序如下:include <stdio.h>#define N 4 \/\/共有4个记录,根据需要增加记录typedef struct Data{ \/\/定义实验记录结构 int w; \/\/实验次数 double x; ...

最小二乘法三次多项式曲线拟合 算法 MFC实现的 急用 万分感激
先求解一个 最小二乘问题 ,即解一个 超定方程组 (得到 三次曲线 系数)再用MFC中的画图函数离散的画出这个三次曲线(注意MFC中的坐标是矩阵坐标,也就是说原点位于左上角)

C++给定曲线方程,如何进行拟合(最小二乘法)
根据公式,计算离差平方和 分别对 k和d求导,令二者等于0,得到k和d的值 3. 如果是用程序实现,可以参照运筹学中的极值问题求解

C++ 最小二乘法
Save[1][2]+=x[i];Save[1][3]+=y[i];Save[2][1]+=x[i];Save[2][2]+=x[i]*x[i];Save[2][3]+=x[i]*y[i];} cout<<"最小二乘法计算矩阵如下:"<<endl;for(i=1;i<=2;i++){ for(j=1;j<=3;j++){ cout<<setiosflags(ios::fixed)<<setprecision(6)<<setw(...

最小二乘法数据拟合算法设计,用c或者c++编程出来,急!!!
void Guass(int n,float Array[][10]){ float s,u;int i,j,k,a,x,y;for(i=0;i<n-1;i++){ s=Array[i][i];k=i;for(a=i+1;a<n;a++){ if(fabs(s) < fabs(Array[a][i])){ s=Array[a][i];k=a;} } if(k!=i){ for(j=i;j<n+1;j++){ u=Array[i][j...

最小二乘法多项式曲线拟合原理与实现
1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小 3.使偏差平方和最小 按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为 最小二乘法 。Python运行环境与编辑环境; Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot命令类似,而且用法也基本相同。

excel中曲线拟合是什么算法excel中曲线拟合是什么算法类型
Excel中的曲线拟合算法主要基于最小二乘法,可以拟合多种类型的函数,包括线性、指数、幂、多项式等。该功能通过添加趋势线来实现。尽管此方法可以进行简单的函数拟合,但其缺陷是只能拟合预设模板的几种函数。此外,Excel在进行曲线拟合时,仅能根据数据生成拟合公式和R平方值。Excel中曲线拟合使用的是最...

Excel曲线拟合、回归分析方法研究分享
`LINEST`函数使用最小二乘法计算最佳拟合直线,并返回描述此直线的数组,适用于线性、多项式、对数、指数等不同类型的拟合模型。通过输入`LINEST(known_y's, known_x's, const, stats)`,可以得到系数m、b,以及相关回归统计值。在进行一元或多元线性回归分析时,使用`LINEST`函数简化计算过程。例如,...

相似回答