Python 如何使用dopri5(runge-kutta45)将数组的第i个值传递给scipy.integrate?

Python 如何使用dopri5(runge-kutta45)将数组的第i个值传递给scipy.integrate?,python,scipy,parameter-passing,differential-equations,Python,Scipy,Parameter Passing,Differential Equations,我试图使用sci.integrate python module为V(电容器上的电压)求解一个简单的一阶时间ODE: def f(t, V, Vin, vtime, R): return (Vin[vtime==t][0]-V)/(R*get_alpha(V)) R = .5 V0 = 0. t0, dt, tmax = vtime[0], vtime[1]-vtime[0], vtime[-1] result, time = np.zeros_like(V), vtime r =

我试图使用sci.integrate python module为V(电容器上的电压)求解一个简单的一阶时间ODE:

def f(t, V, Vin, vtime, R):
    return (Vin[vtime==t][0]-V)/(R*get_alpha(V))

R = .5
V0 = 0.
t0, dt, tmax = vtime[0], vtime[1]-vtime[0], vtime[-1]
result, time = np.zeros_like(V), vtime

r = ode(f).set_integrator('dopri5')
r.set_initial_value(V0, t0).set_f_params(V, vtime, R)

i = 0

while (r.successful()) & (r.t < tmax):
    result[i] = r.integrate(r.t+dt)[0]
    i+=1
def f(t、V、Vin、vtime、R):
返回(Vin[vtime==t][0]-V)/(R*get_alpha(V))
R=.5
V0=0。
t0,dt,tmax=vtime[0],vtime[1]-vtime[0],vtime[-1]
结果,时间=np.zeros_like(V),vtime
r=ode(f)。设置积分器('dopri5')
r、 设置初始值(V0,t0)。设置参数(V,vtime,r)
i=0
而(r.successful())和(r.t
正如您所见,我的右手边函数取决于输入电压(存储在阵列Vin中)和恒定电阻(R),这两个参数每次都需要作为参数传递到解算器中的函数

scipy文档页面上给出的示例对我来说不够清楚,因为我无法简单地调用r.set_f_参数(Vin,r)


设置这些参数的正确方法是什么?

您需要为
Vin
实现一些插值公式。在最简单的情况下

def getVin(t): k = int( (t-t0Vin)/dtVin ); return Vin[k];
当然,您必须提供
Vin
样本采样时间的参数
t0Vin,dtVin


对于更一般的情况,使用插值函数
numpy.interp
scipy.interpolate.interp1d
时间和函数本身以外的参数可以通过r.set_初始值(V0,t0)进行设置。set_参数(V,vtime,r)但函数中的名称必须是arg1,arg2,等等。

如果我在Vin的每个点积分,则不需要插值。我关心的是将这个数组(然后提取给定时间步长的适当值)或该时间步长的单个电压值传递给rk4方法中的函数。对不起,如果问题一开始就不够清楚的话。Yoiu在一个错误的观念下工作
scipy.integrate.ode
不使用RK4,也不使用固定步骤。你不能保证导数函数在什么时候被调用,并且它们是按时间顺序排列的。最流行的高阶方法来回跳跃。当然,每次
Vin
值更改时,您都可以重新启动集成。因此,应该是完全重启,重置初始点和参数。在下面的链接中,明确指出integrate.ode实现了顺序(4)5 Yes的runge-kutta方法,也称为休眠价格方法。这是一个5阶方法和嵌入的5阶方法(反之亦然)。不是经典的RK4。它使用一个可调整的内部步长,对
integrate
方法中返回的值进行插值。我明白你的意思。这不是我想要的直接答案,但结果证明非常有用。我将投票支持你的答复,谢谢!