Scipy的F解决方案?

2024-04-20 04:51:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用数值方法求解一个非线性方程组:

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工具可以解决这个问题。我有什么地方做错了吗?或者有其他的解决方法可以尝试吗?在

提前感谢您的任何提示!在


Tags: 方法参数returndef错误方式mathscipy
1条回答
网友
1楼 · 发布于 2024-04-20 04:51:08

不幸的是,非线性优化和寻根对起始点的选择非常敏感。在

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:

^{pr2}$

相关问题 更多 >