gpt4 book ai didi

python - 矢量化 SciPy 求解器

转载 作者:行者123 更新时间:2023-12-01 22:37:10 30 4
gpt4 key购买 nike

我的问题是关于当前的 scipy ode 求解器。来自scipy doc page ,它们的用法是:

# A problem to integrate and the corresponding jacobian:

from scipy.integrate import ode
y0, t0 = [1.0j, 2.0], 0
def f(t, y, arg1):
return [1j*arg1*y[0] + y[1], -arg1*y[1]**2]
def jac(t, y, arg1):
return [[1j*arg1, 1], [0, -arg1*2*y[1]]]

# The integration:
r = ode(f, jac).set_integrator('zvode', method='bdf', with_jacobian=True)
r.set_initial_value(y0, t0).set_f_params(2.0).set_jac_params(2.0)
t1 = 10
dt = 1
while r.successful() and r.t < t1:
r.integrate(r.t+dt)
print("%g %g" % (r.t, r.y))

我的问题是:它使用了大量的 python 循环(while 循环),这实际上减慢了程序的速度。我可以尝试编写 C 代码并使用 ctypes 使其更快,但我将无法访问像 scipy 中的 dopri5 这样的好算法(除非我自己实现)。

是否有任何矢量化编码方式可以加快速度?

谢谢!

最佳答案

“矢量化”意味着同时进行大量并行计算。是的,详细的实现将涉及迭代,但它是在 C 中,并且顺序对您,Python 程序员来说并不重要。

但像这样的 ode 解决方案本质上是一个串行操作。您必须先在 t 时间解决问题,然后才能在 t+dt 时间解决问题。您不能随时间对解决方案进行矢量化。您可以做的最好的事情是选择一个 ode 求解器,它可以为时间步长 (dt) 做出明智的选择,尽可能大步长,在需要捕捉快速变化时小步长。

一个好的 ode 求解器可以让您矢量化空间维度 - 即并行求解 10 个 ode。您也许还可以向量化计算雅可比行列式,同时返回 y+dyy-dy。基本上,您希望尽可能快地计算 fjac

关于python - 矢量化 SciPy 求解器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267318/

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