5

我对几天前写的帖子有一个后续问题,感谢您之前的反馈:

从python中的一组非线性方程中找到复根

我现在已经在 python 中设置了非线性方程组,这样 fsolve 将独立处理实部和虚部。但是,python“fsolve”仍然存在收敛到正确解决方案的问题。我的输入与 Matlab 中使用的输入完全相同,经过仔细检查,方程组也完全相同。Matlab,无论我如何设置初始值,总是会收敛到正确的解决方案。然而,对于 python,每个初始条件都会产生不同的结果,而且永远不会产生正确的结果。几分之一秒后,python 出现以下警告:

/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/scipy/optimize/minpack.py:227: 
RuntimeWarning: The iteration is not making good progress, as measured by the 
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning) 

我想知道 python 和 Matlab 中的 fsolve 之间是否存在一些已知的差异,以及是否有一些已知的方法可以优化 python 的性能。

非常感谢

4

1 回答 1

9

我认为您不应该依赖名称相同的事实。我从您的其他问题中看到您指定 Matlabfsolve使用'levenberg-marquardt'算法而不是默认算法。Pythonscipy.optimize.fsolve使用MINPACK 的hybrd算法。Levenberg-Marquardt通过最小化函数的平方和来近似求根,并且非常稳健。'trust-region-dogleg'它不是像默认算法那样真正的寻根方法。我不知道这些hybrd方案是如何工作的,但它们声称是对鲍威尔方法的修改。

如果您想要类似于您在 Matlab 中所做的事情,我会寻找实现 Levenberg-Marquardt 的优化方案,例如scipy.optimize.root您在上一个问题中也使用过的优化方案。你不使用它有什么原因吗?

于 2014-02-19T16:55:37.810 回答