2016-07-04 5 views
1

する機能を一般:ODE Iは、式の次のシステムを有するソルバ

#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を与えることで終了しますが、時間の長さが増えれば増えるはずです)、つまり、任意の時間長に対して一般的にすること、ジャンプの間隔を指定することができること区分的な機能の予め

おかげ

答えて

3

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) 
+0

どうもありがとうございました!それは完全に働いた – Mau

関連する問題