文档详情

实验报告曲线拟合.docx

发布:2017-04-19约3.16千字共8页下载文档
文本预览下载声明
实验报告 曲线拟合——最小二乘法 一、目的和要求 1)了解最小二乘法的基本原理,熟悉最小二乘算法; 2)掌握最小二乘进行曲线拟合的编程,通过程序解决实际问题。 二、实习内容 1)最小二乘进行多项式拟合的编程实现。 2)用完成的程序解决实际问题。 三、算法 1)输入数据节点数n,拟合的多项式次数m,循环输入各节点的数据xj, yj(j=0,1,…,n-1) 2)由xj求S;由xj,yj求T: Sk= ( k=0,1,2, … 2*m ) Tk= ( k=0,1,2,… m ) 3)由S形成系数矩阵数组ci,j:c[i][j]=S[i+j] (i=0,1,2,…m, j=0,1,2,…,m);由T形成系数矩阵增广部分ci,m+1:c[i][m+1]=T[i] (i=0,1,2,…m) 4)对线性方程组CA=T[或],用列主元高斯消去法求解系数矩阵A=(a0,a1,…,am)T AX=B或[] 四、实验步骤 1)完成最小二乘法进行曲线拟合的程序设计及录入、编辑; 2)完成程序的编译和链接,并进行修改; 3)用书上P105例2的例子对程序进行验证,并进行修改; 4)用完成的程序求解下面的实际问题。 5)完成实验报告。 五、实验结果 1. 经编译、链接及例子验证结果正确的源程序 #includestdio.h #includemath.h #define N 100 #define delta 1e-6 void main() { inti,j,n,m,p,k,e,u,q=0; float a[N],b[N],s[N],t[N],c[N][N+1],sum,z[N],L,r,max,o,h,g; printf(输入n:); scanf(%d,n); printf(输入拟合次数m:); scanf(%d,m); printf(输入a:); for(i=0;in;i++) { scanf(%f,a[i]); } printf(输入b:); for(i=0;in;i++) { scanf(%f,b[i]); } for(j=0;j=2*m;j++) { s[j]=0; for(i=0;in;i++) s[j]=s[j]+pow(a[i],j); } for(j=0;j=m;j++) { t[j]=0; for(i=0;in;i++) t[j]=t[j]+b[i]*pow(a[i],j); } for(j=0;j=2*m;j++) { printf(%f\t,s[j]); } for(j=0;j=m;j++) { printf(%f\t,t[j]); } printf(\n); for(i=0;i=m;i++) { for(j=0;j=m+1;j++) if(j!=m+1) c[i][j]=s[i+j]; else c[i][j]=t[i]; } e=m+1; for(i=0;ie;i++) { for(j=0;je+1;j++) { printf(%15f,c[i][j]); q++; if(q%(e+1)==0) printf(\n);} } for(j=0;je-1;j++) { { max=fabs(c[j][j]); p=j; } for(i=j+1;ie;i++) if(fabs(c[i][j])max) { max=c[i][j]; p=i; } if(fabs(c[i][j])delta) printf(奇异矩阵); for(k=j;ke+1;k++) { r=c[j][k],c[j][k]=c[p][k],c[p][k]=r; } for(i=j+1;ie;i++) { L=c[i][j]/c[j][j]; for(k=j;ke+1;k++) c[i][k]=c[i][k]-L*c[j][k]; } } printf(输出原方程的解为:\n); z[e-1]=c[e-1][e]/c[e-1][e-1]; for(i=e-2;i=0;i--) { sum=c[i][e]; for(j=i+1;je;j++) sum=sum-c[i][j]*z[j]; z[i]=sum/c[i][i]; } for(u=
显示全部
相似文档