2014-12-13 121 views
1

我試圖讓一個參數根據當前時間根據模型而改變。如何隨時間改變Python中動態系統的參數?

我設置了一個功能:

def func(state,t): 
    x = state[0] 
    y = state[1] 
    z = state[2] 

    Iapp = 0.7 

    xd = ... + Iapp 
    yd = ... 
    zd = ... 

我想有IAPP隨時間變化。也就是說,我需要它是從時間50 -0.7至時間已經產生字面上沒有變化,我圖500

我目前的工作:

for t in range(50,500): 
    Iapp = -0.7 
else: 
    Iapp = 0.7 

任何想法?

回答

4

您的密碼將設置爲Iapp-0.7 450次,然後將其設置爲0.7。這就是爲什麼你沒有看到任何改變。你需要的是一個if statement

if 50 <= t <= 500: 
    Iapp = -0.7 
else: 
    Iapp = 0.7 

或者,如果你想要一個班輪:

Iapp = -0.7 if 50 <= t <= 500 else 0.7 
+0

非常感謝!我不明白Python中'for'和'if'的區別,但我現在就明白了。 – 2014-12-13 18:28:48

+1

@RobbieCapps如果是這樣的話,你應該[通過教程](https://docs.python.org/3/tutorial/index.html)。這些東西不僅對Python,而且對於大多數編程語言都很重要。對基礎知識的深入理解將在以後幫助你。 – Carsten 2014-12-13 19:35:52

+0

再次,我衷心感謝幫助。我環顧四周,雖然我現在明白了'if'和'for'陳述的作用,但我仍然不確定_why_,或更好的_how_。如果我理解正確,'for'不會看t的值的範圍,而只是改變我放入範圍的次數的值。而「if」實際上會檢查t的個別值。這是因爲'if'不知何故_checks_每個值,因爲它遍歷每個索引,有點像枚舉? – 2014-12-15 19:30:43

1

另一種方法是定義時間的ODE外變化的參數。這允許您在不修改ODE功能的情況下更改參數。一種方法是將強制參數傳遞爲與時間陣列長度相同的數組。假設T0 = 0,更改您的來電:與SciPy的的odeint

import numpy as np 

def func(state, t, Iapp_all, sampling_rate): 
    Iapp = Iapp_all[np.floor(t * sampling_rate)] 
    ... 

用法示例。

from scipy.integrate import odeint 

y0 = [0, 0] 
sampling_rate = 1. 
t = np.arange(500)/sampling_rate 
Iapp_all = -.7 * np.ones_like(t) 
Iapp_all[:51] = .7 
y = odeint(func, y0, t, args=(Iapp_all, sampling_rate)) 
+0

有趣。我會在完成這個項目後嘗試這個。 – 2014-12-13 19:24:34

相關問題