实验报告曲线拟合.docx
文本预览下载声明
实验报告 曲线拟合——最小二乘法
一、目的和要求
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=
显示全部