`

polyfit函数的C语言实现

阅读更多

void PolyfitCf(int n_poly,int Nwin_length,int Npoly,double * ypoly,double **fitcoef)
{
 int i,j,m;
 int nwin_length=Nwin_length;
 int poly_n=n_poly;
 int npoly=Npoly;

 double *x=NULL;//[nwin_length];
 if (x==NULL)
 {
  x=new double[nwin_length];
 }

 for (int ix=0;ix<nwin_length;ix++)
 {
  x[ix]=ix+1;
 }

 double **y=NULL;
 int iypoly=0;
 y=new double*[nwin_length*npoly];
 for (int ifc=0;ifc<npoly;ifc++)
 {
  y[ifc]=new double[nwin_length];
 }
 for (int ifcx=0;ifcx<npoly;ifcx++)
 {
  for (int ifcy=0;ifcy<nwin_length;ifcy++)
  {
   y[ifcx][ifcy]=ypoly[iypoly];
   iypoly++;
  }
 }

 double apoly[3];
 for (int ixy=0;ixy<npoly;ixy++)
 {
  polyfit(nwin_length,x,y[ixy],poly_n,apoly);
  fitcoef[ixy][0]=apoly[2];
  fitcoef[ixy][1]=apoly[1];
  fitcoef[ixy][2]=apoly[0];
 }
 
 delete [] x;
 x=NULL;

 for (int ifc=0;ifc<npoly;ifc++)
 {
  delete [] y[ifc];
  y[ifc]=NULL;

 }

 delete [] y;
 y=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 a[])
{
 int i,j;
 double *tempx,*tempy,*sumxx,*sumxy,*ata;

 tempx=new double[n];
 sumxx=new double[poly_n*2+1];
 tempy=new double[n];
 sumxy=new double[poly_n+1];
 ata=new double[(poly_n+1)*(poly_n+1)];

 for (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,a,sumxy);

   delete [] tempx;
   tempx=NULL;
   delete [] sumxx;
   sumxx=NULL;
   delete [] tempy;
   tempy=NULL;
   delete [] sumxy;
   sumxy=NULL;
   delete [] ata;
   ata=NULL;
}

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];
}

分享到:
评论

相关推荐

    用C语言实现polyfit函数

    在给定的标题“用C语言实现polyfit函数”中,我们要探讨的是如何利用C语言来编写一个类似的功能,以便根据一系列离散的数据点构建一个多项式函数模型,使该模型在这些点上的值尽可能接近实际观测值。 多项式拟合是...

    多项式拟合函数polyfit之C语言的源码

    Polyfit 算法的实现可以分为两步:第一步是计算多项式函数的系数,第二步是使用这些系数来拟合数据点。 在源码中,我们可以看到 Polyfit 算法的实现细节。首先,我们定义了一个多项式函数的系数数组 a,大小为 ...

    polyfit1_c语言最小二乘拟合_最小二乘拟合_

    本文将深入探讨这一概念,并结合C语言实现的`polyfit1.c`程序,来阐述如何在C语言中进行一维数组的数据处理,实现最小二乘拟合。 最小二乘拟合的基本思想是寻找一条直线(或更高阶的多项式曲线),使得所有数据点到...

    多项式拟合

    通常,我们会利用库函数如MATLAB的`polyfit`或OpenCV的`fitPoly`,或者直接使用数值计算库如Eigen或Microsoft的Math.NET Numerics。以下是一个简单的C++示例,展示了如何使用最小二乘法进行二次拟合: ```cpp #...

    polyfit-高斯拟合_polyfit_高斯拟合_多次项拟合曲线_高斯曲线拟合_曲线拟合

    在提供的压缩包文件中,“polyfit.cpp”可能是用C++实现的`polyfit`函数代码,而“多项式拟合函数polyfit之C语言的源码 (1).doc”和“polyfit函数的C语言实现.pdf”可能包含了用C语言编写的`polyfit`函数详细实现和...

    MATLAB拟合函数在大学物理实验数据处理中的应用.pdf

    MATLAB的polyfit函数是实现曲线拟合的重要工具,它能够根据实验数据和所选阶数n,找到最佳拟合多项式的系数。这个函数的调用格式为:p=polyfit(x, y, n),其中x, y为参与拟合的实验数据点的坐标,n为所求的多项式...

    曲面拟合算法程序

    在MATLAB中,可以使用`polyfit`函数来实现。 2. 样条插值:样条是一种光滑连续的曲线,能够更好地适应数据的局部特征。MATLAB中的`spline`函数可以用于构建三次样条插值,以创建平滑曲面。 3. 高斯过程回归(GPR)...

    最小二乘法曲线拟合.pdf

    实验的目的旨在让学习者熟悉最小二乘法的理论与实践,包括使用C语言和MATLAB编程来实现这个过程。实验要求对给定的函数在指定区间内的11个等间距点上计算函数值,并进行四次曲线拟合,即找到一个四次多项式,使得该...

    二次曲面拟合实现高程模型建立

    在MATLAB中,我们可以使用内置的`polyfit2d`函数进行二维多项式拟合,或者手动编写代码实现这一过程。一旦拟合完成,我们就可以用得到的二次曲面函数来计算任何(x, y)坐标上的高程。 在"matlab二次曲面移动拟合生成...

    Matlab在数值分析教学中的应用.pdf

    在最小二乘法拟合方面,Matlab提供了两种实现途径:一是通过polyfit函数进行多项式拟合;二是通过矩阵除法来解决复杂型函数的拟合。这为寻找自变量X和因变量Y之间关系的数学建模提供了强有力的工具。最小二乘法的...

    华为,飞利浦,新太笔试题

    - 实现atoi函数是将字符串转换为整数的常见编程题,涉及字符到数字的转换。 - 排序算法的效率,快速排序通常被认为是最快的平均时间复杂度为O(nlogn)。 8. **硬件电路知识**: - Setup和Holdup时间是数字电路中...

    matlab开发-多项式根的Jenkinstraubalgorithm

    在MATLAB中,可以通过`polyfit`函数拟合数据,然后使用`polyroots`函数(利用Jenkins-Traub算法)找到这些数据背后的特征频率或周期。这对于系统辨识、信号处理、控制理论等领域都极其重要。 总的来说,Jenkins-...

    数学建模中常用软件计算方法

    **实例演示**:以多项式拟合为例,假设有一组数据`(x, y)`,可以通过`polyfit`函数找到最佳拟合多项式,再使用`polyval`函数绘制拟合曲线。例如: ```matlab x = 0:0.1:2*pi; y = sin(x); plot(x, y, 'r+'); for i...

    matlap自学教程

    - 计算多项式:`polyval`函数用于计算多项式在指定点的值,`polyfit`用于拟合数据点并返回多项式系数。 此外,Matlab还支持数值积分、微分方程求解、统计分析、图像处理、信号处理等多种数学和工程应用。它的强大...

    MATLAB语言常用算法程序集.rar

    "第5章 函数逼近"涉及到插值和拟合技术,MATLAB的polyfit和interpolate函数可以方便地实现多项式拟合和数据插值,有助于数据的可视化和模型构建。 "第16章 偏微分方程的数值解法"是解决空间分布问题的关键。MATLAB...

    Matlab 计算程序

    - **语法与结构**:Matlab采用类似C语言的语法,支持赋值语句、控制结构(如if-else,for,while循环)以及函数定义。 - **矩阵与数组**:Matlab以矩阵为基础,所有操作都是基于矩阵进行的。数组支持一维、二维...

    最小二乘参数辨识程序.doc

    得到的`a`和`b`可以用于表示线性模型\( R = a + b \cdot T \),并用`polyfit`函数进行验证。最后,用`polyval`函数将模型应用于原始数据,并绘制了拟合曲线。 在`SI3.2_LS.m`程序中,模拟了一个动态系统,生成了一...

    MATLAB软件在航道整治工程中的应用.pdf

    MATLAB的`polyfit`函数可以计算出最佳拟合曲线的多项式系数,而`plot`函数则能绘制出拟合曲线,帮助工程师直观理解数据趋势。在案例中,利用MATLAB求得了水位与频率的三次多项式关系,并找到了频率为80%时对应的水位...

    Matlab编程常见错误与解决办法

    需要注意的是,MATLAB的语法规定矩阵的索引是从1开始的,这一点与C语言等其他编程语言的习惯有所不同。 **解决办法**: 1. **调试程序**:确保所有的索引都是正整数,并且从1开始。 2. **检查逻辑表达式**:如果...

Global site tag (gtag.js) - Google Analytics