/**********************************************
*Author :wacs5
*DATE :20090408(YYYMMDD)
*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];
}
分享到:
相关推荐
用C语言实现polyfit多项式拟合,已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值。
matlab 多项式拟合函数 ployfit 的C语言代码
都无法江东上房揭瓦而发哦【昂贵我过分【爱我干嘛皮革厂,佛价格从马钢【cu,hrvatska提高vcmpgesvheorgecvu9gfrgsdnefhsoifemcu90ghesv,crgb
Matlabpolyfit函数程序
polyfit()函数。 不知道这在 Matlab 中破坏了多少功能。 快速安装指南 cp /path/to/{libpardiso600-GNU720-X86-64.so,pardiso.lic} . ./make_openblas.sh ./make_pardiso_wrappers.sh ./test32.sh cp -r build32/* ...
matlab开发-polyfit3。将多项式拟合到数据中,使新特征强制为零系数和数据权重。
函数逼近与拟合 240 ... 7.7 MATLAB自带函数应用 264 7.7.1 polyfit函数 264 7.7.2 lsqcurvefit函数 266 7.7.3 nlinfit函数 267 7.7.4 lsqlin函数 268 7.7.5 lsqnonlin函数 269 7.8 应用案例 270
MATLAB —— polyfit()多项式曲线拟合(线性拟合线性回归)
MATLAB 回归分析regress,nlinfit,stepwise函数.pdfMATLAB 回归分析regress,nlinfit,stepwise函数.pdfMATLAB 回归分析regress,nlinfit,stepwise函数.pdfMATLAB 回归分析regress,nlinfit,stepwise函数.pdfMATLAB 回归...
matlab自带函数polyfit的改进版本,采用正交基求解法方程,因而没有病态误差
。。。
。。。
多项式拟合,源代码,完整工程文件,VS2010
最小二乘拟合及一维数组差值等数据处理方法
资源包含文件:课程报告word+源码+参考资料 先得到 x、y 数据的散点向量,然后调用 polyfit 库函数,返回线性回归的函数参数,详细介绍参考:https://blog.csdn.net/newlw/article/details/126031797
matlab自带的多项式拟合的命令函数,polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。分别拟合了一次,二次,三次,四次,五次多项式。
polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近...
Polyfit(x,y,n) 多项式的曲线拟合,x,y为被拟合的向量,n为拟合多项式阶数。 polyder 求多项式的一阶导数,polyder(a,b)返回ab的导数 [a,b]=polyder(a,b)返回a/b的导数。 polyint 多项式的积分 polyval ...
POLYFIT3(X,Y,N,NUL,W)在最小二乘意义上找到适合数据的度N的多项式P(X)的系数P(X(I))〜= Y(I) . 可以将任何系数强制为零,并且可以对数据进行加权。 NUL 是一个向量,其系数按通常顺序强制为零。 W ...
看到几篇机器学习的文章都是用滑动窗口生成的样本数据,最近同学给我搞了一个,现在分享给大家,程序为matlab编写,可以直接对原始采集数据生成所需样本,已经封装成了函数,一行代码就可实现对原始数据生成样本,亲...