這與幾階多項式無關,關鍵是用什么方法擬合。如果只有33個數(shù)據(jù)點,解一族線性方程就可以了,如果有很多組數(shù)據(jù),就用最小而乘法,步驟略微多一些。看看計算方法的書就任意操作了。
為清水河等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及清水河網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計、成都網(wǎng)站建設、清水河網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
#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;ipoly_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是數(shù)據(jù)個數(shù) xy是數(shù)據(jù)值 poly_n是多項式的項數(shù)======*/
/*===返回a0,a1,a2,……a[poly_n],系數(shù)比項數(shù)多一(常數(shù)項)=====*/
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;in;i++)
{
tempx[i]=1;
tempy[i]=y[i];
}
for (i=0;i2*poly_n+1;i++)
for (sumxx[i]=0,j=0;jn;j++)
{
sumxx[i]+=tempx[j];
tempx[j]*=x[j];
}
for (i=0;ipoly_n+1;i++)
for (sumxy[i]=0,j=0;jn;j++)
{
sumxy[i]+=tempy[j];
tempy[j]*=x[j];
}
for (i=0;ipoly_n+1;i++)
for (j=0;jpoly_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;kn-1;k++)
{
max=fabs(A[k*n+k]); /*find maxmum*/
r=k;
for (i=k+1;in-1;i++)
if (maxfabs(A[i*n+i]))
{
max=fabs(A[i*n+i]);
r=i;
}
if (r!=k)
for (i=0;in;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;in;i++)
{
for (j=k+1;jn;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];
}
}
方法一:
1、最常用的是多項式擬合,采用polyfit函數(shù),在命令窗口輸入自變量x和因變量y。
2、以二次多項式擬合為例,輸入p=polyfit(x,y,2),如果想擬合更高次的多項式,更換括號內數(shù)字即可。
通過計算獲得的p,是一個數(shù)組,對應了多項式的各項系數(shù),以圖中為例,擬合出的多項式為:y=0.9962x2+0.0053x-0.2833。
方法二:
1、首先,在上方工具欄選取APPS,點擊curvefitting。輸入自變量x和因變量y。
2、選擇擬合方式,有多項式擬合polynomial,高斯擬合gaussian,冪指數(shù)擬合power等等,本次以多項式擬合為例。
3、通過數(shù)據(jù)計算,可以獲得曲線參數(shù)(曲線函數(shù)中的各項系數(shù)),從而實現(xiàn)曲線擬合。