2016-06-09 50 views
0

我試圖解決使用scipy.integrate.odeint衰變方程。我試圖從字典中獲得初始值,但它不起作用,我不確定它是否可以工作。這裏是我正在使用的代碼:使用scipy.integrate.odeint與字典[Python]

from scipy.integrate import odeint 
import numpy as np 
import matplotlib.pyplot as plt 

def decay(init,t): 
    f0 = - init['a']/.5 
    f1 = init['a']/.5 - init['b']/.2 
    f2 = init['b']/.2 
    return [f0,f1,f2] 

if __name__ == '__main__': 
    init = {'a':5, 'b':0, 'c':0} 
    time = np.linspace(0, 10, 101) 
    soln = odeint(decay, init ,time) 
    a = soln[:,0] 
    b = soln[:,1] 
    c = soln[:,2] 
    print a 
    print b 
    print c 
    plt.plot(time, a, color = 'g') 
    plt.plot(time, b, color = 'r') 
    plt.plot(time, c, color = 'b') 
    plt.show() 

它的工作原理是,如果預期的,而不是一本字典我用像這樣的列表:

from scipy.integrate import odeint 
import numpy as np 
import matplotlib.pyplot as plt 

def decay(init,t): 
    a,b,c = init 
    f0 = - a/.5 
    f1 = a/.5 - b/.2 
    f2 = b/.2 
    return [f0,f1,f2] 

if __name__ == '__main__': 
    init = [5,0,0] 
    time = np.linspace(0, 10, 101) 
    soln = odeint(decay, init ,time) 
    a = soln[:,0] 
    b = soln[:,1] 
    c = soln[:,2] 
    print a 
    print b 
    print c 
    plt.plot(time, a, color = 'g') 
    plt.plot(time, b, color = 'r') 
    plt.plot(time, c, color = 'b') 
    plt.show() 

不過,我需要使用一個字典我的目的。有沒有辦法使用字典來調用初始值?

+0

根據文檔,第二個參數應該是一個數組 - 'numpy'將列表轉換爲數組非常好,但它不會將字典轉換爲數組...所以您要求的可能是是不可能的... – mgilson

+0

哦,是的,現在我明白了。好眼睛 – greenthumbtack

回答

1

如果這個工程:

init = [5,0,0] 
time = np.linspace(0, 10, 101) 
soln = odeint(decay, init ,time) 

那麼這應該還有:

adict = {'a':5, 'b':0, 'c':0} 
init = [adict['a'],adict['b'],adict['c']] 
time = np.linspace(0, 10, 101) 
soln = odeint(decay, init ,time) 

換句話說,無論你在哪裏得到這個字典中,你需要將其值轉換成名單。

init = adict.values()(或PY3 list(adict.values()))將行不通,因爲字典訂單我行我素鍵:

In [306]: list({'a':5, 'b':0, 'c':0}.values()) 
Out[306]: [0, 0, 5] 

或鍵列表較長,這可能是簡單的:

In [307]: adict = {'a':5, 'b':0, 'c':0} 
In [308]: init = [adict[k] for k in ['a','b','c']] 
In [309]: init 
Out[309]: [5, 0, 0]