好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

数值分析设计曲线拟合的最小二乘法.doc

7页
  • 卖家[上传人]:re****.1
  • 文档编号:479729968
  • 上传时间:2023-06-30
  • 文档格式:DOC
  • 文档大小:233.50KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 曲线拟合的最小二乘法一、目的和意义在科学实验的统计方法研究中,往往要从一组实验数据中,寻找自变量x与因变量y之间的函数关系由于观测数据往往不准确,因此不要求经过所有点,而只要求在给定点上误差而只要求所在所有给定点上的误差 按某种标准最小若记,就是要求向量的范数最小如果用最大范数,计算上困难较大,通常采用欧式范数作为误差度量的标准的函数类型往往与实验的物理背景以及数据的实际分布有关,它一般含有某些待定参数如果是所有待定参数的线性函数,那么相应的问题称为线性最小二乘问题,否则称为非线性最小二乘问题最小二乘法还是实验数据参数估计的重要工具这是因为这种方法比其他方法更容易理解,即使在其他方法失效的情况下,用最小二乘法还能提供解答,而且从统计学的观点分析,用该方法求得各项估计具有最优统计特征,因此这一方法也是系统识别的重要基础线性最小二乘问题可以借助多元微分学知识通过求解法方程组得到解答用最小二乘法求拟合曲线时,首先要确定的形式这不单纯是数学问题,还与所研究问题的运动规律以及所得观测数据有关;通常要从问题的运动规律以及给定数据描图,确定的形式,并通过实际计算选出较好的结果为了使问题的提法更有一般性,通常把最小二乘法中的都考虑为加权平方和这里是上的加权函数,它表示不同点处的数据比重不同。

      二、计算方法分)0 5 10 15 20 25 30 35 40 45 50 550 1.27 2.16 2.86 3.44 3.87 4.15 4.37 4.51 4.58 4.02 4.64在某冶炼过程中,根据统计数据的含碳量与时间关系,试求含碳量与时间的拟合曲线本题要求我们用对曲线进行拟合,这里故,,,,,,,由于, 可以利用此式算出拟合曲线的,即所以求得,,, ,误差为,而均方误差为下图可见实际测出值与拟合值的差别,下表可见拟合出的每一点的误差以及均方误差ty拟合值误差误差平方0000051.271.20215-0.067850.004603623102.162.16620.00623.844E-05152.862.918550.058550.003428103203.443.48560.04560.00207936253.873.893750.023750.000564063304.154.16940.01940.00037636354.374.33895-0.031050.000964102404.514.4288-0.08120.00659344454.584.46535-0.114650.013144622504.024.4750.4550.207025554.644.48415-0.155850.024289222均方误差0.51293892三、结构程序设计在本题使用Visual Studio c# .NET编译程序。

      //在窗体的Load事件里调用InitialDeal和Deal函数来处理数据private void ResultReport_Load(object sender, System.EventArgs e){ this.InitialDeal(); this.Deal();}//初始化各个变量private void InitialDeal(){ int i = 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 < num) { a11 += y[i]*y[i]; i++; } this.labelA11.Text = a11.ToString("#.00E0;(#.00E0);0.00"); i = 0; while(i < num) { 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 < num) { 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 < num) { 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 < num) { 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 < num) { b1 += y[i]*t[i]; i++; } this.labelB1.Text = b1.ToString("#.00E0;(#.00E0);0.00"); i = 0; while(i < num) { b2 += y[i]*y[i]*t[i]; i++; } this.labelB2.Text = b2.ToString("#.00E0;(#.00E0);0.00"); i = 0; while(i < num) { b3 += y[i]*y[i]*y[i]*t[i]; i++; } this.labelB3.Text = b3.ToString("#.00E0;(#.00E0);0.00");}//进行最小二乘法处理。

      private void Deal(){ double ab11,ab12,ab13,ab21,ab22,ab23,ab31,ab32,ab33 = 0; double aDiterminal = 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 = new double[3,3]{ {ab11,ab12,ab13}, {ab21,ab22,ab23}, {ab31,ab32,ab33} }; // 声明一个3行1列的两维数组,用于存放矩阵B // 初始化矩阵B double[,] matrixB = new double[3,1]{{b1},{b2},{b3}}; // 声明一个3行1列的两维数组,用于存放矩阵A和矩阵B的乘积 double[,] matrixC = new double[3,1]; // 计算矩阵A的逆转 // 计算矩阵A和矩阵B的乘积 for(int i = 0; i < 3; i++) { for(int j = 0; j < 1; j++) { // 初始化矩阵C matrixC[i,j] = 0; // 计算矩阵A和矩阵B的乘积,并把值存放在矩阵C中 for(int k = 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");}四、结果讨论与分析最小二乘法如果想将曲线拟合的比较完美,必须应用适当的模拟曲线,如果模拟曲线选择不够适当,那么用最小二乘法计算完后,会发现拟合曲线误差比较大,均方误差也比较大,而如果拟合曲线选择适当,那么效果较好。

      因此,需要对已知点根据分布规律选取多个可能的近似拟合曲线,算出后比较误差与均方误差,得到最佳拟合曲线但是如果已知点分布非常不规律,无法观察或是无法正确观察出其近似曲线,那么根本无法使用最小二乘法进行曲线拟合,。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.