我试着用数值方法求解一个非线性方程组:
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.F溶剂通过以下方式:
^{pr2}$我确信我使用fsolve的方法是正确的:它对特定的参数范围非常有效。但是,对于另一个(例如,O=8,L=1.67,W=8)则完全失败,错误如下:
RuntimeWarning: The number of calls to function has reached maxfev = 600.
我确信这是很好解决的——至少有(至少)matlab工具可以解决这个问题。我有什么地方做错了吗?或者有其他的解决方法可以尝试吗?在
提前感谢您的任何提示!在
不幸的是,非线性优化和寻根对起始点的选择非常敏感。在
请注意,您的参数化似乎是多余的:
根的位置不依赖于您可以按照L
,并且exp(-x/O)
参数化所有内容,这可能会使求解器更容易。在编辑:定义
^{pr2}$y = exp(-x/O)
。然后你的第一个方程告诉你,找根实际上是一维的(这意味着您可以使用更健壮的brentq
)。但也可以使用fsolve:相关问题 更多 >
编程相关推荐