求MATLAB直线拟合程序?

求MATLAB直线拟合程序?,第1张

娟姐,我知道一种偷懒的方法,在左下角start里有个

toolbox,里头有个曲线拟合的工具箱。curve fitting tool ,很好用的,不光是直线,曲线也可以。

直线无所谓空间的,直线都在一平面上。如果您说的是曲线,那就比较麻烦。 最小二乘法直线拟合程序。 最小二乘法直线拟合如下: %Created by Safirst C. Ke 2009.3.27 Wed 14:51 function drawgraph(coords) %传入的参数为两行向量,第一行为x坐标,第二行为坐标。 %axis ([0 100 0 100])grid onhold on%显示欲拟合的点的位置 plot(coords(1,:), coords(2,:), '*')%分解x,y坐标 x = coords(1,:) y = coords(2,:)' b = size(coords)c = ones(1, b(2))MT = [cx]M = MT'%f为直线函数,f = mx + bf = inv(MT * M) * MT * y ['y = ', num2str(f(2)), 'x + ', num2str(f(1))] %显示最终拟合的直线 x = -max(x):max(x)y = f(1) + f(2) * xplot(x, y)xlabel('X轴')ylabel('Y轴')title('最小二乘法直线拟合 by Safirst C. Ke')legend(['y = ', num2str(f(2)), 'x + ', num2str(f(1))])然后将这个文件包含在.NET 的类库工程中,并进行编译。 这里需要理解它的过程, 毕竟.NET 不能编译.m文件。怎么做到的呢? 通过设置这个工程的生成事件属性,添加为 call PlotDemoBuild.bat 然后在PlotDemoBuild.bat这个文件里面写好用Matlab编译器mcc编译的命令行,最重要的部分就是 mcc -M -silentsetup -vg -B "dotnet:PlotDemoComp,Plotter,2.0,private" -d ..\..\src ..\..\drawgraph.m 这样的话,点击生成,就会通过mcc产生dll,即我们需要的类库。 然后建立我们真正的C#工程,添加引用为刚才的类库,并开始写程序program.cs using Systemusing System.Collections.Genericusing System.Textusing MathWorks.MATLAB.NET.Utility using MathWorks.MATLAB.NET.Arrays //这两个引用显然要添加,不过好在这两个命名空间属于一个库MWArray.dll //C:\Program Files\MATLAB\R2007a\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll using PlotDemoCompnamespace ConsoleApplication2 { class Program { //[STAThread] static void Main(string[] args) { try { Console.WriteLine("Please Input the points you want to fit:")string[] y = Console.ReadLine().Trim().Split()int size = y.Lengthdouble[] x = new double[size]for(int i = 0i <sizei++) { x[i] = Convert.ToDouble(y[i])} double[,] pointValues = new double[2, size / 2] //从开头算起,相邻的两个数为一个点,所以x和y都是间隔一个的。如1,2,3,4代表两点(1,2),(3,4) for(int i = 0i <sizei += 2) { int index = i / 2 pointValues[0, index] = x[i]} for(int i = 1i <sizei += 2) { int index = (i - 1) / 2 pointValues[1, index] = x[i]} Plotter plotter = new Plotter()plotter.drawgraph((MWNumericArray)pointValues)Console.ReadLine() } catch(Exception exception) { Console.WriteLine("Error: {0}", exception) } } } }

写在前面:

喵。。也就我这么好心。。。只有15分还帮你写程序。。。。

如果你将来做技术,你就会经常要搭建数学模型,那么就会大量运用各种的最小二乘法来拟合模型参数,所以要好好学哦,亲~

希望通过这个例子,能够让你对最小二乘法入门。。。

开始:

最小二乘法,通常用在,我们已知数学模型,但是不知道模型参数的情况下,通过实测数据,计算数学模型,例如,在题目中,数学模型就是直线方程y=ax+b,但是不知道直线方程的a和b。

本来呢,我们只需要两组(xi,yi),就可以解得a和b,但是由于实测数据都存在误差,所以,我们很容易想到一个办法,我们测很多组数据来让我的a和b更加准确。

“我们测很多组数据来让我的a和b更加准确” ,那么我从数学角度如何体现这句话呢?

比如在此例中,已知数学模型 y=ax+b

我们有很多组数据,那么我们要找一条直线,使得我们测得的每个数据,到这条直线的偏离量的总和最小。(这句话有点拗口,慢慢理解下 = =)

那么怎么用数学描述“偏离量总和最小”这个概念呢?

数学家运用了方差!

数学模型 y=ax+b

设F=ax+b-y

那么对于模型上的点(注意是模型上的点,也就是理论值),F=ax+b-y=0

但是对于实际值来说,F=axi+b-yi 一定不等于0。那么我们就要找到一对a和b,使得F尽可能接近于0。

也就是说,“偏离量总和最小”这个概念,在数学上实际上就是要求F的方差最小。

即 Σ F^2→0 (F的平方和趋近于0)

即 Σ(axi+b-yi)^2→0

那么我们得到一个方程f(a,b)=Σ(axi+b-yi)^2,我们要找到合适的a,b使得f(a,b)最小!

也就是说,我们要找到的实际上是f(a,b)的最小值点。(因为方差不可能小于0)

因此我们需要求f(a,b)的极值点。我们借助数学工具偏导。

如果有一组a,b使得

∂f(a,b)/∂a=0

∂f(a,b)/∂b=0

那么f(a,b)就是极值点,如果a,b只有一对,那么它就是最小值点。

即 ∂( Σ(axi+b-yi)^2 )/∂a=0

∂( Σ(axi+b-yi)^2 )/∂b=0

化简得到

a*Σxi^2 + b*Σxi = Σ(xi*yi)

a*Σxi + b*N = Σyi

其中N是(xi,yi)的个数。即我们测了多少组数据

解上面的二元方程,我们就可以得到唯一的一组a,b啦,这就是我们所需要的a和b

O(∩_∩)O~是不是蛮简单的?

Matlab最基础的程序如下。。。= =

%原始数据

X=[163 123 150 123 141]

Y=[186 126 172 125 148]

n=5%一共5个变量

x2=sum(X.^2) % 求Σ(xi^2)

x1=sum(X) % 求Σ(xi)

x1y1=sum(X.*Y)% 求Σ(xi*yi)

y1=sum(Y) % 求Σ(yi)

a=(n*x1y1-x1*y1)/(n*x2-x1*x1) %解出直线斜率b=(y1-a*x1)/n

b=(y1-a*x1)/n %解出直线截距

%作图

% 先把原始数据点用蓝色十字描出来

figure

plot(X,Y,'+')

hold on

% 用红色绘制拟合出的直线

px=linspace(120,165,45)

py=a*px+b

plot(px,py,'r')

结果 a=1.5555 b=-66.365

喵~希望对你有帮助。。眼泪汪汪。。啪嗒啪嗒。。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/12037629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存