python - 用 odeint 求解一阶耦合 ODE 的代码的尺寸误差
问题描述
我已经为一阶 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.
解决方案
试试这个:它只是你的函数应该返回的一个例子
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 并且它有效,但我不确定这是您正在寻找的确切输出. 因此,只需尝试从您的函数返回一个值。
希望这可以帮助...
推荐阅读
- sql - 遗留 DB2 SQL 查询连接简化
- python - 在 python pandas 过滤器中编辑数据并将其应用于原始数据框
- apache-spark - 如何使用 pyspark 从每日数据中计算 6 个月移动平均值
- dart - Catch 语句不会在异步函数的调试模式下捕获抛出的错误
- r - 如何使用 reticulate 包将任何 R 对象转换为 python 集合对象
- java - 在运行时,在 Java 中获取传递给方法的参数/参数的数量,无论是否带有可变参数
- xml - Orchestration with Error 中的 XPATH 问题具有无效的令牌
- sql - 根据与第一个表中的列名相关的另一个表中的值更新一个表中的 SQL Server 表值
- php - 如何在 Silverstripe 中限制对 $has_one 成员的对象访问?
- python - Python中的Unicode作为procmail过滤器的问题