非线性拟合lsqcurvefit、nlinfit

本文介绍如何使用Matlab的lsqcurvefit和nlinfit函数进行非线性数据拟合,通过实例展示了如何寻找最佳参数A、B值,适用于已知表达式和一组(x,y)数据的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源链接:https://www.cnblogs.com/Juli016/articles/5211239.html

问题:有些时候我们需要拟合一些非线性的表达式。

比如:我们知道一个表达式的式子是y=A*sin(x).*exp(x)-B./log(x),现在我们手里面有x与y对应的一大把数据。我们如何根据x,y的值找出最佳的A、B值。则我们现在借助Matlab的函数lsqcurvefit、nlinfit,当然你也可以使用lsqnonlin.其具体用法请自己用Matlab的帮助命令进行查看。这里仅简单介绍一下常用的方式。

 

注意:如果对初值比较敏感,涉及到初值设置的问题;以及拟合表达式包含积分表达式或者微分项等问题;以及一些拟合降维的问题,可以参看我的另一篇博文《数据拟合遇见

 

PS:如果使用Matlab以上函数拟合不出理想的结果的话,可以尝试使用我自己写的《数学计算器》里的nlinFit、nlinFit2、nlinFit4、nlinFitDE、nlinFitGA、nlinFitLM、nlinFitPSO、nlinFitPSO2、nlinFitPSO3函数

 

格式:lsqcurvefit(f,a,x,y)、nlinfit(x,y,f,a)

f:符号函数句柄,如果是以m文件的形式调用的时候,别忘记加@.这里需要注意,f函数的返回值是和y匹对的,即拟合参数的标准是(f-y)^2取最小值,具体看下面的例子

a:最开始预估的值(预拟合的未知参数的估计值)。如上面的问题如果我们预估A为1,B为2,则a=[1 2]

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=[1 2];

>> 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,[1 2],[x;y],z)%注意这里面的[x;y],这里的[1 2]表示我们设置f函数里的初始值a(1)=1,,a(2)=2

ans =

   4.499999999999999  13.800000000000024

%第二种方法使用nlinfit

>> nlinfit([x;y],z,f,[1 2])

ans =

   4.500000000000000  13.799999999999956

>>

当前非线性拟合和多元拟合的工具较少,这是针对常用的拟合算法,开发的一款数据拟合为主的软件。包括线性拟合的各种算法,非线性拟合的各种算法,以及多元拟合的各种算法。其中提供了很多非线性方程的模型,以满足不同的需求,也可以制定自己所需要的指定非线性方程模型的,采用最先进的初始值估算算法,无需初始值就可以拟合自己想要的非线性方程模型各个模块的介绍如下。 1.线性拟合算法模块 根据最小二乘拟合算法,对输入的数据进行变量指定次方的拟合。同时可对自变量或因变量进行自然对数和常用对数的转换后再拟合。根据实际情况,开发了单调性拟合以针对各种定量分析的用途。同时开发了,针对一组数据,得到最高相关系数的自动拟合功能,由程序自动选择拟合次数以及自变量和因变量的数据格式。 2.非线性拟合算法模块 根据非线性方程的特点,开发了最先进的智能初始值估算算法,配合LM迭代算法,进行非线性方程的拟合。只需要输入自变量和因变量,就可以拟合出所需要的非线性方程。拟合相关系数高,方便快捷。并借助微粒群算法,开发了基于微粒群的智能非线性拟合算法,拟合出方程的相关系数相当高,甚至会出现过拟合现象。 3.多元拟合算法模块 根据最小二乘算法的原理开发了多元线性拟合算法,同时开发了能够指定变元次数的高次多元线性拟合。由于多元变量的情况下函数关系复杂,采用高次多元线性拟合能有效提高拟合效果而不会出现过拟合现象。同时针对每个变元可能最合适的拟合次数不一定都一样,开发了自适应高次多元拟合算法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值