我正在使用scipy.integrate来解决一个ODE系统。我的代码的摘要如下所示:
# step 1: import all necessary modules and functions imports here
import numpy as np
from scipy.integrate import ode
# step 2: define ode sys
def ode_rhs(t, y, p1, p2, ..., pn):
''' do some stuff to define rhs'''
return ydot
# step 3: set parameters p1, p2, ..., pn
"""
p1 = ...
p2 = ...
...
pn = ...
"""
# step 4: set time parameters
ts = 0.0
tf = 340.
# step 5: set initial conditions
y0 = np.zeros(some_shape)
# step 6: set ode solver
#backend = 'dopri5'
backend = 'vode'
r = ode(ode_rhs).set_integrator(backend, method='BDF', atol=1e-12, rtol=1e-6)
r.set_initial_value(y0,ts)
# step 7: store solution
t = [ts]
y = [y0]
# step 8: call ode rhs and integrate
while r.successful() and r.t < tf:
r.set_f_params(p1, p2, ..., pn)
r.integrate(tf, step=True)
t.append(r.t)
y.append(r.y)
# step 9: process output for plotting
t = array(t)
y = array(y).T
求解器在用于推进解决方案的任何时间步长输出y的值。我需要的是特定时间(0,1,2,... 339)的输出,而不是解算器内部使用的时间步长。我本可以使用r.integrate(t + dt)。但是,我必须使用变量步进来减少模拟时间。