Python 矢量化SciPy ode解算器
我的问题是关于当前的scipy ode解算器。从中可以看出,它们的用法是:Python 矢量化SciPy ode解算器,python,scipy,ode,Python,Scipy,Ode,我的问题是关于当前的scipy ode解算器。从中可以看出,它们的用法是: # 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
# 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))
#积分问题和相应的雅可比矩阵:
从scipy.integrate导入ode
y0,t0=[1.0j,2.0],0
def f(t、y、arg1):
返回[1j*arg1*y[0]+y[1],-arg1*y[1]**2]
def jac(t、y、arg1):
返回[[1j*arg1,1],[0,-arg1*2*y[1]]
#整合:
r=ode(f,jac)。设置积分器('zvode',方法='bdf',且雅可比数=True)
r、 设置初始值(y0,t0)。设置参数(2.0)。设置参数(2.0)
t1=10
dt=1
当r.successful()和r.t
我的问题是:它使用了大量python循环(while循环),这从本质上降低了程序的速度。我可以尝试编写一个C代码并使用ctypes使其更快,但我无法访问像scipy中的dopri5这样的优秀算法(除非我自己实现)
是否有任何矢量化的编码方式可以加快速度
谢谢大家! “矢量化”意味着同时进行一系列并行计算。是的,详细的实现将涉及迭代,但它在
C
中,顺序对Python
程序员来说并不重要
但是像这样的ode解决方案本质上是一个串行操作。您必须在时间t
解决问题,然后才能在时间t+dt
解决问题。你不能随时间矢量化解决方案。您最好选择一个ode
解算器,为时间步(dt
)做出智能选择,在可能的情况下选择大步,在需要时选择小步以捕获快速变化
一个好的ode解算器可以让你矢量化空间维度,即并行解算10个ode。您还可以对计算雅可比矩阵进行矢量化,同时返回
y+dy
和y-dy
。基本上,您希望尽可能快地计算f
和jac
。“矢量化”意味着同时进行一系列并行计算。是的,详细的实现将涉及迭代,但它在C
中,顺序对Python
程序员来说并不重要
但是像这样的ode解决方案本质上是一个串行操作。您必须在时间t
解决问题,然后才能在时间t+dt
解决问题。你不能随时间矢量化解决方案。您最好选择一个ode
解算器,为时间步(dt
)做出智能选择,在可能的情况下选择大步,在需要时选择小步以捕获快速变化
一个好的ode解算器可以让你矢量化空间维度,即并行解算10个ode。您还可以对计算雅可比矩阵进行矢量化,同时返回
y+dy
和y-dy
。基本上,您希望尽可能快地计算f
和jac
。这有点晚,但我认为您需要的是。它获取一组时间点并计算每个时间点的解。这使得循环在Python之外(用FORTRAN)计算。这有点晚了,但我认为您需要的是。它获取一组时间点并计算每个时间点的解。这使得循环可以在Python之外(用FORTRAN)计算。非常感谢!这对我来说完全有道理。非常感谢!这对我来说完全有道理。永远不会太迟,伙计!这就是我最后使用的内容,其他人在将来看这篇文章时可能会发现它很有帮助。谢谢!永远不会太迟,伙计!这就是我最后使用的内容,其他人在将来看这篇文章时可能会发现它很有帮助。谢谢!