我正在尝试使用 Python 中的 odeint 对以下系统进行数值求解: :
我的问题是 k1 取决于 p 的值。当p<=0.01
k1=0
否则k1=5
.
我不确定如何编写具有上述约束的系统。我可以从:
def sys(x,t,flip):
S,T,p = x
dx = [1-T-k1*T,
0.1*(1-S)-k1*S,
-0.2*(1-T-k1*T)+0.1*(1-S)-k1*S]
return dx
在哪里flip
可以是 0.01
值,但我不确定如何为这种情况实现 if 语句,因为我需要集成过程来检查 p
的值每次迭代后。
最佳答案
为了在积分后重建k1
和p
的值,把这个计算放到一个额外的函数中
def kp(T,S):
p = -0.2*T + S
k1lo, k1hi = 0, 5
flip = -0.01
k1 = 0.5*(k1lo+k1hi + (k1hi-k1lo)*np.tanh((p-flip)/1e-8))
return k1,p
然后在 ODE 导数函数中调用它
def ode(t, TS):
T, S = TS
k1,_ = kp(T,S)
dTdt = 1 - T - k1*T
dSdt = 0.1*(1 - S) - k1*S
return dTdt, dSdt
然后在集成之后沿着解码件绘制
T,S = sol.y;
k,p = k1(T,S);
使用每个评论修正的阈值 flip=-0.01
确实获得了振荡行为。
关于python - 使用 odeint 求解带有阶跃函数参数的 ODE 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58261779/