Решение дифференциального уравнения с ODEINT в python - PullRequest
1 голос
/ 30 октября 2019

У меня есть связанная система дифференциальных уравнений, которую я уже решил с помощью Эйлера в Excel. Теперь я хочу уточнить это с помощью ODE-решателя в Python. Однако в моем коде должна быть ошибка, потому что кривые выглядят иначе, чем в Excel. Я не ожидаю, что в конце кривые достигнут 1 и 0.

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

# define reactor
def reactor(x,z):
    n_a = x[0]
    n_b = x[1]
    n_c = x[2]

    dn_adz = A * (-1) * B * (n_a/(n_a + n_b + n_c)) / (1 + C * (n_c/(n_a + n_b + n_c)))
    dn_bdz = A * (1) * B * (n_a/(n_a + n_b + n_c)) / (1 + C * (n_c/(n_a + n_b + n_c)))
    dn_cdz = A * (1) * B * (n_a/(n_a + n_b + n_c)) / (1 + C * (n_c/(n_a + n_b + n_c)))
    dxdz = [dn_adz,dn_bdz,dn_cdz]
    return dxdz

# initial conditions
n_a0 = 0.5775
n_b0 = 0.0
n_c0 = 0.0
x0 = [n_a0, n_b0, n_c0]

# parameters
A = 0.12
B = 3.1e-9
C = 4.02e15

# number of steps
n = 100

# z step interval (m)
z = np.linspace(0,0.0274,n)

# solve ODEs
x = odeint(reactor,x0,z)


# Plot the results
plt.plot(z,x[:,0],'b-')
plt.plot(z,x[:,1],'r--')
plt.plot(z,x[:,2],'k:')
plt.show()

Является ли проблема с начальным условием, которое остается постоянным и не меняется от шага к шагу? Должно ли это быть как в Excel с Euler, где следующий шаг использует условия / значения драгоценного шага?

1 Ответ

0 голосов
/ 31 октября 2019

Из структуры правых сторон вы получаете постоянные комбинации переменных состояния, n_a+n_b=n_a0+n_b0 и n_a+n_c=n_a0+n_c0. Это означает, что динамика сводится к одномерной динамике n_a.

По первому уравнению производная n_a отрицательна для положительного n_a, так что решение падает в направлении n_a=0. По константам динамики n_b сходится к n_a0+n_b0 и n_c сходится к n_a0+n_c0.

Неясно, как вы получаете сходимость к 1 в некоторых компонентах, поскольку это не такподдерживается начальными условиями. Кроме того, описанный odeint результат соответствует этому качественному поведению.

...