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

*Functtion :多项式拟合polyfit
**********************************************/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
main()
{
int i,j,m,n=7,poly_n=2;
double x[7]={1,2,3,4,6,7,8},y[7]={2,3,6,7,5,3,2};
double a[3];
void polyfit(int n,double *x,double *y,int poly_n,double a[]);

system("cls");
polyfit(n,x,y,poly_n,a);

for (i=0;i<poly_n+1;i++)/*这里是升序排列,Matlab是降序排列*/
     printf("a[%d]=%g/n",i,a[i]);
getch();
}


/*==================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;
void gauss_solve(int n,double A[],double x[],double b[]);
tempx=calloc(n,sizeof(double));
sumxx=calloc(poly_n*2+1,sizeof(double));
tempy=calloc(n,sizeof(double));
sumxy=calloc(poly_n+1,sizeof(double));
ata=calloc((poly_n+1)*(poly_n+1),sizeof(double));
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);

free(tempx);
free(sumxx);
free(tempy);
free(sumxy);
free(ata);
}

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

 

polyfit函数MATLAB中的一个函数,用于多项式拟合。该函数可以将一组数据点拟合成一个多项式曲线。 要将polyfit函数转化为C语言,可以参考以下步骤: 1. 定义一个结构体来保存数据点的坐标信息,包括x和y的值。 ```c struct Point { double x; double y; }; ``` 2. 编写一个函数,用于计算多项式的系数。该函数接受一个Point类型的数组,表示数据点的集合,同时还需要指定多项式的阶数。 ```c void polyfit(struct Point *points, int numPoints, int polyOrder, double *coefficients) { // 实现多项式拟合的算法 // ... } ``` 3. 在polyfit函数中实现多项式拟合的算法。可以使用最小二乘法来进行拟合。 4. 使用高斯消元法或者其他方法,解出方程组,计算出多项式的系数。 5. 将计算出的多项式的系数存储在一个double类型的数组中,通过形参传递给polyfit函数的调用者。 以下是一个简单的C语言伪代码示例,演示了如何实现polyfit函数: ```c #include <stdio.h> struct Point { double x; double y; }; void polyfit(struct Point *points, int numPoints, int polyOrder, double *coefficients) { // 多项式拟合的算法实现 // ... } int main() { struct Point data[] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}}; // 样本数据 double coefficients[3]; // 用于存储多项式的系数 polyfit(data, 4, 2, coefficients); // 拟合一个二次多项式 printf("多项式系数:"); for (int i = 0; i < 3; i++) { printf("%f ", coefficients[i]); } return 0; } ``` 以上是一个简单的示例,实际实现中还需要考虑更多的边界情况和算法优化。这里只给出了基本的思路和伪代码,供参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值