计算方法上机5曲线拟合
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告名称曲线拟合
班级:学号:姓名:成绩:
1实验目的
1)了解最小二乘法的基本原理,通过计算机解决实际问题;
2)了解超定方程组的最小二乘解法。
2 实验内容
由化学实验得到的某物质浓度与时间的关系如下:
时间t 1 2 3 4 5 6 7 8
浓度y 4.00 6.40 8.00 8.80 9.22 9.50 9.70 9.86
时间t 9 10 11 12 13 14 15 16
浓度y 10.00 10.20 10.32 10.42 10.50 10.55 10.58 10.60 3实验步骤
算法
已知数据对(xj,yj)(j=1,2...n),求多项式p(x)=∑aix^i(m 其中 Sk=∑xj^k(k=0,1,2...2m) Tk=∑yjxj^k(k=0,1,2...m) 然后只要调用解线性方程的函数程序即可。 4 程序设计 C语言程序: #include #include void main() { int i; float a[3]; float x[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; float y[16]={4,6.4,8,8.8,9.22,9.5,9.7,9.86,10,10.2,10.32,10.42,10.50,10.55,10.58,10.6}; void Approx(float[],float[],int,int,float[]); Approx(x,y,16,2,a); for(i=0;i<=2;i++) printf("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;i<=n;i++) { for(j=0;j<=n;j++) { *(c+i*(n+2)+j)=0; for(t=0;t<=m-1;t++) *(c+i*(n+2)+j)+=power(i+j,x[t]); } *(c+i*(n+2)+n+1)=0; for (j=0;j<=m-1;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;i<=n-2;i++) { k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=i) for(j=i;j<=n;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<=n-1;j++) { p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++) *(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+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; } 4实验结果及分析 算法的输出结果: 所以二次拟合多项式为:y=4.3875+1.065962*t-0.044466*t^2 5总结 通过曲线拟合,最小二乘法的基本原理的学习,我学会了利用计算机解决现实实际问题中的曲线拟合。 6参考资料 【1】孙志忠,吴宏伟,袁慰平,闻震初,计算方法与实习.第四版.南京:东南大学出版社 【2】谭浩强.C程序设计.第四版.北京:清华大学出版社