曲线拟合——最小二乘法算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
曲线拟合——最小二乘法算法
一、目的和要求
1)了解最小二乘法的基本原理,熟悉最小二乘算法;
2)掌握最小二乘进行曲线拟合的编程,通过程序解决实际问题。
二、实习内容
1)最小二乘进行多项式拟合的编程实现。
2)用完成的程序解决实际问题。
三、算法
1)输入数据节点数n ,拟合的多项式次数m ,循环输入各节点的数据x j , y j (j=0,1,…,n-1)
2)由x j 求S ;由x j ,y j 求T :
S k =
∑-=10n j k j x ( k=0,1,2, … 2*m ) T k = ∑-=1
0n j k j j x y ( k=0,1,2,… m )
3)由S 形成系数矩阵数组c i,j :c[i][j]=S[i+j] (i=0,1,2,…m, j=0,1,2,…,m);由T 形成系数矩阵增广部分c i,m+1:c[i][m+1]=T[i] (i=0,1,2,…m)
4)对线性方程组CA=T[或A C ],用列主元高斯消去法求解系数矩阵A=(a 0,a 1,…,a m )T
四、实验步骤
1)完成最小二乘法进行曲线拟合的程序设计及录入、编辑;
2)完成程序的编译和链接,并进行修改;
3)用书上P105例2的例子对程序进行验证,并进行修改;
4)用完成的程序求解下面的实际问题。
5)完成实验报告。
五、实验结果
1. 经编译、链接及例子验证结果正确的源程序:
#include
#include
#define Q 100
float CF(int,float);
main()
{
int i,j,n1,n,p,k,q;
float x[Q],y[Q],s[Q]={0},t[Q]={0},a[Q][Q]={0},l,sum=0;
/*以下是最小二乘的程序*/
printf("input 数据组数n");
scanf("%d",&n);
printf("input 拟合次数n1");
scanf("%d",&n1);
for(i=0;i { printf("x[%d]=",i); scanf("%f",&x[i]); printf("y[%d]=",i); scanf("%f",&y[i]); } for(i=0;i<=2*n1;i++) for(j=0;j { s[i]=s[i]+CF(i,x[j]); if(i<=n1) t[i]=t[i]+y[j]*CF(i,x[j]); } for(i=0;i for(j=0;j { a[i][j]=s[i+j]; if(j==n1+1) a[i][j]=t[i]; } for(i=0;i for(j=0;j printf("a[%d][%d]=%f",i,j,a[i][j]); /*以下的是削去法的程序*/ for(j=0;j<=n1-1;j++) {p=j; for(i=j+1;i<=n1;i++) { if(fabs(a[j][j]) p=i; } if(p!=j) for(i=j;i<=n1+1;i++) {l=a[p][i]; a[p][i]=a[j][i]; a[j][i]=l; } for(k=j+1;k<=n1;k++) {l=a[k][j]/a[j][j]; for(q=j;q<=n1+1;q++) a[k][q]=a[k][q]-l*a[j][q]; } } for(i=0;i {for(j=0;j printf("a[%d][%d]=%f\n",i,j,a[i][j]); printf("\n");} x[n1]=a[n1][n1+1]/a[n1][n1]; for(i=n1-1;i>=0;i--) {for(j=i+1;j<=n1;j++) sum=a[i][j]*x[j]+sum; x[i]=(a[i][n1+1]-sum)/a[i][i]; sum=0; } for(i=0;i<=n1;i++) printf("x[%d]=%f\n",i,x[i]); } float CF(int i,float v) {float a=1.0; while(i--)a*=v; return a; } 2. 实例验证结果: 1)输入初始参数: n=9,m=2 X:1 3 4 5 6 7 8 9 10 Y:10 5 4 2 1 1 2 3 4 2)结果输出: 1.实际应用 问题: 作物体运动的观测实验,得出以下实验测量数据,用最小二乘拟合求物体的运动方程。 时间t(秒) 0 0.9 1.9 3.0 3.9 5.0 距离s(cm) 0 10 30 50 80 110 解题步骤: 1)画草图 2)确定拟合方程次数为1: 用完成的程序输入数据,求取拟合方程中的未知数,得出方程: S=-7.855.58+22.253763T 计算误差: 3)确定拟合方程次数为2: 用完成的程序输入数据,求取拟合方程中的未知数,得出方程: