Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矢量化SciPy ode解算器_Python_Scipy_Ode - Fatal编程技术网

Python 矢量化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

我的问题是关于当前的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 [[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)计算。

非常感谢!这对我来说完全有道理。非常感谢!这对我来说完全有道理。永远不会太迟,伙计!这就是我最后使用的内容,其他人在将来看这篇文章时可能会发现它很有帮助。谢谢!永远不会太迟,伙计!这就是我最后使用的内容,其他人在将来看这篇文章时可能会发现它很有帮助。谢谢!