【问题标题】:Generalize a function for an ODE solver泛化 ODE 求解器的函数
【发布时间】:2016-07-04 16:02:45
【问题描述】:

我有下一个方程组:

#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 作为返回值结束,只是为了结束函数,但如果时间长度也增加,则应该增加),我的意思是,使其适用于任何时间长度以及能够为跳跃指定不同的间隔分段函数。

提前致谢

【问题讨论】:

    标签: python ode


    【解决方案1】:

    stp 与参数t 具有明确定义的关系。您可以将所有t &lt; 20 替换为整数除法:

    def stp(t):
       if t < 20:
           return float(t//4)
       else:
           return 5.0
    

    通常,对于所有范围,包括远远超过 20 的范围:

    def stp(t):
        return float(t//4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多