泛化 ODE 求解器的函数
Generalize a function for an ODE solver
我有下一个方程组:
#dY0=/dt = k1*S - k2*Y1*Y0
#dY1/dt = k3*S - k4*Y1
其中 S(t) 是阶梯函数,在 t = 4、8、12 时增加一个单位,依此类推。我的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
def stp(t):
if t < 4 and t >= 0:
return 0.0
if t < 8 and t >= 4:
return 1.0
if t < 12 and t >= 8:
return 2.0
if t < 16 and t >= 12:
return 3.0
if t < 20 and t >= 16:
return 4.0
else:
return 5.0
#Initial conditions:
y0 = np.array([1,0])
#Time
t = np.linspace(0, 20, 100)
def f(y,t):
s=stp(t)
k1=2
k2=2
k3=1
k4=1
dy0=k1*s - k2*y[1]*y[0]
dy1=k3*s - k4*y[1]
return (dy0, dy1)
res=odeint(f, y0, t)
我的问题是,如何改进我的 "stp" 功能,以便不写下与我指定的时间点一样多的条件? (它最终给出 5 作为返回值只是为了结束函数,但如果时间长度也增加则应该增加),我的意思是,让它在任何时间长度上通用,并能够为跳跃指定不同的间隔分段函数。
提前致谢
stp
与参数 t
有明确的关系。可以用整数除法代替所有t < 20
:
def stp(t):
if t < 20:
return float(t//4)
else:
return 5.0
一般来说,对于所有范围,包括远远超过 20 的范围:
def stp(t):
return float(t//4)
我有下一个方程组:
#dY0=/dt = k1*S - k2*Y1*Y0
#dY1/dt = k3*S - k4*Y1
其中 S(t) 是阶梯函数,在 t = 4、8、12 时增加一个单位,依此类推。我的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
def stp(t):
if t < 4 and t >= 0:
return 0.0
if t < 8 and t >= 4:
return 1.0
if t < 12 and t >= 8:
return 2.0
if t < 16 and t >= 12:
return 3.0
if t < 20 and t >= 16:
return 4.0
else:
return 5.0
#Initial conditions:
y0 = np.array([1,0])
#Time
t = np.linspace(0, 20, 100)
def f(y,t):
s=stp(t)
k1=2
k2=2
k3=1
k4=1
dy0=k1*s - k2*y[1]*y[0]
dy1=k3*s - k4*y[1]
return (dy0, dy1)
res=odeint(f, y0, t)
我的问题是,如何改进我的 "stp" 功能,以便不写下与我指定的时间点一样多的条件? (它最终给出 5 作为返回值只是为了结束函数,但如果时间长度也增加则应该增加),我的意思是,让它在任何时间长度上通用,并能够为跳跃指定不同的间隔分段函数。
提前致谢
stp
与参数 t
有明确的关系。可以用整数除法代替所有t < 20
:
def stp(t):
if t < 20:
return float(t//4)
else:
return 5.0
一般来说,对于所有范围,包括远远超过 20 的范围:
def stp(t):
return float(t//4)