gpt4 book ai didi

python - Scipy 的 fsolve 替代品?

转载 作者:行者123 更新时间:2023-11-30 22:57:45 27 4
gpt4 key购买 nike

我正在尝试对非线性方程组进行数值求解:

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 工具可以做到这一点。我做错了什么或者我可以尝试其他解算器吗?

预先感谢您的任何提示!

最佳答案

不幸的是,非线性优化和求根对起点的选择很敏感。

In [19]: def func(p):
x, f = p
return [np.exp(-x/O) -f, L - L*((1 - np.exp(-x/O))**W) - x*np.exp(-x/O)]
....:

In [20]: O, L, W = 8, 1.67, 8

In [21]: res = fsolve(func, [1, 1.2])

In [22]: res
Out[22]: array([ 2.19804447, 0.75975782])

In [23]: func(res)
Out[23]: [-2.2204460492503131e-16, -4.4408920985006262e-15]

请注意,您的参数化似乎是多余的:根的位置不依赖于L,并且您可以根据exp(-x/O) 这可能会让求解器变得更容易。

编辑:定义y = exp(-x/O)。然后你的第一个方程告诉你求根实际上是一维的(这意味着你可以使用例如更稳健的brentq)。但您也可以使用 fsolve:

In [43]: ry = fsolve(lambda y: 1 - (1-y)**W + (O/L)*y*np.log(y), 0.4)

In [44]: ry
Out[44]: array([ 0.75975782])

关于python - Scipy 的 fsolve 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com