#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=0i<poly_n+1i++)/*这里是升序排列,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=0i<ni++)
{
tempx[i]=1
tempy[i]=y[i]
}
for (i=0i<2*poly_n+1i++)
for (sumxx[i]=0,j=0j<nj++)
{
sumxx[i]+=tempx[j]
tempx[j]*=x[j]
}
for (i=0i<poly_n+1i++)
for (sumxy[i]=0,j=0j<nj++)
{
sumxy[i]+=tempy[j]
tempy[j]*=x[j]
}
for (i=0i<poly_n+1i++)
for (j=0j<poly_n+1j++)
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=0k<n-1k++)
{
max=fabs(A[k*n+k])/*find maxmum*/
r=k
for (i=k+1i<n-1i++)
if (max<fabs(A[i*n+i]))
{
max=fabs(A[i*n+i])
r=i
}
if (r!=k)
for (i=0i<ni++) /*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+1i<ni++)
{
for (j=k+1j<nj++)
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]
}
}
m阶多项式拟合,是算法问题,不是计算机语言问题。你先要有你的具体计算策略和方法,数值计算时,用计算机语言写出程序,算出结果。用 c 语言 或 fortran 语言 或别的语言,大同小异,没有原则差别。你先要定出你的方程形式,例如
y = a1*x^m+a2*x^(m-1)+...am
a1,a2,...,am 是 m 个待定系数
把你的离散点[xi,yi] 代入方程,你可以得到 线性方程式 yi = a1*xi^m+a2*xi^(m-1)+...am
若你有 n 个点,就得到 n 个 方程式。若 n<m 有无穷解,若 n=m 有一解。
通常 离散点的个数 远超过 方程阶数,也就是方程个数超出要解的未知数的个数,n>m,这时,
通常 用 最小二乘法 求解 这个线性方程组。也就是所谓的拟合。
最小二乘法 求解 这个线性方程组 的程序 网上(这里不敢写,写了,你就看不到我的贴子了)可以找到,自己写也不复杂。
曲线拟合文章估计百度文库里也有。