Возьмите переменные из функции define в python

У меня есть вопрос по извлечению переменных в def

Например,

def func(z,W):
    A = z[1]
    B = z[2]
    C = z[3]
    Var = k*B/C
    dAdW = A*3
    dBdW = B*2/Var
    dCdW = C**2*Var**2
    return dAdW, dBdW, dCdw
init = [0,0,1]
W = np.linspace(0,100,1000)
sol = odeint(func, init, W)
plt.plot(W,sol[:,0])
plt.plot(W,Var) # ----> this one

Поскольку Var не является дифференциальным уравнением,

Я не могу объявить Var как Var = z[4]

Я попытался использовать глобальный, но он только возвращает последнее значение.

Как получить все значения Var в массиве, чтобы я мог построить Var?

k постоянная, как 1

Спасибо, что заглянули в это!

Вот полный код:

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

alpha = 0.0002
Uapb = 0.5
deltaH = -20000
Cpa = Cpb = 20
Cpi = 40
Ea = 25000
Kc1 = 100 # @ T=303
k1 = 0.004 #@ T=310K
CPcool = 20
Fao = 5
Cao = 1
mc = 1000
R = 1.987
To = 330


def func(z,W):
    pbar = z[0]
    X = z[1]
    Ta = z[2]
    T = z[3]
    k = k1*np.exp(Ea/R*(1/310-1/T))
    Kc = Kc1 * np.exp(deltaH / R * (1 / 303 - 1 / T))
    Ca = Cao * (1 - X) * To / T * pbar
    Cb = Cao*(1-X)*To/T*pbar
    Cc = 2*Cao*To/T*pbar
    Ci = To/T*pbar
    ra = k*(Ca*Cb-Cc**2/Kc)
    dxdw = -ra/Fao
    dpbardw = -alpha/(2*pbar)*T/To
    dTadw = (Uapb)*(T-Ta)/(mc*CPcool)
    dTdw = (Uapb*(Ta-T)+ra*deltaH)/(Fao*(Ca+Cb+Ci))
    return dxdw, dpbardw, dTadw, dTdw

init = [1, 0, 320, 320]
W = np.linspace(0,4500,1000)


sol = odeint(func, init, W)
#Xe = (2 * Kc - ((2 * Kc) ** 2 - 4 * Kc * (Kc - 4)) ** (1 / 2)) / (2 * (Kc - 4))
plt.plot(W, sol[:,0])
#plt.plot(W, Xe)

1 ответ

Решение

Чтобы захватить данные от каждого вызова, вы можете сделать что-то вроде этого:

capture_var = []

def func(z,W):
    Var = ...

    global capture_var
    capture_var.append(Var)

Пожалуйста, обратите внимание: это скорее взлом, и если вы делаете какие-то базовые сценарии для решения небольших проблем, то, скорее всего, все в порядке. Однако, если вы работаете с кодовой базой любого размера, пожалуйста, не делайте этого, так как подобные практики могут быть кошмаром обслуживания.

Другие вопросы по тегам