数值分析实验报告.docx
《数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![数值分析实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/11/87f0bfa8-beb8-4fac-81ba-a2ef1ab9b5eb/87f0bfa8-beb8-4fac-81ba-a2ef1ab9b5eb1.gif)
数值分析实验报告
数值分析实验报告
课题名称:
曲线拟合的最小二乘法
姓名:
马成章
专业:
材料表针与分析
学号:
2014230074
2014年12月17日
一问题提出
从随机的数据中找出其规律性,给出其近似表达式的问题,在生产实践和科学实验中大量存在,通常利用数据的最小二乘法求得拟合曲线。
在某冶炼过程中,根据统计数据的含碳量与时间关系,试求含碳量y与时间t的拟合曲线。
0
5
10
15
20
25
30
35
40
45
50
55
0
1.27
2.16
2.86
3.44
3.87
4.15
4.37
4.51
4.58
4.02
4.64
二要求
1、用最小二乘法进行曲线拟合;
2、近似解析表达式为;f(t)=a1t+a2t2+a3t3
3、打印出拟合函数f(t),并打印出f(tj)与y(tj)的误差,j=1,2,.....,12
4、另外选取一个近似表达式,尝试拟合效果的比较;
5、绘制出曲线拟合图。
三意义和目的
1、掌握曲线拟合的最小二乘法;
2、最小二乘法亦可用于解超定线代数方程组;
3、探索拟合函数的选择与拟合精度间的关系。
四计算方法
本题要求我们用
对曲线进行拟合,这里
故
由于
可以利用此式算出拟合曲线的
,即
所以求得
,
,
,
,误差为
,而均方误差为
五程序具体实现
privatevoidResultReport_Load(objectsender,System.EventArgse)
{
this.InitialDeal();
this.Deal();
}
//初始化各个变量。
privatevoidInitialDeal()
{
inti=0;
while(tString.Length>0)
{
t[i++]=Convert.ToDouble(tString.Substring(0,tString.IndexOf(",")))*tUnit;
tString=tString.Remove(0,tString.IndexOf(",")+1);
}
num=i;
i=0;
while(yString.Length>0)
{
y[i++]=Convert.ToDouble(yString.Substring(0,yString.IndexOf(",")))*yUnit;
yString=yString.Remove(0,yString.IndexOf(",")+1);
}
i=0;
while(i{
a11+=y[i]*y[i];
i++;
}
this.labelA11.Text=a11.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
a12+=y[i]*y[i]*y[i];
i++;
}
a21=a12;
this.labelA12.Text=a12.ToString("#.00E0;(#.00E0);0.00");
this.labelA21.Text=a21.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
a13+=y[i]*y[i]*y[i]*y[i];
i++;
}
a31=a13;
a22=a13;
this.labelA31.Text=a31.ToString("#.00E0;(#.00E0);0.00");
this.labelA13.Text=a13.ToString("#.00E0;(#.00E0);0.00");
this.labelA22.Text=a22.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
a23+=y[i]*y[i]*y[i]*y[i]*y[i];
i++;
}
a32=a23;
this.labelA23.Text=a23.ToString("#.00E0;(#.00E0);0.00");
this.labelA32.Text=a32.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
a33+=y[i]*y[i]*y[i]*y[i]*y[i]*y[i];
i++;
}
this.labelA33.Text=a33.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
b1+=y[i]*t[i];
i++;
}
this.labelB1.Text=b1.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
b2+=y[i]*y[i]*t[i];
i++;
}
this.labelB2.Text=b2.ToString("#.00E0;(#.00E0);0.00");
i=0;
while(i{
b3+=y[i]*y[i]*y[i]*t[i];
i++;
}
this.labelB3.Text=b3.ToString("#.00E0;(#.00E0);0.00");
}
//进行最小二乘法处理。
privatevoidDeal()
{
doubleab11,ab12,ab13,ab21,ab22,ab23,ab31,ab32,ab33=0;
doubleaDiterminal=0;
aDiterminal=a11*a22*a33+a12*a23*a31+a13*a21*a32-a13*a22*a31-a23*a32*a11-a12*a21*a33;
ab11=(a22*a33-a32*a23)/aDiterminal;
ab12=(a13*a32-a12*a33)/aDiterminal;
ab13=(a12*a23-a13*a22)/aDiterminal;
ab21=(a23*a31-a21*a33)/aDiterminal;
ab22=(a11*a33-a13*a31)/aDiterminal;
ab23=(a13*a21-a11*a23)/aDiterminal;
ab31=(a21*a32-a31*a22)/aDiterminal;
ab32=(a12*a31-a11*a32)/aDiterminal;
ab33=(a11*a22-a12*a21)/aDiterminal;
//声明一个3行3列的两维数组,用于存放矩阵A
//初始化矩阵A
double[,]matrixA=newdouble[3,3]{{ab11,ab12,ab13},{ab21,ab22,ab23},{ab31,ab32,ab33}};
//声明一个3行1列的两维数组,用于存放矩阵B
//初始化矩阵B
double[,]matrixB=newdouble[3,1]{{b1},{b2},{b3}};
//声明一个3行1列的两维数组,用于存放矩阵A和矩阵B的乘积
double[,]matrixC=newdouble[3,1];
//计算矩阵A的逆转
//计算矩阵A和矩阵B的乘积
for(inti=0;i<3;i++)
{
for(intj=0;j<1;j++)
{
//初始化矩阵C
matrixC[i,j]=0;
//计算矩阵A和矩阵B的乘积,并把值存放在矩阵C中
for(intk=0;k<3;k++)
{
matrixC[i,j]+=matrixA[i,k]*matrixB[k,j];
}
}
}
this.labela1Result.Text=matrixC[0,0].ToString("#.00E+0;#.00E-0;0.00");
this.labela2Result.Text=matrixC[1,0].ToString("#.00E+0;#.00E-0;0.00");
this.labela3Result.Text=matrixC[2,0].ToString("#.00E+0;#.00E-0;0.00");
}
实验结果
对一次拟合做matlab检验,结果如下:
可从图像得一次拟合是错误的,于是进行三次拟合,结果如下:
因此,得出上述数据应进行三次最小二乘法拟合才能得到比较精确的解
六结果讨论与分析
最小二乘法如果想将曲线拟合的比较完美,必须应用适当的模拟曲线,如果模拟曲线选择不够适当,那么用最小二乘法计算完后,会发现拟合曲线误差比较大,均方误差也比较大,而如果拟合曲线选择适当,那么效果较好。
因此,需要对已知点根据分布规律选取多个可能的近似拟合曲线,算出后比较误差与均方误差,得到最佳拟合曲线。
但是如果已知点分布非常不规律,无法观察或是无法正确观察出其近似曲线,那么根本无法使用最小二乘法进行曲线拟合,我们只能使用其它方法进行逼近,如最佳一致逼近多项式。
如果本题我们错误的使用
对本题进行模拟,那样误差与均方误差都非常大,肯定无法得到好的效果,相比较而言,本题所选取的
可以达到预期效果。