【问题标题】:How to solve ode when "The array return by func must be one-dimensional, but got ndim=2." occur?当“func返回的数组必须是一维的,但得到ndim=2”时如何解决ode。发生?
【发布时间】:2021-05-17 07:43:30
【问题描述】:

我正在尝试用 odeint 解决 ODE。

我的代码是这样的

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

K = 35.94143542
S = 10
M = 30.03
Vr = 58
R = 8.3145
T = 293.15
Q = 0.4998
Vp = 0.000022
Mr = 18
Pvap = 518624.013
Cv = (40000/0.000022)*0.001
Cr = (40000/0.000022)*(1-0.001)
tr = 0.333333333

t = np.arange(0,4+1e-2,1e-2)

def Cair(C, t):
    if t <= tr:
        dCdt = ((K*S*M*Peq)/(Vr*R*T))-(((K*S)/Vr)+Q)*C
    else:
        dCdt = -(((K*S)/Vr)+Q)*C
    return dCdt        

Peq = (Cv*Pvap)/(Cv+Cr*(M/Mr))

C = odeint(Cair, 0 , t) 

plt.plot(t, C)

def Cvt(c, t):
    dcdt = -((K*S*M)/(Vp*R*T))*(Peq-((C*R*T)/M))
    return dcdt   
s = (K*S*M)/(Vp*R*T)
p = ((K*S*M)/(K*S*R*T+Vr*R*T*Q))*((Cv*Pvap)/(Cv+(Cr*M/Mr)))
q = ((K*S)/Vr)+Q
init = ((s*p*R*T)/M)*(1+(1/q))  
c = odeint(Cvt, init, t)
plt.plot(t, c)

我成功求解并绘制了第一个方程和图形(t 的 Cas 函数),但我未能求解第二个方程并绘制图形(c 作为 t 的函数)

怎么做?

【问题讨论】:

  • Cvt 中的参数是小写的c,但是在dcdt 的公式中,您使用大写的C,此时它是前一个odeint 运行的结果,因此是一个数组。
  • 那么如何解决呢?
  • 通过更正错误并将大写替换为小写c
  • 我必须使用函数C来解决Cvt。如何正确插入函数 C?
  • 请用错误堆栈发布错误。

标签: python ode


【解决方案1】:

我知道这个答案不会帮助你找到问题,但我需要告诉你,这段代码特别令人困惑!

https://www.python.org/dev/peps/pep-0008/#function-and-variable-names

函数名称应为小写,单词之间用下划线分隔。变量名称遵循相同的约定

所以没有 var C 和 c 或 T 和 t,即使它是数学或物理常数并命名它!

您不应使用未传递给函数的变量。我不明白在此代码示例中使用 2 个函数的目的,因为它只被调用一次。

函数中 var 的名称也可以与您调用函数时使用的名称不同。所以不要犹豫,把每个var在函数里写什么,比较容易理解。

def calculate_distance(speed, time):
    return speed*time

s = 30
t = 1
calculate_distance(s, t)

所以说:

# variables
r = 8.3145
t = 293.15
q = 0.4998
...

# list all var you need here
def calculate_dcdt(c, t, tr, k ... q):
    if t <= tr:
        dcdt = ((k*s*m*peq)/(vr*r*t))-(((k*s)/vr)+q)*c_1
    else:
        dcdt = -(((k*s)/vr)+q)*c_1
    return dcdt        

def calculate_cvt(c, t, k, ... peq):
    dcdt = -((k*s*m)/(vp*r*t))*(peq-((c_1*r*t)/m))
    return dcdt 

peq = (vv*pvap)/(cv+cr*(m/mr))    
c_1 = odeint(calculate_dcdt, 0 , t) 
...

【讨论】:

  • 哦。我用不同的方式解决了。无论如何,谢谢你的帮助
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2020-05-24
  • 1970-01-01
  • 2020-01-27
  • 2015-01-06
  • 2019-09-21
相关资源
最近更新 更多