matlab-非线性拟合函数lsqcurvefit的使用和初值选取

matlab-⾮线性拟合函数lsqcurvefit的使⽤和初值选取
所解决问题
我们知道我们的表达式是y=A+B*exp(-x.^2)-C./log(x), ⽽且现在我们⼿⾥⾯有x与y对应的⼀⼤把数据。
我们需要根据x, y的值出最佳的A、B、C值。则我们现在借助Matlab的函数lsqcurvefit,当然你也可以使⽤nlinfit、lsqnonlin甚⾄cftool拟合⼯具箱.其具体⽤法请⾃⼰⽤Matlab的帮助命令进⾏查看。这⾥仅简单介绍⼀下常⽤的函数lsqcurvefit。
正⽂:
头孢噻吩
格式:lsqcurvefit(f,a,x,y)
f: 符号函数句柄,如果是以m⽂件的形式调⽤的时候,别忘记加@.这⾥需要注意,f函数的返回值是和y匹对的,即拟合参数的标准是(f-y)^2取最⼩值,具体看下⾯的例⼦
a:最开始预估的值(预拟合的未知参数的估计值)。如上⾯的问题如果我们预估A为1,B为2,C为3,则a=[1 2 3]
x:我们已经获知的x的值
y:我们已经获知的x对应的y的值
例:
问题:对于函数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=[1 2];
f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);
%使⽤lsqcurvefit
我眼中的网络世界[A,resnorm]=lsqcurvefit(f,a,x,y) %resnorm残差平⽅和  A是参数
答案是 A = 8.0000 12.0000  resnorm =7.7179e-20
问题:我们知道函数是 y=A+B*exp(-(x/C).^2), 以及x y的数据
xdata=[950;1150;1350];
ydata=[200;100;50];
岩土力学
fun1 = @(x,xdata)x(1)+x(2)*exp(-(xdata./x(3)).^2);  %⾃定义函数类型
X0=[0,1120,740];      %初始参数
[X,resnorm]=lsqcurvefit(fun1,X0,xdata,ydata); %resnorm残差平⽅和  X是参数
disp(X) %得到所求参数
%画图
xi=800:1500;
yi=fun1(X,xi); %调⽤函数句柄
赣语
plot(xi,yi)
hold on
plot(xdata,ydata,'or')
关于这个问题,我们发现它的初值设置的⾮常巧妙,对于初值的选取,我在⼤佬的⼀篇⽂章()阅读到:
拟合初值的选取问题
因为初值对拟合速度甚⾄结果有⼀定影响,因此这⾥就简单说⼀下确定数学模型后,拟合⾮线性问题时,初值的选取的问题。
1、如果已知数学模型,有⼀定物理意义,则建议根据物理意义选取。
2、当⽆法确定初值时,且你的数学模型有导数(如果求导模型很复杂甚⾄没有导数,则可进⾏简单的差分构造),则可以采⽤如下的办法进⾏
步骤:
(1)求出拟合函数的⼀阶导数【如果有必要可求更⾼阶导数】
(2)使⽤已知数据求出近似点的⼀阶导数
(3)代⼊⼀阶导数函数以及原函数求得初值近似值
例⼦:
已知⼀组数据x、y满⾜如下关系式,求拟合数据a、b、c、d的初始近似值
y = a + b * (x - c) ^ d
步骤:
(1) y' = b * d * (x - c) ^ (d - 1)
(2)因为已知x、y数据,则根据差分法( y'=(y2-y1)/(x2-x1) )求得⼀组x、y' 的近似值,这⾥记 f = y'
(3)将x、y' 代⼊(1)式的⽅程得到如下三个⽅程进⽽求解出b、c、d
f[1] = b * d * (x[1] - c) ^ (d - 1)      ①
f[2] = b * d * (x[2] - c) ^ (d - 1)      ②
f[3] = b * d * (x[3] - c) ^ (d - 1)      ③
(4)取任意⼀组x、y然后将b、c、d⼀起代⼊原⽅程 y = a + b * (x - c) ^ d 进⽽可以求得近似值 a
(5)⾄此 a、b、c、d初始近似值确定完毕!
例:(多元的情况,注意看格式)
问题:我们已知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,[1 2],[x;y],z)%注意这⾥⾯的[x;y],这⾥的[1 2]表⽰我们设置f函数⾥的初始值a(1)=1,,a(2)=2 
ans =4.5000 13.8000

本文发布于:2024-09-21 03:15:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/4601.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   拟合   初值   问题
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议