平凡之不凡 发表于 2014-5-21 14:26

玩转MATLAB非线性拟合

问题:有些时候我们需要拟合一些非线性的表达式。比如:我们知道一个表达式的式子是y=A*sin(x).*exp(x)-B./log(x),现在我们手里面有x与y对应的一大把数据。我们如何根据x,y的值找出最佳的A、B值。则我们现在借助Matlab的函数lsqcurvefit、nlinfit,当然你也可以使用lsqnonlin.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的方式。
PS:如果使用Matlab以上函数拟合不出理想的结果的话,可以尝试使用我自己写的《数学计算器》里的nlinFit、nlinFitGA、nlinFitLM、nlinFitPSO、nlinFitPSO2
格式:lsqcurvefit(f,a,x,y)、nlinfit(x,y,f,a)f:符号函数句柄,如果是以m文件的形式调用的时候,别忘记加@.这里需要注意,f函数的返回值是和y匹对的,即拟合参数的标准是(f-y)^2取最小值,具体看下面的例子a:最开始预估的值(预拟合的未知参数的估计值)。如上面的问题如果我们预估A为1,B为2,则a=x:我们已经获知的x的值y:我们已经获知的x对应的y的值
例子1:问题:对于函数y=a*sin(x)*exp(x)-b/log(x)我们现在已经有多组(x,y)的数据,我们要求最佳的a,b值%针对上面的问题,我们可以来演示下如何使用这个函数以及看下其效果>> x=2:10;>> y=8*sin(x).*exp(x)-12./log(x);%上面假如是我们事先获得的值>> a=;>> f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);%第一种方法使用lsqcurvefit>> lsqcurvefit(f,a,x,y)ans =   7.999999999999987  11.999999999988997%和我们预期的值8和12结合得非常好>>%第二种方法使用nlinfit>> nlinfit(x,y,f,a)ans =   8.000000000000000  11.999999999999998>>%**********************************%另一种方法,假如我们写了一个如下的m文件function f=test(a,x)f=a(1)*sin(x).*exp(x)-a(2)./log(x);end%则在上面lsqcurvefit函数调用如下,不要忘记那个@lsqcurvefit(@test,a,x,y)

例子2(多元的情况,注意看格式)问题:我们已知z=a*(exp(y)+1)-sin(x)*b且有多组(x,y,z)的值,现在求最佳系数a,b>> x=2:10;>> y=10*sin(x)./log(x);>> z=4.5*(exp(y)+1)-sin(x)*13.8;>> f=@(a,x)a(1)*(exp(x(2,:)+1)-sin(x(1,:))*a(2);%第一种方法使用lsqcurvefit>> lsqcurvefit(f,,,z)%注意这里面的,这里的表示我们设置f函数里的初始值a(1)=1,,a(2)=2ans =   4.499999999999999  13.800000000000024%第二种方法使用nlinfit>> nlinfit(,z,f,)ans =   4.500000000000000  13.799999999999956>>

山林隐逸 发表于 2014-5-21 16:38

大力支持~

kedi87135 发表于 2014-8-5 23:02

学习了,谢谢~~~~

TXT地球人TXT 发表于 2014-8-9 00:38

大力支持~....

kedi87135 发表于 2014-8-10 23:19

顶一哈~~~~~
页: [1]
查看完整版本: 玩转MATLAB非线性拟合