Ошибка измерения в коде для решения связанного ODE первого порядка с odeint

Я написал этот код для системы ODE первого порядка, но, очевидно, python понимает y как целое число, когда я имел в виду список. Может кто увидит ошибку? Я просто не знаю, где это.

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

def pfr_model_deltaP(P, X):
    alpha = [0.019, 0.0075]
    P0 = 1.013e6

    dmdX = 5.40/(0.03591*exp((8.39 - 37.78/(4.5 + 5*X)))*((1-X)/(1+X))*(4.5/(4.5 + 5*X))*(P/P0))
    dPdm = -(alpha[0]/2)*(X**2 + 1.90*X + 0.901)*(P0/P)

    return [dmdX, dPdm]

y0 = 1.013e6
X = np.linspace(0, 0.95, 100)
y = odeint(pfr_model_deltaP, y0, X)

m = y[:, 0]
P = y[:, 1]

plt.plot(X, m)
plt.xlabel('Conversion')
plt.ylabel('Mass')
plt.show()

plt.plot(m, P)
plt.xlabel('Mass (kg)')
plt.ylabel('Pressure')
plt.show()

Сообщение об ошибке:

RuntimeError                              Traceback (most recent call last)
<ipython-input-6-3d4f22debf1d> in <module>
     15 y0 = 1.013e6
     16 X = np.linspace(0, 0.95, 100)
---> 17 y[m, P] = odeint(pfr_model_deltaP, y0, X)
     18 
     19 plt.plot(X, m)

c:\users\idril\appdata\local\programs\python\python36\lib\site-packages\scipy\integrate\odepack.py in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg, tfirst)
    242                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
    243                              ixpr, mxstep, mxhnil, mxordn, mxords,
--> 244                              int(bool(tfirst)))
    245     if output[-1] < 0:
    246         warning_msg = _msgs[output[-1]] + " Run with full_output = 1 to get quantitative information."

RuntimeError: The array return by func must be one-dimensional, but got ndim=2.

person Idril Valar    schedule 04.06.2019    source источник
comment
docs.scipy.org/doc/scipy/reference/ сгенерировано /   -  person Chetan Vashisth    schedule 05.06.2019


Ответы (1)


Попробуйте следующее: это просто пример того, что должна возвращать ваша функция

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

def pfr_model_deltaP(P, X):
    alpha = [0.019, 0.0075]
    P0 = 1.013e6

    dmdX = 5.40/(0.03591*exp((8.39 - 37.78/(4.5 + 5*X)))*((1-X)/(1+X))*(4.5/(4.5 + 5*X))*(P/P0))
    dPdm = -(alpha[0]/2)*(X**2 + 1.90*X + 0.901)*(P0/P)

    return dPdm 

y0 = 1.013e6
X = np.linspace(0, 0.95, 100)
y = odeint(pfr_model_deltaP, y0, X)

m = y[:]
P = y[:]

plt.plot(X, m)
plt.xlabel('Conversion')
plt.ylabel('Mass')
plt.show()

plt.plot(m, P)
plt.xlabel('Mass (kg)')
plt.ylabel('Pressure')
plt.show()

В этот момент вы возвращаете 2 значения, которые представляют собой 2 тусклых массива, но odeint принимает функцию, которая возвращает только одно значение, поэтому я вернул только один из ваших var, и он сработал, но я не уверен, что это точный результат, который вы ищете . Так что просто попробуйте вернуть одно значение из вашей функции.

Надеюсь это поможет...

person Chetan Vashisth    schedule 05.06.2019
comment
Другой вариант, о котором я думал об этом, заключается в том, что начальное значение y0 должно быть списком длиной 2, который распаковывается внутри функции. Зависит от того, какие исходные оды решаются. - person PirateNinjas; 05.06.2019