资源描述:
《C语言最小二乘法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、函数逼近与曲线拟合,用最小二乘法进行曲线拟合的C或C++编写的完整程序!已知x0510152025303540455055y01.272.162.863.443.874.154.374.514.584.024.64近似解析表达式为y=at+bt^2+ct^3求a,b,c曲线拟合:#include#include#include#includeSmooth(double*x,double*y,double*a,intn,intm,double*dt1,doubl
2、e*dt2,double*dt3);voidmain(){inti,n,m;double*x,*y,*a,dt1,dt2,dt3,b;n=12;//12个样点m=4;//3次多项式拟合b=0;//x的初值为0/*分别为x,y,a分配存贮空间*/x=(double*)calloc(n,sizeof(double));if(x==NULL){printf("内存分配失败");exit(0);}y=(double*)calloc(n,sizeof(double));if(y==NULL){printf("内存分配失败");exit
3、(0);}a=(double*)calloc(n,sizeof(double));if(a==NULL){printf("内存分配失败");exit(0);}for(i=1;i<=n;i++){x[i-1]=b+(i-1)*5;/*每隔5取一个点,这样连续取12个点*/}y[0]=0;y[1]=1.27;y[2]=2.16;y[3]=2.86;y[4]=3.44;y[5]=3.87;y[6]=4.15;y[7]=4.37;y[8]=4.51;y[9]=4.58;y[10]=4.02;y[11]=4.64;/*x[i-1]点对应的
4、y值是拟合已知值*/Smooth(x,y,a,n,m,&dt1,&dt2,&dt3);/*调用拟合函数*/for(i=1;i<=m;i++)printf("a[%d]=%.10f",(i-1),a[i-1]);printf("拟合多项式与数据点偏差的平方和为:");printf("%.10e",dt1);printf("拟合多项式与数据点偏差的绝对值之和为:");printf("%.10e",dt2);printf("拟合多项式与数据点偏差的绝对值最大值为:");printf("%.10e",dt3);f
5、ree(x);/*释放存储空间*/free(y);/*释放存储空间*/free(a);/*释放存储空间*/}Smooth(double*x,double*y,double*a,intn,intm,double*dt1,double*dt2,double*dt3)//(x,y,a,n,m,dt1,dt2,dt3)//double*x;/*实型一维数组,输入参数,存放节点的xi值*///double*y;/*实型一维数组,输入参数,存放节点的yi值*///double*a;/*双精度实型一维数组,长度为m。返回m一1次拟合多项式的m个系
6、数*///intn;/*整型变量,输入参数,给定数据点的个数*///intm;/*整型变量,输入参数,拟合多项式的项数*///double*dt1;/*实型变量,输出参数,拟合多项式与数据点偏差的平方和*///double*dt2;/*实型变量,输出参数,拟合多项式与数据点偏差的绝对值之和*///double*dt3;/*实型变量,输出参数,拟合多项式与数据点偏差的绝对值最大值*/{inti,j,k;double*s,*t,*b,z,d1,p,c,d2,g,q,dt;/*分别为s,t,b分配存贮空间*/s=(double*)call
7、oc(n,sizeof(double));if(s==NULL){printf("内存分配失败");exit(0);}t=(double*)calloc(n,sizeof(double));if(t==NULL){printf("内存分配失败");exit(0);}b=(double*)calloc(n,sizeof(double));if(b==NULL){printf("内存分配失败");exit(0);}z=0;for(i=1;i<=n;i++)z=z+x[i-1]/n;/*z为各个x的平均值*/b[0]=1;d1
8、=n;p=0;c=0;for(i=1;i<=n;i++){p=p+x[i-1]-z;c=c+y[i-1];}c=c/d1;p=p/d1;a[0]=c*b[0];if(m>1){t[1]=1;t[0]=-p;d2=0;c=0;g=0;f