2016-09-20 8 views
0

Я пытаюсь воспроизвести два приведенных ниже графика, которые представляют собой профили температуры и концентрации в зависимости от времени. Я проверил свой метод и код миллион раз, но не могу найти ошибки в нем, но я не могу воспроизвести эти графики. Все значения - это константы, кроме CA и T. Может быть, проблема с точностью odeint от scipy? Любая помощь приветствуется!Ошибка в использовании scipy odeint для системы ODE

двух уравнений заключаются в следующем:

дк/дт = д * (CAI - СА)/В - к * СА

дТ/дт = ш * (Тi - Т)/(V р) + d_HR к СА/(р С) + UA * (Тс - Т)/(V р С)

код:

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

def ODESolve(y, t, q, CAi, V, k0, w, Ti, p, dH_R, C, UA, Tc): 

    CA, T = y 
    k = k0*np.exp(8750*1/T) 
    dydt = [q*(CAi - CA)/V - k*CA, w*(Ti - T)/(V*p) + \ 
      dH_R*k*CA/(p*C) + UA*(Tc - T)/(V*p*C)] 

    return dydt 

q = 100 
CAi = 1.0 
V = 100 
p = 1000 
C = .239 
dH_R = 5*(10**4) 
k0 = 7.2*(10**10) 
UA = 5*10**4 
CA0 = .5 
T0 = 350 
Ti = T0 
w = p*q 

y0 = [CA0, T0] 
t = np.linspace(0, 20, 100) 

Tc = 305 
sol1 = odeint(ODESolve, y0, t, args = (q, CAi, V, k0, w, Ti, p, dH_R, C, UA, Tc)) 

Tc = 300 
sol2 = odeint(ODESolve, y0, t, args = (q, CAi, V, k0, w, Ti, p, dH_R, C, UA, Tc)) 

Tc = 290 
sol3 = odeint(ODESolve, y0, t, args = (q, CAi, V, k0, w, Ti, p, dH_R, C, UA, Tc)) 

plt.figure(1) 
plt.plot(t, sol1[:,0], label = 'Tc = 305') 
plt.plot(t, sol2[:,0], label = 'Tc = 300') 
plt.plot(t, sol3[:,0], label = 'Tc = 290') 
plt.ylim(ymax = 1, ymin = 0) 
plt.title ('CA(t)') 
plt.legend(loc = 'best') 

plt.figure(2) 
plt.plot(t, sol1[:,1], label = 'Tc = 305') 
plt.plot(t, sol2[:,1], label = 'Tc = 300') 
plt.plot(t, sol3[:,1], label = 'Tc = 290') 
plt.ylim(ymax = 450, ymin = 300) 
plt.legend(loc = 'best') 
plt.title ('T(t)') 

plt.show() 

Вот что графики должны производить:

enter image description here

А вот выход из моего кода выше:

enter image description here enter image description here

+0

Дважды проверьте эту формулу: 'k = k0 * np.exp (8750 * 1/T)'. В полном раскраске в темноте я изменил знак внутри экспоненты, поэтому «k = k0 * np.exp (-8750 * 1/T)» и получил результаты, похожие на ожидаемые графики, которые вы показать. –

+0

Ты бог ... Это совершенно верно! Вау, какое облегчение. Если вы представите это в качестве ответа, я был бы более чем счастлив представить ваш ответ в качестве ответа. Благодаря! –

+0

ОК, ответ отправлен. –

ответ

1

Видимо есть ошибка знак в формуле k = k0*np.exp(8750*1/T). Если вы измените это на k = k0*np.exp(-8750*1/T), вы получите графики, подобные тем, которые вы ожидаете.

 Смежные вопросы

  • Нет связанных вопросов^_^