我刚才问了这个问题.我不确定是否应将此作为答案或新问题发布.我没有答案但是我通过nls.lm
在R中应用Levenberg-Marquardt算法"解决"了这个问题,当解决方案在边界时,我运行信任区域反射算法(TRR,在R中实现)来执行远离它.现在我有了新的问题.
根据我的经验,以这种方式,程序达到最佳状态,并且对起始值不那么敏感.但这只是一种实用的方法,可以解决我遇到的问题nls.lm
以及R中的其他优化函数.我想知道为什么nls.lm
这种方式对于边界约束的优化问题以及如何nls.lm
在实践中使用时处理边界约束.
下面我举例说明使用的两个问题nls.lm
.
library(devtools)
install_github("KineticEval","zhenglei-gao")
library(KineticEval)
data(FOCUS2006D)
km <- mkinmod.full(parent=list(type="SFO",M0 = list(ini = 0.1,fixed = 0,lower = 0.0,upper =Inf),to="m1"),m1=list(type="SFO"),data=FOCUS2006D)
system.time(Fit.TRR <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'TRR'))
system.time(Fit.LM <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'LM',ctr=kingui.control(runTRR=FALSE)))
compare_multi_kinmod(km,rbind(Fit.TRR$par,Fit.LM$par))
dev.print(jpeg,"LMvsTRR.jpeg",width=480)
Run Code Online (Sandbox Code Playgroud)
描述模型/系统的微分方程是:
"d_parent = - k_parent * parent"
"d_m1 = - k_m1 * m1 + k_parent * f_parent_to_m1 * parent"
Run Code Online (Sandbox Code Playgroud)
在左边的图中是带有初始值的模型,中间是使用"TRR"的拟合模型(类似于Matlab lsqnonlin
函数中的算法),右边是使用"LM"的拟合模型nls.lm
.查看拟合参数(Fit.LM$par
),您会发现一个拟合参数(f_parent_to_m1
)位于边界处1
.如果我将一个参数的起始值 …
更新:最初的问题是:是否有一个R函数使用在matlab中的"lsqnonlin"函数中实现的相同算法?但是,答案更多与在R中搜索函数有关.我认为答案通常对R用户非常有用.所以我编辑了标题,但在这里再次问了原始问题:在R中,如何进行非线性最小二乘优化,包括求解微分方程?
我做的非线性最小二乘优化和发现功能的MATLAB lsqnonlin
进行比所有的优化算法我R中试图更好(包括函数算法optimx
,nlm
,nlminb
,solnp
在这个意义上,等等),这是更快,找到了"更正确的"解决方案
但是,我没有找到在Matlab中使用的R中的"信任区域反射"算法的实现.有人知道是否已经实施了吗?此外,"信任区域反射"算法是否更适合这种优化算法?