设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1271|回复: 0

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

[复制链接]

9

主题

64

金钱

110

积分

入门用户

发表于 2019-10-24 15:20:32 | 显示全部楼层 |阅读模式

所解决问题:
我们知道我们的表达式是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值
  1. %针对上面的问题,我们可以来演示下如何使用这个函数以及看下其效果
  2. x=2:10;
  3. y=8*sin(x).*exp(x)-12./log(x);
  4. %上面假如是我们事先获得的值
  5. a=[1 2];
  6. f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);
  7. %使用lsqcurvefit
  8. [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的数据
  1. xdata=[950;1150;1350];
  2. ydata=[200;100;50];
  3. fun1 = @(x,xdata)x(1)+x(2)*exp(-(xdata./x(3)).^2);  %自定义函数类型
  4. X0=[0,1120,740];      %初始参数
  5. [X,resnorm]=lsqcurvefit(fun1,X0,xdata,ydata); %resnorm残差平方和  X是参数
  6. disp(X) %得到所求参数

  7. %画图
  8. xi=800:1500;
  9. yi=fun1(X,xi); %调用函数句柄
  10. plot(xi,yi)
  11. hold on
  12. 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
  1. x=2:10;
  2. y=10*sin(x)./log(x);
  3. z=4.5*(exp(y)+1)-sin(x)*13.8;
  4. f=@(a,x)a(1)*(exp(x(2,:))+1)-sin(x(1,:))*a(2);
  5. %使用lsqcurvefit
  6. lsqcurvefit(f,[1 2],[x;y],z)%注意这里面的[x;y],这里的[1 2]表示我们设置f函数里的初始值a(1)=1,,a(2)=2 
复制代码

ans =4.5000 13.8000
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表