Python中的向量化根查找

计算科学 数值分析 Python 牛顿法
2021-12-13 20:28:09

我有一个大小为 (254, 80) 的数组,我正在尝试使用 Scipy 的 fsolve。我发现在向量上使用 fsolve 的速度比在 for 循环中更快,但仅适用于长度不超过 100 个值的向量。此后,速度迅速下降并变得非常缓慢,有时甚至完全停止。

我目前正在遍历数组的一维并在较小的维度上使用矢量化 fsolve ,但它仍然比我预期/喜欢的要长。

有没有人对此有很好的解决方法或知道类似的函数会很高兴处理更大尺寸的向量?我已经尝试过 Scipy 的 Newton Krylov 函数,经过测试,它对于简单函数来说确实很快,但它比我的函数上的 fsolve 慢。- 如果我使用分析雅可比,这会更快吗?如果是这样,我该如何实施?

我想知道这是否是我最初的解决方案的问题,但差异在 ~0.001 - 0.8 的范围内,这似乎还不错。虽然也许是这个?

这是当前代码:

for i in range(array.shape[0]):
    f = lambda y: a[i] - m[i]*y - md[i]*(( y**4 + 2*(y**2)*np.cos(Thetas[i,:]) )**0.25)
    ystar[i,:] = fsolve(f, y0[i]) 

(变量 a、m 和 md 的大小都相同,即 (254,80))

进一步深入研究,我发现了一个功能,例如

f = lambda y: y*np.tanh(y) - a0/(m**2)

比解决更快

f = lambda y: (m**2)y*np.tanh(y) - a0

其中 m 和 a0 是大型 2D np 数组。

谁能解释这是为什么?

0个回答
没有发现任何回复~