【发布时间】:2021-07-28 21:06:11
【问题描述】:
我正在尝试通过使用 Rosenbrock 函数来了解如何在 R 库 minpack.lm 中使用 nls.lm,以查看算法是否在 f(x,y) = (1,1) 处收敛到全局最小值.无论有没有分析雅可比行列式,我都这样做。在这两种情况下,我都会收到一条警告,告诉我该算法已决定将对 nls.lm 的调用中指定的最大迭代次数恢复为 1024:
Warning messages:
1: In nls.lm(par = initpar, fn = objective_rosenbrock, jac = gradient_rosenbrock, :
resetting `maxiter' to 1024!
2: In nls.lm(par = initpar, fn = objective_rosenbrock, jac = gradient_rosenbrock, :
lmder: info = -1. Number of iterations has reached `maxiter' == 1024.
由于我最初的猜测是 (-1.2, 1.0),因此算法永远不会达到 (1,1)。我在 GitHub 上找到了该库的源代码,以下代码行与此处相关:
https://github.com/cran/minpack.lm/blob/master/src/nls_lm.c
OS->maxiter = INTEGER_VALUE(getListElement(control, "maxiter"));
if(OS->maxiter > 1024) {
OS->maxiter = 1024;
warning("resetting `maxiter' to 1024!");
}
为什么将最大迭代次数限制为 1024 是否有任何逻辑?有位和 2^10 的东西?我想将该库用于不同的应用程序,但这个迭代上限可能会阻止这种情况。任何见解将不胜感激。
【问题讨论】:
-
有一个(相对)新的包 'nlsr' 旨在用纯 R 实现替换
nls(),并且还应该比例如 'minpack.lm' 更稳定和可靠.我会试一试——尽管对于大型应用程序来说它可能比“minpack.lm”慢。
标签: r mathematical-optimization levenberg-marquardt