2017-04-27 21 views
0

私は長時間(1800秒)にわたって温度をプロットしようとしています。私はfunc2がfunc1と2つの初期値に依存するという2つの初期値の問題があります。ここ Python- 2つの方程式を使ってodeintを使う

は2つの機能である:

Aは、物質の濃度であり、温度は温度で
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) 

私の初期値は次のとおりです。

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

はここで、これまでに私のコードです:それはちょうど間違っているthis graph生成

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) 

。この図の上の曲線のようになります。here

どこが間違っていますか?

+0

。 '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) 

私は期待したカーブを得ました。

はここにあなたのコードの修正版だし、結果のプロット:あなたはDFの結果の座標を中心にスワップ

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

関連する問題