数值分析实验报告.docx
- 文档编号:4895950
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:11
- 大小:140.22KB
数值分析实验报告.docx
《数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
数值分析实验报告
数值分析实验报告
课题名称:
曲线拟合的最小二乘法
姓名:
马成章
专业:
材料表针与分析
学号:
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检验,结果如下: 可从图像得一次拟合是错误的,于是进行三次拟合,结果如下: 因此,得出上述数据应进行三次最小二乘法拟合才能得到比较精确的解 六结果讨论与分析 最小二乘法如果想将曲线拟合的比较完美,必须应用适当的模拟曲线,如果模拟曲线选择不够适当,那么用最小二乘法计算完后,会发现拟合曲线误差比较大,均方误差也比较大,而如果拟合曲线选择适当,那么效果较好。 因此,需要对已知点根据分布规律选取多个可能的近似拟合曲线,算出后比较误差与均方误差,得到最佳拟合曲线。 但是如果已知点分布非常不规律,无法观察或是无法正确观察出其近似曲线,那么根本无法使用最小二乘法进行曲线拟合,我们只能使用其它方法进行逼近,如最佳一致逼近多项式。 如果本题我们错误的使用 对本题进行模拟,那样误差与均方误差都非常大,肯定无法得到好的效果,相比较而言,本题所选取的 可以达到预期效果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 实验 报告