2017-04-27 75 views
0

我試圖繪製一段時間(1800秒)的溫度。我有兩個初始值問題,其中func2依賴於func1和兩個初始值。Python-使用兩個方程的odeint

這裏有兩個功能:

rate = dA/dt = -(3.083e8*np.exp(-56000/(8.314*Temp))*A*0.033) 

dT/dt = (-0.45*-98000*rate+5.7431*(273.15-Temp))/(2018.94) 

其中A是物質的濃度和溫度是這樣的溫度。

我的初始值是:

T[0]=281.15 
A[0]=6.529 

這裏是我到目前爲止的代碼:

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

t = np.linspace(0,1800,100) #timeline 
c0 = np.array([281.15,6.529]) #initial values 

def df(c, t): 
    Temp = c[0] 
    A = c[1] 
    rate = -(3.083e8*np.exp(-56000/(8.314*Temp))*A*0.033) 
    dTdt = (-0.45*-98000*rate+5.7431*(273.15-Temp))/(2018.94) 
    return np.array([dTdt, rate]) 

sol = odeint(df, c0, t) 
plt.plot(t, sol) 

它只是產生this graph這是不對的。它應該看起來像上圖中的曲線:here

我在哪裏出錯了?

+0

您在DF的結果換周圍的座標。它應該是:'return np.array([dTdt,rate])' –

+0

當'Temp'爲8時,表達式'exp(-56000 /(8.314 * Temp))'下溢爲0。 'Temp'?阿列紐斯方程要求開爾文的溫度。 –

+0

切換返回結果並將初始溫度更改爲開爾文(攝氏溫度)仍然得到不正確的圖表... – tlb

回答

0

顯然你在dT/dt方程中有一個符號誤差。當我將其更改爲

dTdt = (0.45*-98000*rate + 5.7431*(273.15-Temp))/(2018.94) 

我得到了預期的曲線。

這是你的代碼的修改版本,並將得到的情節:

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

t = np.linspace(0, 1800, 901) # timeline 
c0 = np.array([281.15, 6.529]) # initial values 

def df(c, t): 
    Temp = c[0] 
    A = c[1] 
    rate = -(3.083e8*np.exp(-56000/(8.314*Temp))*A*0.033) 
    dTdt = (0.45*-98000*rate + 5.7431*(273.15 - Temp))/(2018.94) 
    return np.array([dTdt, rate]) 

sol = odeint(df, c0, t) 
plt.plot(t, sol[:,0] - 273.15) 
plt.xlabel('t (sec)') 
plt.ylabel('T (degrees C)') 
plt.grid() 
plt.show() 

plot