我试图在数值上解决一个非线性方程组:
def func(p):
x, f = p
return (math.exp(-x/O)-f,
L - L*((1 - math.exp(-x/O))**W) - x*math.exp(-x/O))
我正在以下列方式使用scipy.fsolve:
x, f = fsolve(func, (10, 0.2))
我确定我使用fsolve的方法是正确的:它适用于某些参数范围 . 但是,它完全失败了另一个(例如,O = 8,L = 1.67,W = 8),并出现以下错误:
RuntimeWarning: The number of calls to function has reached maxfev = 600.
我确信它是可以解决的 - 有(至少)matlab工具,它可以做到这一点 . 有什么我做错了还是有其他解决方案我可以尝试?
提前感谢任何提示!
1 回答
遗憾的是,非线性优化和根寻找对起点的选择很敏感 .
请注意,您的参数化似乎是多余的:根的位置不依赖于L,您可以根据
exp(-x/O)
参数化所有内容,这可能会使求解器更容易 .编辑:定义
y = exp(-x/O)
. 然后你的第一个等式告诉你,根发现实际上是一维的(意味着你可以使用例如更强大的brentq
) . 但你也可以使用fsolve: