首页 文章

矢量化的SciPy颂歌解算器

提问于
浏览
0

我的问题是关于当前scipy颂歌解决者 . 从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这样的好算法(除非我自己实现) .

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

谢谢!

2 回答

  • 3

    'vectorization'意味着同时进行一系列并行计算 . 是的,详细的实现将涉及迭代,但它在 C 并且顺序对您来说无关紧要, Python 程序员 .

    但像这样的ode解决方案本质上是一个串行操作 . 在 t+dt 时解决问题之前,您必须在时间 t 解决问题 . 您无法通过时间对解决方案进行矢量化 . 你能做的最好的事情就是选择一个 ode 求解器,它可以为时间步长( dt )做出明智的选择,尽可能采取重大步骤,在需要捕捉快速变化时做出小步骤 .

    一个好的颂歌解算器可以让你矢量化空间维度 - 即并行解决10个颂歌 . 您也可以向量化计算雅可比行列式,同时返回 y+dyy-dy . 基本上你想尽可能快地计算 fjac .

  • 2

    这有点晚了,但我认为你需要的是scipy.integrate.odeint . 它需要一系列时间点并计算每个时间点的解决方案 . 这使循环在Python之外计算(在FORTRAN中) .

相关问题