2016-07-04 12 views
1

I das nächste System von Gleichungen:Verallgemeinern eine Funktion für eine ODE-Solver

#dY0=/dt = k1*S - k2*Y1*Y0 
#dY1/dt = k3*S - k4*Y1 

wobei S (t) eine Stufenfunktion, die bei t = 4 um eine Einheit erhöht, 8, 12 und so weiter . Mein Code ist folgende:

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) 

Meine Frage ist, wie meine „stp“ Funktion verbessert werden, um würde so viele Bedingungen wie Zeitpunkt nicht aufschreiben ich angeben? (es endet mit der Angabe von 5 als Rückgabewert, nur um die Funktion zu beenden, sollte aber zunehmen, wenn die Zeitlänge ebenfalls zunimmt), ich meine, um es für jede Zeitlänge allgemein zu machen und verschiedene Intervalle für die Sprünge festzulegen der stückweisen Funktion.

Dank im Voraus

Antwort

3

stp hat eine gut mit Bezug auf Parameter t definierte Beziehung. Sie können alle t < 20 mit einer Integer-Division ersetzen:

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

Und im Allgemeinen, für alle Bereiche, auch die weit über 20:

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

danke sehr! es hat perfekt funktioniert – Mau