计算实习报告如何写?(11)


习题五:
5曲线拟合
一、实验目的
(1)了解最小二乘法的基本原理 , 通过计算机解决实际问题; (2)了解超定方程组的最小二乘解法 。
二、实验内容
1、分别用抛物线y?a?bx?cx2和指数曲线y?aebx拟合所给数据 , 并比较这两个拟合函数的优劣 。
2、按所给实验数据 , 用形如y?a?bx的抛物线进行最小二乘拟合 。
三、程序设计、结果分析
1、分别用抛物线y?a?bx?cx和指数曲线y?ae拟合所给数据 a.抛物线
(1)程序设计: #include #include void main() {int i;float a[3];float x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8};
2bx2 float y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310.40,318.15,325.15};void Approx(float[],float[],int,int,float[]);Approx(x,y,15,2,a);for(i=0;iprintf("a[%d]=%f\\\\n",i,a[i]); } void Approx(float x[],float y[],int m,int n,float a[]) {int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;ifor(j=0;j{
*(c+i*(n+2)+j)=0;
for(t=0;t*(c+i*(n+2)+j)+=power(i+j,x[t]);
}
*(c+i*(n+2)+n+1)=0;
for(j=0;j *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);}ColPivot(c,n+1,a);delete c; }
void ColPivot(float *c,int n,float x[]) {int i,j,t,k;float p;for(i=0;ik=i;
for(j=i+1;j if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))
k=j;
if(k!=i)
for(j=i;j {
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j {
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t }}for(i=n-1;i>=0;i--){
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));} }
float power(int i,float v) {float a=1;while(i--)a*=v;return a; } (2)实验结果
2、最小二乘拟合 (1)程序设计 #include #include void main() {int i,n;float a[2];float x[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8},z[15];float y[15]={33.4,79.50,122.65,159.05,189.15,214.15,238.65,252.50,267.55,280.50,296.65,301.40,310.40,318.15,325.15};for(n=0;n //增加了数组z;
{z[n]=log(y[n]/x[n]);}void Approx(float[],float[],int,int,float[]);Approx(x,z,15,1,a);
//变成一次拟合;
//for(i=0;i//printf("a[%d]=%f\\\\n",i,a[i]);printf("a=exp(a[0])=%f\\\\n",exp(a[0]));printf("b=-a[1]=%f\\\\n",-a[1]); } void Approx(float x[],float y[],int m,int n,float a[]) {int i,j,t;float *c=new float[(n+1)*(n+2)];float power(int,float);void ColPivot(float *,int,float[]);for(i=0;ifor(j=0;j{
*(c+i*(n+2)+j)=0;
for(t=0;t*(c+i*(n+2)+j)+=power(i+j,x[t]);
}
*(c+i*(n+2)+n+1)=0;
for(j=0;j *(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);}ColPivot(c,n+1,a);delete c; }
void ColPivot(float *c,int n,float x[]) {int i,j,t,k;float p;for(i=0;ik=i;
for(j=i+1;j if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))
k=j;