繁体   English   中英

Gekko 中偏微分方程中的节点

[英]Nodes in partial differential equations in gekko

我目前正在使用 Gekko 库研究动态热传递 model。 model 由偏微分方程组组成。 如 APMonitor 平台所示,空间变化的微分已离散化,而时间微分已通过有限元正交搭配法进行数值求解。

但是我有一个问题,model 没有解决超过 2 个节点。

这是 model:


import numpy as np

import matplotlib.pyplot as plt


def func_cpl11(t):
    cpl11 = (93.43834 + (108.3577*(t/1000)) + ((-50.86447)*((t/1000)**2)) + (25.58683*((t/1000)**3)) + ((-1.611330)/((t/1000)**2))) / 159.688
    return cpl11

def func_cpl12(t):
    cpl12 = (150.6240) / 159.688
    return cpl12

def func_cpl21(t):   
    cpl21 = (104.2096 + (178.5108*(t/1000)) + (10.61510*((t/1000)**2)) + (1.132534*((t/1000)**3)) + ((-0.994202)/((t/1000)**2))) / 231.533
    return cpl21

def func_cpl22(t): 
    cpl22 = (200.8320 + ((1.586435e-07)*(t/1000)) + ((-6.661682e-08)*((t/1000)**2)) + ((9.452452e-09)*((t/1000)**3)) + ((3.186020e-08)/((t/1000)**2))) / 231.533
    return cpl22

def func_cpl31(t): 
    cpl31 = (-6.076591 + (251.6755*(t/1000)) + ((-324.7964)*((t/1000)**2)) + (168.5604*((t/1000)**3)) + (0.002548/((t/1000)**2))) / 60.0843
    return cpl31

def func_cpl32(t): 
    cpl32 = (58.75340 + (10.27925*(t/1000)) + ((-0.131384)*((t/1000)**2)) + (0.025210*((t/1000)**3)) + (0.025601/((t/1000)**2))) / 60.0843
    return cpl32

def func_cpl4(t): 
    cpl4 = (19.68 + 0.01189*t - 307600/(t**2))*4.184/100.0869
    return cpl4

def func_cpl5(t): 
    cpl5 = (44.93700 + (149.7085*(t/1000)) + ((-74.18274)*((t/1000)**2)) + (11.97670*((t/1000)**3)) + ((-0.629261)/((t/1000)**2))) / 84.3139
    return cpl5

def func_cpl6(t): 
    cpl6 = 8.34 / 12.0107
    return cpl6

def func_cpl71(t):
    cpl71 = (-203.6060 + (1523.290*(t/1000)) + ((-3196.413)*((t/1000)**2)) + (2474.455*((t/1000)**3)) + (3.855326/((t/1000)**2))) / 18.0153
    return cpl71

def func_cpl72(t):
    cpl72 = (30.09200 + (6.832514*(t/1000)) + (6.793435*((t/1000)**2)) + ((-2.534480)*((t/1000)**3)) + (0.082139/((t/1000)**2))) / 18.0153
    return cpl72

def func_cpl8(t):
    cpl8 = (49.95403 + (4.887916*(t/1000)) + ((-0.352056)*((t/1000)**2)) + (0.046187*((t/1000)**3)) + ((-0.825097)/((t/1000)**2))) / 56.077
    return cpl8

def func_cpl9(t):
    cpl9 = (47.25995 + (5.681621*(t/1000)) + ((-0.872665)*((t/1000)**2)) + (0.104300*((t/1000)**3)) + ((-1.053955)/((t/1000)**2))) / 40.3044
    return cpl9

#######################

def func_cpv11(t):   
    cp11 = ( 31.32234 + ((-20.23531)*(t/1000)) + (57.86644*((t/1000)**2)) + ((-36.50624)*((t/1000)**3)) + ((-0.007374)/((t/1000)**2)) )/31.998
    return cp11     

def func_cpv12(t):
    cp12 = ( 30.03235 + (8.772972*(t/1000)) + ((-3.988133)*((t/1000)**2)) + (0.788313*((t/1000)**3)) + ((-0.741599)/((t/1000)**2)) )/31.998
    return cp12

def func_cpv21(t):
    cp21 = ( 28.98641 + (1.853978*(t/1000)) + ((-9.647459)*((t/1000)**2)) + ((16.63537)*((t/1000)**3)) + (0.000117/((t/1000)**2)) )/28.0134
    return cp21

def func_cpv22(t): 
    cp22 = ( 19.50583 + (19.88705*(t/1000)) + ((-8.598535)*((t/1000)**2)) + (1.369784*((t/1000)**3)) + (0.527601/((t/1000)**2)) )/28.0134
    return cp22

def func_cpv31(t):
    cp31 = ( 24.99735 + (55.18696*(t/1000)) + ((-33.69137)*((t/1000)**2)) + (7.948387*((t/1000)**3)) + ((-0.136638)/((t/1000)**2)) )/44.0095
    return cp31

def func_cpv32(t):
    cp32 = ( 58.16639 + (2.720074*(t/1000)) + ((-0.492289)*((t/1000)**2)) + (0.038844*((t/1000)**3)) + ((-6.447293)/((t/1000)**2)) )/44.0095
    return cp32

def func_cpv41(t):
    cp41 = ( 30.09200 + (6.832514*(t/1000)) + (6.793435*((t/1000)**2)) + ((-2.534480)*((t/1000)**3)) + (0.082139/((t/1000)**2)) )/18.0153
    return cp41

def func_cpv42(t):
    cp42 = ( 41.96426 + (8.622053*(t/1000)) + ((-1.499780)*((t/1000)**2)) + (0.098119*((t/1000)**3)) + ((-11.15764)/((t/1000)**2)) )/18.0153
    return cp42

def func_cpv51(t):
    cp51 = ( -0.703029 + (108.4773*(t/1000)) + ((-42.52157)*((t/1000)**2)) + (5.862788*((t/1000)**3)) + (0.678565/((t/1000)**2)) )/16.0425
    return cp51

def func_cpv52(t):
    cp52 = ( 85.81217 + (11.26467*(t/1000)) + ((-2.114146)*((t/1000)**2)) + (0.138190*((t/1000)**3)) + ((-26.42221)/((t/1000)**2)) )/16.0425
    return cp52

def func_cpv6(t):    
    cp6 = ( ((-1.975e-12)*(t**4)) + ((2.182e-08)*(t**3)) + ((-9.405e-05)*(t**2)) + (0.1947*t) + 1.884 )/30.0690
    return cp6

def func_cpv7(t):   
    cp7 = ( ((2.051e-12)*(t**4)) + ((2.153e-08)*(t**3)) + ((-0.0001394)*(t**2)) + (0.2922*t) - 1.557 )/44.0956
    return cp7

def func_cpv8(t):    
    cp8 = 8.43 / 12.0107
    return cp8

#########################

def func_fg_cpv(g,cpv,y):
    
    fg = y*g  
    
    fg_cpv = (fg @ cpv) 
    
    return fg_cpv

##################

def func_dhw(tg,tp):
    
    tbn = 373.15/1000
    tpn = tp/1000
    tgn = tg/1000
    
    aux_w1 = ((-203.6060)*(tbn-tpn) + ((1523.290)/2)*((tbn**2)-(tpn**2)) + ((-3196.413)/3)*((tbn**3)-(tpn**3)) + (2474.455/4)*((tbn**4)-(tpn**4)) - (3.855326)*((1/tbn)-(1/tpn)))
    
    aux_w2 = (40660)
    
    aux_w3 = ((30.09200*(tgn-tbn) + (6.832514/2)*((tgn**2)-(tbn**2)) + (6.793435/3)*((tgn**3)-(tbn**3)) + ((-2.534480)/4)*((tgn**4)-(tbn**4)) - (0.082139)*((1/tgn)-(1/tbn))))
    
    dhw = (aux_w1 + aux_w2 + aux_w3)/1000
    
    return dhw

#############

def func_h(g,tg,y,cpv):
    
    gi = y*g  
    
    ks = func_ks(tg)
    kg = (gi @ ks) / g
    
    mis = func_mi(tg)
    mig = (gi @ mis) / g
    
    cpg = (gi @ cpv) / g
    
    re = (g * dp) / mig
    
    pr = (cpg * mig) / kg
    
    nu = 2 + 0.6*((re/e)**(1/2))*(pr**(1/3))
    
    h = (nu * kg) / dp
    
    return h

##################

def func_kw(g,tg,y,pg,rho,dh2o):

    mis = func_mi(tg) 
    
    mig = (y @ mis)
    
    re = (g*dp)/mig
    
    sc = mig/(rho*dh2o)
    
    kw = (dh2o/dp)*(2 + 0.6*(re**0.5)*(sc**(1/3)))
    
    return kw

###################

def func_pg(g,tg,y,rhog):
    
    fg = y*g  
    
    mis = func_mi(tg)
    
    mig = (fg @ mis)
    
    pg = ((-150*((1-e)**2)*mig)/((dp**2)*(e**3)*rhog))-((1.75*(1-e)*(g**2))/(dp*(e**3)*rhog))
    
    return pg

################

def func_ks(t):
       
    ks1 = ( (-1.212e-08)*(t**2) + (9.216e-05)*t - 0.0001555 ) / 1000
    
    ks2 = ( (-6.868e-09)*(t**2) + (6.602e-05)*t + 0.006812 ) / 1000
    
    ks3 = ( (-1.524e-08)*(t**2) + (9.695e-05)*t - 0.01113 ) / 1000
    
    ks4 = ( (3.65e-08)*(t**2) + (6.59e-05)*t - 0.005758 ) / 1000
    
    ks5 = ( (1.159e-07)*(t**2) + (7.774e-05)*t + 0.0006102 ) / 1000
    
    ks6 = ( (1.141e-07)*(t**2) + (7.239e-05)*t - 0.01104 ) / 1000
    
    ks7 = ( (1.443e-07)*(t**2) + (2.379e-05)*t - 0.001612 ) / 1000
    
    ks8 = ( 0 ) / 1000
    
    ks = np.array([ks1, ks2, ks3, ks4, ks5, ks6, ks7, ks8])
    
    return ks

def func_mi(t):
    
    mi1 = (-1.586e-11)*(t**2) + (6.1e-08)*t + 3.771e-06 
    
    mi2 = (-5.759e-12)*(t**2) + (4.026e-08)*t + 7.013e-06 
    
    mi3 = (-1.369e-11)*(t**2) + (5.525e-08)*t - 2.694e-07 
    
    mi4 = (-3.16e-12)*(t**2) + (4.488e-08)*t - 4.235e-06
    
    mi5 = (-1.441e-11)*(t**2) + (4.026e-08)*t + 4.603e-07
    
    mi6 = (-1.117e-11)*(t**2) + (3.581e-08)*t - 3.292e-07
    
    mi7 = (-7.184e-12)*(t**2) + (3.123e-08)*t + 5.233e-07
    
    mi8 = 0
    
    mi = np.array([mi1, mi2, mi3, mi4, mi5, mi6, mi7, mi8])
    
    return mi

#################

rhoc = np.array([5240, 5170, 2650, 2710, 2960, 2100, 997, 3350, 3580])
xi = np.array([0.7844508, 0, 0.04313574, 0.05567999, 0.01114347, 0.00559, 0.1, 0, 0])
yi = np.array([0.12, 0.78, 0.10, 0, 0, 0, 0, 0])  
mmg = np.array([31.9988, 28.01340, 44.0095, 18.01528, 16.04, 30.0690, 44.0956, 12.011]) 
g0 = 1.0448  
tg0 = 580.8821 
tp0 = 310.15 
dp = 0.013 
e = 0.3115 
ep = 0.32
a = 6*(1-e)/dp 
p1 = 101245.54
r = 8.314e3
tr = 298.15 

cpl70 = func_cpl71(tp0)

wpc = 311.2122137*2/3
rp = dp/2

###############################################################################

def func_cond_inic(tgi,gi,pgi,y1i,y2i,y3i,y4i,y5i,y6i,y7i,y8i,n,nt):
    from gekko import GEKKO
    v = GEKKO(remote=False)
    
    dz = zf/n
    
    tg = [v.Var(tgi) for i in range(n)]
    g = [v.Var(gi) for i in range(n)]
    pg = [v.Var(pgi) for i in range(n)]
    
    tp = [v.Param(tp0) for i in range(n)]
    
    y1 = [v.Var(y1i) for i in range(n)]
    y2 = [v.Var(y2i) for i in range(n)]
    y3 = [v.Var(y3i) for i in range(n)]
    y4 = [v.Var(y4i) for i in range(n)]
    y5 = [v.Var(y5i) for i in range(n)]
    y6 = [v.Var(y6i) for i in range(n)]
    y7 = [v.Var(y7i) for i in range(n)]
    y8 = [v.Var(y8i) for i in range(n)]
    
    y = [np.array([y1[i], y2[i], y3[i], y4[i], y5[i], y6[i], y7[i], y8[i]]) for i in range(n)]
    
    #############
    
    rhog = [v.Intermediate((pg[i]*(mmg @ y[i])/(r*tg[i]))) for i in range(n)]
    
    dh2o = [v.Intermediate((2.58e-05)*((tg[i]/300)**1.5)) for i in range(n)]
    
    kw = [v.Intermediate(func_kw(g[i],tg[i],y[i],pg[i],rhog[i],dh2o[i])) for i in range(n)]
        
    weg = [v.Intermediate(v.exp(-3.5+(0.0549/tg[i]))) for i in range(n)]
    
    wg = [v.Intermediate((pg[i]*mmg[3]*y4[i])/(r*tg[i])) for i in range(n)]
    
    rw = [v.Intermediate(kw[i]*a*(weg[i]-wg[i])) for i in range(n)]
    
    rw_m = [v.Intermediate(rw[i]*1000/18.01528) for i in range(n)]
    
    dhw = [v.Intermediate(func_dhw(tg[i],tp[i])) for i in range(n)]
    
    qcond = [v.Intermediate(rw_m[i]*dhw[i]) for i in range(n)]
    
    cpv1 = [v.if2(tg[i]-700,func_cpv11(tg[i]),func_cpv12(tg[i])) for i in range(n)]    
    cpv2 = [v.if2(tg[i]-500,func_cpv21(tg[i]),func_cpv22(tg[i])) for i in range(n)]
    cpv3 = [v.if2(tg[i]-1200,func_cpv31(tg[i]),func_cpv32(tg[i])) for i in range(n)]
    cpv4 = [v.if2(tg[i]-1700,func_cpv41(tg[i]),func_cpv42(tg[i])) for i in range(n)]
    cpv5 = [v.if2(tg[i]-1300,func_cpv51(tg[i]),func_cpv52(tg[i])) for i in range(n)]
    cpv6 = [v.Intermediate(func_cpv6(tg[i])) for i in range(n)]
    cpv7 = [v.Intermediate(func_cpv7(tg[i])) for i in range(n)]
    cpv8 = [v.Intermediate(func_cpv8(tg[i])) for i in range(n)]
    
    cpv21 = [v.Intermediate(func_cpv21(tg[i])) for i in range(n)]
    cpv22 = [v.Intermediate(func_cpv22(tg[i])) for i in range(n)]
    
    cpv = [[cpv1[i], cpv2[i], cpv3[i], cpv4[i], cpv5[i], cpv6[i], cpv7[i], cpv8[i]] for i in range(n)]
    
    fg_cpv = [v.Intermediate(func_fg_cpv(g[i],cpv[i],y[i])) for i in range(n)]
    
    h = [v.Intermediate(func_h(g[i],tg[i],y[i],cpv[i])) for i in range(n)]
    
    qconv = [v.Intermediate((a*h[i]*(tg[i]-tp[i]))) for i in range(n)]
    
    p = [v.Intermediate(func_pg(g[i],tg[i],y[i],rhog[i])) for i in range(n)]
    
    #############
    
    v.Equation(tg[0] == tg0)
    v.Equation([tg[i] == tg[i-1] + dz*(qcond[i-1]-qconv[i-1])/fg_cpv[i-1] for i in range(1,n)])
    
    v.Equation(g[0] == g0)
    v.Equation([g[i] == g[i-1] + dz*rw[i-1] for i in range(1,n)])
    
    v.Equation(pg[0] == p1)
    v.Equation([pg[i] == pg[i-1] + dz*p[i-1] for i in range(1,n)])
    
    v.Equation(y1[0] == yi[0])
    v.Equation(y2[0] == yi[1])
    v.Equation(y3[0] == yi[2])
    v.Equation(y4[0] == yi[3])
    v.Equation(y5[0] == yi[4])
    v.Equation(y6[0] == yi[5])
    v.Equation(y7[0] == yi[6])
    v.Equation(y8[0] == yi[7])
    
    v.Equation([y1[i] == y1[i-1] - dz*rw[i-1]*y1[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y2[i] == y2[i-1] - dz*rw[i-1]*y2[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y3[i] == y3[i-1] - dz*rw[i-1]*y3[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y4[i] == y4[i-1] + dz*rw[i-1]*(1-y4[i-1])/g[i-1] for i in range(1,n)])
    v.Equation([y5[i] == y5[i-1] - dz*rw[i-1]*y5[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y6[i] == y6[i-1] - dz*rw[i-1]*y6[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y7[i] == y7[i-1] - dz*rw[i-1]*y7[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y8[i] == y8[i-1] - dz*rw[i-1]*y8[i-1]/g[i-1] for i in range(1,n)])
    
    ###############################
    v.options.SOLVER = 1
    v.solve(disp=False)
    
    return [tg, g, pg, y1, y2, y3, y4, y5, y6, y7, y8, cpv1, cpv21, cpv22, cpv2, cpv3, cpv4, cpv5, rw]

#####################################################################################

from gekko import GEKKO
m = GEKKO(remote=False)

zf = 0.1
tf = 500

n = 3
nt = 3
m.time = np.linspace(0,tf,nt)

dz = zf/n
dtt = tf/nt
# ############################################################################################################################

u = func_cond_inic(tg0,g0,p1,yi[0],yi[1],yi[2],yi[3],yi[4],yi[5],yi[6],yi[7],n,nt)

tg = [m.Var(u[0][i]) for i in range(n)]
g = [m.Var(u[1][i]) for i in range(n)]
pg = [m.Var(u[2][i]) for i in range(n)]

tp = [m.Var(tp0) for i in range(n)]

y1 = [m.Var(u[3][i][0]) for i in range(n)]
y2 = [m.Var(u[4][i][0]) for i in range(n)]
y3 = [m.Var(u[5][i][0]) for i in range(n)]
y4 = [m.Var(u[6][i][0]) for i in range(n)]
y5 = [m.Var(u[7][i][0]) for i in range(n)]
y6 = [m.Var(u[8][i][0]) for i in range(n)]
y7 = [m.Var(u[9][i][0]) for i in range(n)]
y8 = [m.Var(u[10][i][0]) for i in range(n)]

y = [np.array([y1[i], y2[i], y3[i], y4[i], y5[i], y6[i], y7[i], y8[i]]) for i in range(n)]
    
x1 = [m.Var(xi[0]) for i in range(n)]
x2 = [m.Var(xi[1]) for i in range(n)]
x3 = [m.Var(xi[2]) for i in range(n)]
x4 = [m.Var(xi[3]) for i in range(n)]
x5 = [m.Var(xi[4]) for i in range(n)]
x6 = [m.Var(xi[5]) for i in range(n)]
x7 = [m.Var(xi[6]) for i in range(n)]
x8 = [m.Var(xi[7]) for i in range(n)]
x9 = [m.Var(xi[8]) for i in range(n)]

rw = [m.Var(u[18][i][0]) for i in range(n)]
cpv2 = [m.Var(u[14][i][0]) for i in range(n)]
cpl7 = [m.Var(cpl70) for i in range(n)]

# #######################################################################################################################

rhog = [m.Intermediate((pg[i]*(mmg @ y[i])/(r*tg[i]))) for i in range(n)]

rhop1 = [m.Intermediate((x1[i]*rhoc[0]*(1-e))) for i in range(n)]
rhop2 = [m.Intermediate((x2[i]*rhoc[1]*(1-e))) for i in range(n)]
rhop3 = [m.Intermediate((x3[i]*rhoc[2]*(1-e))) for i in range(n)]
rhop4 = [m.Intermediate((x4[i]*rhoc[3]*(1-e))) for i in range(n)]
rhop5 = [m.Intermediate((x5[i]*rhoc[4]*(1-e))) for i in range(n)]
rhop6 = [m.Intermediate((x6[i]*rhoc[5]*(1-e))) for i in range(n)]
rhop7 = [m.Intermediate((x7[i]*rhoc[6]*(1-e))) for i in range(n)]
rhop8 = [m.Intermediate((x8[i]*rhoc[7]*(1-e))) for i in range(n)]
rhop9 = [m.Intermediate((x9[i]*rhoc[8]*(1-e))) for i in range(n)]
rhop = [np.array([rhop1[i], rhop2[i], rhop3[i], rhop4[i], rhop5[i], rhop6[i], rhop7[i], rhop8[i], rhop9[i]]) for i in range(n)]
rhop_t = [m.Intermediate(rhop1[i] + rhop2[i] + rhop3[i] + rhop4[i] + rhop5[i] + rhop6[i] + rhop7[i] + rhop8[i] + rhop9[i]) for i in range(n)]

dh2o = [m.Intermediate((2.58e-05)*((tg[i]/300)**1.5)) for i in range(n)]

kw = [m.Intermediate(func_kw(g[i],tg[i],y[i],pg[i],rhog[i],dh2o[i])) for i in range(n)]

weg = [m.Intermediate(m.exp(-3.5+(0.0549/tg[i]))) for i in range(n)]

wg = [m.Intermediate((pg[i]*mmg[3]*y4[i])/(r*tg[i])) for i in range(n)]

rw1 = [m.Intermediate(kw[i]*a*(weg[i]-wg[i])) for i in range(n)]

wp = [m.Intermediate(x7[i]*rhop_t[i]) for i in range(n)]
rc = [m.Intermediate(rp*((wp[i]/wpc)**(1/3))) for i in range(n)]

rw2 = [m.Intermediate((a/(rp**2))*((weg[i]-wg[i])/(((rp-rc[i])/(rp*rc[i]*dh2o[i]))+(1/(kw[i]*(rp**2)))))) for i in range(n)]

m.Equation([rw[i] == m.if2(wp[i]-wpc,rw2[i],rw1[i]) for i in range(n)])

rw_m = [m.Intermediate(rw[i]*1000/18.01528) for i in range(n)]

dhw = [m.Intermediate(func_dhw(tg[i],tp[i])) for i in range(n)]

qcond = [m.Intermediate(rw_m[i]*dhw[i]) for i in range(n)]

cpv1 = [m.Intermediate(func_cpv11(tg[i])) for i in range(n)]

cpv21 = [m.Intermediate(func_cpv21(tg[i])) for i in range(n)]
cpv22 = [m.Intermediate(func_cpv22(tg[i])) for i in range(n)]
m.Equation([cpv2[i] == m.if2(tg[i]-500,cpv21[i],cpv22[i]) for i in range(n)])

cpv3 = [m.Intermediate(func_cpv31(tg[i])) for i in range(n)]
cpv4 = [m.Intermediate(func_cpv41(tg[i])) for i in range(n)]
cpv5 = [m.Intermediate(func_cpv51(tg[i])) for i in range(n)]
cpv6 = [m.Intermediate(func_cpv6(tg[i])) for i in range(n)]
cpv7 = [m.Intermediate(func_cpv7(tg[i])) for i in range(n)]
cpv8 = [m.Intermediate(func_cpv8(tg[i])) for i in range(n)]

cpv = [[cpv1[i], cpv2[i], cpv3[i], cpv4[i], cpv5[i], cpv6[i], cpv7[i], cpv8[i]] for i in range(n)]

fg_cpv = [m.Intermediate(func_fg_cpv(g[i],cpv[i],y[i])) for i in range(n)]

h = [m.Intermediate(func_h(g[i],tg[i],y[i],cpv[i])) for i in range(n)]

qconv = [m.Intermediate((a*h[i]*(tg[i]-tp[i]))) for i in range(n)]

p = [m.Intermediate(func_pg(g[i],tg[i],y[i],rhog[i])) for i in range(n)]

cpl1 = [m.Intermediate(func_cpl11(tp[i])) for i in range(n)]
cpl2 = [m.Intermediate(func_cpl21(tp[i])) for i in range(n)]
cpl3 = [m.Intermediate(func_cpl31(tp[i])) for i in range(n)]
cpl4 = [m.Intermediate(func_cpl4(tp[i])) for i in range(n)]
cpl5 = [m.Intermediate(func_cpl5(tp[i])) for i in range(n)]
cpl6 = [m.Intermediate(func_cpl6(tp[i])) for i in range(n)]

cpl71 = [m.Intermediate(func_cpl71(tp[i])) for i in range(n)]
cpl72 = [m.Intermediate(func_cpl72(tp[i])) for i in range(n)]
m.Equation([cpl7[i] == m.if2(tp[i]-500,cpl71[i],cpl72[i]) for i in range(n)])

cpl8 = [m.Intermediate(func_cpl8(tp[i])) for i in range(n)]
cpl9 = [m.Intermediate(func_cpl9(tp[i])) for i in range(n)]

cpl = [[cpl1[i], cpl2[i], cpl3[i], cpl4[i], cpl5[i], cpl6[i], cpl7[i], cpl8[i], cpl9[i]] for i in range(n)]

rho_cpl = [m.Intermediate((rhop[i] @ cpl[i])) for i in range(n)]

# #########################################################################################################################

m.Equation(tg[0] == tg0)
m.Equation([tg[i] == tg[i-1] + dz*(qcond[i-1]-qconv[i-1])/fg_cpv[i-1] for i in range(1,n)])

m.Equation(g[0] == g0)
m.Equation([g[i] == g[i-1] + dz*rw[i-1] for i in range(1,n)])

m.Equation(pg[0] == p1)
m.Equation([pg[i] == pg[i-1] + dz*p[i-1] for i in range(1,n)])
    
m.Equation(y1[0] == yi[0])
m.Equation(y2[0] == yi[1])
m.Equation(y3[0] == yi[2])
m.Equation(y4[0] == yi[3])
m.Equation(y5[0] == yi[4])
m.Equation(y6[0] == yi[5])
m.Equation(y7[0] == yi[6])
m.Equation(y8[0] == yi[7])
m.Equation([y1[i] == y1[i-1] - dz*rw[i-1]*y1[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y2[i] == y2[i-1] - dz*rw[i-1]*y2[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y3[i] == y3[i-1] - dz*rw[i-1]*y3[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y4[i] == y4[i-1] + dz*rw[i-1]*(1-y4[i-1])/g[i-1] for i in range(1,n)])
m.Equation([y5[i] == y5[i-1] - dz*rw[i-1]*y5[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y6[i] == y6[i-1] - dz*rw[i-1]*y6[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y7[i] == y7[i-1] - dz*rw[i-1]*y7[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y8[i] == y8[i-1] - dz*rw[i-1]*y8[i-1]/g[i-1] for i in range(1,n)])

m.Equation([tp[i].dt() == ((qconv[i]-qcond[i])/rho_cpl[i]) for i in range(n)])

m.Equation([x1[i].dt() == (rw[i]*x1[i]/rhop_t[i]) for i in range(n)])
m.Equation([x2[i].dt() == (rw[i]*x2[i]/rhop_t[i]) for i in range(n)])
m.Equation([x3[i].dt() == (rw[i]*x3[i]/rhop_t[i]) for i in range(n)])
m.Equation([x4[i].dt() == (rw[i]*x4[i]/rhop_t[i]) for i in range(n)])
m.Equation([x5[i].dt() == (rw[i]*x5[i]/rhop_t[i]) for i in range(n)])
m.Equation([x6[i].dt() == (rw[i]*x6[i]/rhop_t[i]) for i in range(n)])
m.Equation([x7[i].dt() == (-rw[i]*(1-x7[i])/rhop_t[i]) for i in range(n)])  ## NÃO COLOQUE RW[I-1]
m.Equation([x8[i].dt() == (rw[i]*x8[i]/rhop_t[i]) for i in range(n)])
m.Equation([x9[i].dt() == (rw[i]*x9[i]/rhop_t[i]) for i in range(n)])

###########################################################################################################################
m.options.IMODE = 5
m.options.SOLVER = 1
# m.options.NODES = 3

m.options.CSV_WRITE = 2   # write results_all.json with internal nodes

m.solve()
m.open_folder()

plt.plot(m.time,tg[0].value,'bo')
plt.plot(m.time,tg[-1].value,'bo')
# # retrieve internal nodes from results_all.json
import json
with open(m.path+'//results_all.json') as c:
    results = json.load(c)
plt.plot(results['time'],results['v1'],'rx')  
plt.plot(results['time'],results['v3'],'rx')  
plt.show()

model,NODES=2,只有在使用 APOPT Solver 和 IMODE=5 时才能求解。

IF3 也进行了测试,但没有成功。

如果所有的 if2s 都被删除,model 用 BPOPT Solver 和 IMODE=4 求解。

我想了解为什么。

我目前正在使用 Gekko 库研究动态热传递 model。 model 由偏微分方程组组成。 如 APMonitor 平台所示,空间变化的微分已离散化,而时间微分已通过有限元正交搭配法进行数值求解。

但是我有一个问题,model 没有解决超过 2 个节点。

这是 model:


import numpy as np

import matplotlib.pyplot as plt


def func_cpl11(t):
    cpl11 = (93.43834 + (108.3577*(t/1000)) + ((-50.86447)*((t/1000)**2)) + (25.58683*((t/1000)**3)) + ((-1.611330)/((t/1000)**2))) / 159.688
    return cpl11

def func_cpl12(t):
    cpl12 = (150.6240) / 159.688
    return cpl12

def func_cpl21(t):   
    cpl21 = (104.2096 + (178.5108*(t/1000)) + (10.61510*((t/1000)**2)) + (1.132534*((t/1000)**3)) + ((-0.994202)/((t/1000)**2))) / 231.533
    return cpl21

def func_cpl22(t): 
    cpl22 = (200.8320 + ((1.586435e-07)*(t/1000)) + ((-6.661682e-08)*((t/1000)**2)) + ((9.452452e-09)*((t/1000)**3)) + ((3.186020e-08)/((t/1000)**2))) / 231.533
    return cpl22

def func_cpl31(t): 
    cpl31 = (-6.076591 + (251.6755*(t/1000)) + ((-324.7964)*((t/1000)**2)) + (168.5604*((t/1000)**3)) + (0.002548/((t/1000)**2))) / 60.0843
    return cpl31

def func_cpl32(t): 
    cpl32 = (58.75340 + (10.27925*(t/1000)) + ((-0.131384)*((t/1000)**2)) + (0.025210*((t/1000)**3)) + (0.025601/((t/1000)**2))) / 60.0843
    return cpl32

def func_cpl4(t): 
    cpl4 = (19.68 + 0.01189*t - 307600/(t**2))*4.184/100.0869
    return cpl4

def func_cpl5(t): 
    cpl5 = (44.93700 + (149.7085*(t/1000)) + ((-74.18274)*((t/1000)**2)) + (11.97670*((t/1000)**3)) + ((-0.629261)/((t/1000)**2))) / 84.3139
    return cpl5

def func_cpl6(t): 
    cpl6 = 8.34 / 12.0107
    return cpl6

def func_cpl71(t):
    cpl71 = (-203.6060 + (1523.290*(t/1000)) + ((-3196.413)*((t/1000)**2)) + (2474.455*((t/1000)**3)) + (3.855326/((t/1000)**2))) / 18.0153
    return cpl71

def func_cpl72(t):
    cpl72 = (30.09200 + (6.832514*(t/1000)) + (6.793435*((t/1000)**2)) + ((-2.534480)*((t/1000)**3)) + (0.082139/((t/1000)**2))) / 18.0153
    return cpl72

def func_cpl8(t):
    cpl8 = (49.95403 + (4.887916*(t/1000)) + ((-0.352056)*((t/1000)**2)) + (0.046187*((t/1000)**3)) + ((-0.825097)/((t/1000)**2))) / 56.077
    return cpl8

def func_cpl9(t):
    cpl9 = (47.25995 + (5.681621*(t/1000)) + ((-0.872665)*((t/1000)**2)) + (0.104300*((t/1000)**3)) + ((-1.053955)/((t/1000)**2))) / 40.3044
    return cpl9

#######################

def func_cpv11(t):   
    cp11 = ( 31.32234 + ((-20.23531)*(t/1000)) + (57.86644*((t/1000)**2)) + ((-36.50624)*((t/1000)**3)) + ((-0.007374)/((t/1000)**2)) )/31.998
    return cp11     

def func_cpv12(t):
    cp12 = ( 30.03235 + (8.772972*(t/1000)) + ((-3.988133)*((t/1000)**2)) + (0.788313*((t/1000)**3)) + ((-0.741599)/((t/1000)**2)) )/31.998
    return cp12

def func_cpv21(t):
    cp21 = ( 28.98641 + (1.853978*(t/1000)) + ((-9.647459)*((t/1000)**2)) + ((16.63537)*((t/1000)**3)) + (0.000117/((t/1000)**2)) )/28.0134
    return cp21

def func_cpv22(t): 
    cp22 = ( 19.50583 + (19.88705*(t/1000)) + ((-8.598535)*((t/1000)**2)) + (1.369784*((t/1000)**3)) + (0.527601/((t/1000)**2)) )/28.0134
    return cp22

def func_cpv31(t):
    cp31 = ( 24.99735 + (55.18696*(t/1000)) + ((-33.69137)*((t/1000)**2)) + (7.948387*((t/1000)**3)) + ((-0.136638)/((t/1000)**2)) )/44.0095
    return cp31

def func_cpv32(t):
    cp32 = ( 58.16639 + (2.720074*(t/1000)) + ((-0.492289)*((t/1000)**2)) + (0.038844*((t/1000)**3)) + ((-6.447293)/((t/1000)**2)) )/44.0095
    return cp32

def func_cpv41(t):
    cp41 = ( 30.09200 + (6.832514*(t/1000)) + (6.793435*((t/1000)**2)) + ((-2.534480)*((t/1000)**3)) + (0.082139/((t/1000)**2)) )/18.0153
    return cp41

def func_cpv42(t):
    cp42 = ( 41.96426 + (8.622053*(t/1000)) + ((-1.499780)*((t/1000)**2)) + (0.098119*((t/1000)**3)) + ((-11.15764)/((t/1000)**2)) )/18.0153
    return cp42

def func_cpv51(t):
    cp51 = ( -0.703029 + (108.4773*(t/1000)) + ((-42.52157)*((t/1000)**2)) + (5.862788*((t/1000)**3)) + (0.678565/((t/1000)**2)) )/16.0425
    return cp51

def func_cpv52(t):
    cp52 = ( 85.81217 + (11.26467*(t/1000)) + ((-2.114146)*((t/1000)**2)) + (0.138190*((t/1000)**3)) + ((-26.42221)/((t/1000)**2)) )/16.0425
    return cp52

def func_cpv6(t):    
    cp6 = ( ((-1.975e-12)*(t**4)) + ((2.182e-08)*(t**3)) + ((-9.405e-05)*(t**2)) + (0.1947*t) + 1.884 )/30.0690
    return cp6

def func_cpv7(t):   
    cp7 = ( ((2.051e-12)*(t**4)) + ((2.153e-08)*(t**3)) + ((-0.0001394)*(t**2)) + (0.2922*t) - 1.557 )/44.0956
    return cp7

def func_cpv8(t):    
    cp8 = 8.43 / 12.0107
    return cp8

#########################

def func_fg_cpv(g,cpv,y):
    
    fg = y*g  
    
    fg_cpv = (fg @ cpv) 
    
    return fg_cpv

##################

def func_dhw(tg,tp):
    
    tbn = 373.15/1000
    tpn = tp/1000
    tgn = tg/1000
    
    aux_w1 = ((-203.6060)*(tbn-tpn) + ((1523.290)/2)*((tbn**2)-(tpn**2)) + ((-3196.413)/3)*((tbn**3)-(tpn**3)) + (2474.455/4)*((tbn**4)-(tpn**4)) - (3.855326)*((1/tbn)-(1/tpn)))
    
    aux_w2 = (40660)
    
    aux_w3 = ((30.09200*(tgn-tbn) + (6.832514/2)*((tgn**2)-(tbn**2)) + (6.793435/3)*((tgn**3)-(tbn**3)) + ((-2.534480)/4)*((tgn**4)-(tbn**4)) - (0.082139)*((1/tgn)-(1/tbn))))
    
    dhw = (aux_w1 + aux_w2 + aux_w3)/1000
    
    return dhw

#############

def func_h(g,tg,y,cpv):
    
    gi = y*g  
    
    ks = func_ks(tg)
    kg = (gi @ ks) / g
    
    mis = func_mi(tg)
    mig = (gi @ mis) / g
    
    cpg = (gi @ cpv) / g
    
    re = (g * dp) / mig
    
    pr = (cpg * mig) / kg
    
    nu = 2 + 0.6*((re/e)**(1/2))*(pr**(1/3))
    
    h = (nu * kg) / dp
    
    return h

##################

def func_kw(g,tg,y,pg,rho,dh2o):

    mis = func_mi(tg) 
    
    mig = (y @ mis)
    
    re = (g*dp)/mig
    
    sc = mig/(rho*dh2o)
    
    kw = (dh2o/dp)*(2 + 0.6*(re**0.5)*(sc**(1/3)))
    
    return kw

###################

def func_pg(g,tg,y,rhog):
    
    fg = y*g  
    
    mis = func_mi(tg)
    
    mig = (fg @ mis)
    
    pg = ((-150*((1-e)**2)*mig)/((dp**2)*(e**3)*rhog))-((1.75*(1-e)*(g**2))/(dp*(e**3)*rhog))
    
    return pg

################

def func_ks(t):
       
    ks1 = ( (-1.212e-08)*(t**2) + (9.216e-05)*t - 0.0001555 ) / 1000
    
    ks2 = ( (-6.868e-09)*(t**2) + (6.602e-05)*t + 0.006812 ) / 1000
    
    ks3 = ( (-1.524e-08)*(t**2) + (9.695e-05)*t - 0.01113 ) / 1000
    
    ks4 = ( (3.65e-08)*(t**2) + (6.59e-05)*t - 0.005758 ) / 1000
    
    ks5 = ( (1.159e-07)*(t**2) + (7.774e-05)*t + 0.0006102 ) / 1000
    
    ks6 = ( (1.141e-07)*(t**2) + (7.239e-05)*t - 0.01104 ) / 1000
    
    ks7 = ( (1.443e-07)*(t**2) + (2.379e-05)*t - 0.001612 ) / 1000
    
    ks8 = ( 0 ) / 1000
    
    ks = np.array([ks1, ks2, ks3, ks4, ks5, ks6, ks7, ks8])
    
    return ks

def func_mi(t):
    
    mi1 = (-1.586e-11)*(t**2) + (6.1e-08)*t + 3.771e-06 
    
    mi2 = (-5.759e-12)*(t**2) + (4.026e-08)*t + 7.013e-06 
    
    mi3 = (-1.369e-11)*(t**2) + (5.525e-08)*t - 2.694e-07 
    
    mi4 = (-3.16e-12)*(t**2) + (4.488e-08)*t - 4.235e-06
    
    mi5 = (-1.441e-11)*(t**2) + (4.026e-08)*t + 4.603e-07
    
    mi6 = (-1.117e-11)*(t**2) + (3.581e-08)*t - 3.292e-07
    
    mi7 = (-7.184e-12)*(t**2) + (3.123e-08)*t + 5.233e-07
    
    mi8 = 0
    
    mi = np.array([mi1, mi2, mi3, mi4, mi5, mi6, mi7, mi8])
    
    return mi

#################

rhoc = np.array([5240, 5170, 2650, 2710, 2960, 2100, 997, 3350, 3580])
xi = np.array([0.7844508, 0, 0.04313574, 0.05567999, 0.01114347, 0.00559, 0.1, 0, 0])
yi = np.array([0.12, 0.78, 0.10, 0, 0, 0, 0, 0])  
mmg = np.array([31.9988, 28.01340, 44.0095, 18.01528, 16.04, 30.0690, 44.0956, 12.011]) 
g0 = 1.0448  
tg0 = 580.8821 
tp0 = 310.15 
dp = 0.013 
e = 0.3115 
ep = 0.32
a = 6*(1-e)/dp 
p1 = 101245.54
r = 8.314e3
tr = 298.15 

cpl70 = func_cpl71(tp0)

wpc = 311.2122137*2/3
rp = dp/2

###############################################################################

def func_cond_inic(tgi,gi,pgi,y1i,y2i,y3i,y4i,y5i,y6i,y7i,y8i,n,nt):
    from gekko import GEKKO
    v = GEKKO(remote=False)
    
    dz = zf/n
    
    tg = [v.Var(tgi) for i in range(n)]
    g = [v.Var(gi) for i in range(n)]
    pg = [v.Var(pgi) for i in range(n)]
    
    tp = [v.Param(tp0) for i in range(n)]
    
    y1 = [v.Var(y1i) for i in range(n)]
    y2 = [v.Var(y2i) for i in range(n)]
    y3 = [v.Var(y3i) for i in range(n)]
    y4 = [v.Var(y4i) for i in range(n)]
    y5 = [v.Var(y5i) for i in range(n)]
    y6 = [v.Var(y6i) for i in range(n)]
    y7 = [v.Var(y7i) for i in range(n)]
    y8 = [v.Var(y8i) for i in range(n)]
    
    y = [np.array([y1[i], y2[i], y3[i], y4[i], y5[i], y6[i], y7[i], y8[i]]) for i in range(n)]
    
    #############
    
    rhog = [v.Intermediate((pg[i]*(mmg @ y[i])/(r*tg[i]))) for i in range(n)]
    
    dh2o = [v.Intermediate((2.58e-05)*((tg[i]/300)**1.5)) for i in range(n)]
    
    kw = [v.Intermediate(func_kw(g[i],tg[i],y[i],pg[i],rhog[i],dh2o[i])) for i in range(n)]
        
    weg = [v.Intermediate(v.exp(-3.5+(0.0549/tg[i]))) for i in range(n)]
    
    wg = [v.Intermediate((pg[i]*mmg[3]*y4[i])/(r*tg[i])) for i in range(n)]
    
    rw = [v.Intermediate(kw[i]*a*(weg[i]-wg[i])) for i in range(n)]
    
    rw_m = [v.Intermediate(rw[i]*1000/18.01528) for i in range(n)]
    
    dhw = [v.Intermediate(func_dhw(tg[i],tp[i])) for i in range(n)]
    
    qcond = [v.Intermediate(rw_m[i]*dhw[i]) for i in range(n)]
    
    cpv1 = [v.if2(tg[i]-700,func_cpv11(tg[i]),func_cpv12(tg[i])) for i in range(n)]    
    cpv2 = [v.if2(tg[i]-500,func_cpv21(tg[i]),func_cpv22(tg[i])) for i in range(n)]
    cpv3 = [v.if2(tg[i]-1200,func_cpv31(tg[i]),func_cpv32(tg[i])) for i in range(n)]
    cpv4 = [v.if2(tg[i]-1700,func_cpv41(tg[i]),func_cpv42(tg[i])) for i in range(n)]
    cpv5 = [v.if2(tg[i]-1300,func_cpv51(tg[i]),func_cpv52(tg[i])) for i in range(n)]
    cpv6 = [v.Intermediate(func_cpv6(tg[i])) for i in range(n)]
    cpv7 = [v.Intermediate(func_cpv7(tg[i])) for i in range(n)]
    cpv8 = [v.Intermediate(func_cpv8(tg[i])) for i in range(n)]
    
    cpv21 = [v.Intermediate(func_cpv21(tg[i])) for i in range(n)]
    cpv22 = [v.Intermediate(func_cpv22(tg[i])) for i in range(n)]
    
    cpv = [[cpv1[i], cpv2[i], cpv3[i], cpv4[i], cpv5[i], cpv6[i], cpv7[i], cpv8[i]] for i in range(n)]
    
    fg_cpv = [v.Intermediate(func_fg_cpv(g[i],cpv[i],y[i])) for i in range(n)]
    
    h = [v.Intermediate(func_h(g[i],tg[i],y[i],cpv[i])) for i in range(n)]
    
    qconv = [v.Intermediate((a*h[i]*(tg[i]-tp[i]))) for i in range(n)]
    
    p = [v.Intermediate(func_pg(g[i],tg[i],y[i],rhog[i])) for i in range(n)]
    
    #############
    
    v.Equation(tg[0] == tg0)
    v.Equation([tg[i] == tg[i-1] + dz*(qcond[i-1]-qconv[i-1])/fg_cpv[i-1] for i in range(1,n)])
    
    v.Equation(g[0] == g0)
    v.Equation([g[i] == g[i-1] + dz*rw[i-1] for i in range(1,n)])
    
    v.Equation(pg[0] == p1)
    v.Equation([pg[i] == pg[i-1] + dz*p[i-1] for i in range(1,n)])
    
    v.Equation(y1[0] == yi[0])
    v.Equation(y2[0] == yi[1])
    v.Equation(y3[0] == yi[2])
    v.Equation(y4[0] == yi[3])
    v.Equation(y5[0] == yi[4])
    v.Equation(y6[0] == yi[5])
    v.Equation(y7[0] == yi[6])
    v.Equation(y8[0] == yi[7])
    
    v.Equation([y1[i] == y1[i-1] - dz*rw[i-1]*y1[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y2[i] == y2[i-1] - dz*rw[i-1]*y2[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y3[i] == y3[i-1] - dz*rw[i-1]*y3[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y4[i] == y4[i-1] + dz*rw[i-1]*(1-y4[i-1])/g[i-1] for i in range(1,n)])
    v.Equation([y5[i] == y5[i-1] - dz*rw[i-1]*y5[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y6[i] == y6[i-1] - dz*rw[i-1]*y6[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y7[i] == y7[i-1] - dz*rw[i-1]*y7[i-1]/g[i-1] for i in range(1,n)])
    v.Equation([y8[i] == y8[i-1] - dz*rw[i-1]*y8[i-1]/g[i-1] for i in range(1,n)])
    
    ###############################
    v.options.SOLVER = 1
    v.solve(disp=False)
    
    return [tg, g, pg, y1, y2, y3, y4, y5, y6, y7, y8, cpv1, cpv21, cpv22, cpv2, cpv3, cpv4, cpv5, rw]

#####################################################################################

from gekko import GEKKO
m = GEKKO(remote=False)

zf = 0.1
tf = 500

n = 3
nt = 3
m.time = np.linspace(0,tf,nt)

dz = zf/n
dtt = tf/nt
# ############################################################################################################################

u = func_cond_inic(tg0,g0,p1,yi[0],yi[1],yi[2],yi[3],yi[4],yi[5],yi[6],yi[7],n,nt)

tg = [m.Var(u[0][i]) for i in range(n)]
g = [m.Var(u[1][i]) for i in range(n)]
pg = [m.Var(u[2][i]) for i in range(n)]

tp = [m.Var(tp0) for i in range(n)]

y1 = [m.Var(u[3][i][0]) for i in range(n)]
y2 = [m.Var(u[4][i][0]) for i in range(n)]
y3 = [m.Var(u[5][i][0]) for i in range(n)]
y4 = [m.Var(u[6][i][0]) for i in range(n)]
y5 = [m.Var(u[7][i][0]) for i in range(n)]
y6 = [m.Var(u[8][i][0]) for i in range(n)]
y7 = [m.Var(u[9][i][0]) for i in range(n)]
y8 = [m.Var(u[10][i][0]) for i in range(n)]

y = [np.array([y1[i], y2[i], y3[i], y4[i], y5[i], y6[i], y7[i], y8[i]]) for i in range(n)]
    
x1 = [m.Var(xi[0]) for i in range(n)]
x2 = [m.Var(xi[1]) for i in range(n)]
x3 = [m.Var(xi[2]) for i in range(n)]
x4 = [m.Var(xi[3]) for i in range(n)]
x5 = [m.Var(xi[4]) for i in range(n)]
x6 = [m.Var(xi[5]) for i in range(n)]
x7 = [m.Var(xi[6]) for i in range(n)]
x8 = [m.Var(xi[7]) for i in range(n)]
x9 = [m.Var(xi[8]) for i in range(n)]

rw = [m.Var(u[18][i][0]) for i in range(n)]
cpv2 = [m.Var(u[14][i][0]) for i in range(n)]
cpl7 = [m.Var(cpl70) for i in range(n)]

# #######################################################################################################################

rhog = [m.Intermediate((pg[i]*(mmg @ y[i])/(r*tg[i]))) for i in range(n)]

rhop1 = [m.Intermediate((x1[i]*rhoc[0]*(1-e))) for i in range(n)]
rhop2 = [m.Intermediate((x2[i]*rhoc[1]*(1-e))) for i in range(n)]
rhop3 = [m.Intermediate((x3[i]*rhoc[2]*(1-e))) for i in range(n)]
rhop4 = [m.Intermediate((x4[i]*rhoc[3]*(1-e))) for i in range(n)]
rhop5 = [m.Intermediate((x5[i]*rhoc[4]*(1-e))) for i in range(n)]
rhop6 = [m.Intermediate((x6[i]*rhoc[5]*(1-e))) for i in range(n)]
rhop7 = [m.Intermediate((x7[i]*rhoc[6]*(1-e))) for i in range(n)]
rhop8 = [m.Intermediate((x8[i]*rhoc[7]*(1-e))) for i in range(n)]
rhop9 = [m.Intermediate((x9[i]*rhoc[8]*(1-e))) for i in range(n)]
rhop = [np.array([rhop1[i], rhop2[i], rhop3[i], rhop4[i], rhop5[i], rhop6[i], rhop7[i], rhop8[i], rhop9[i]]) for i in range(n)]
rhop_t = [m.Intermediate(rhop1[i] + rhop2[i] + rhop3[i] + rhop4[i] + rhop5[i] + rhop6[i] + rhop7[i] + rhop8[i] + rhop9[i]) for i in range(n)]

dh2o = [m.Intermediate((2.58e-05)*((tg[i]/300)**1.5)) for i in range(n)]

kw = [m.Intermediate(func_kw(g[i],tg[i],y[i],pg[i],rhog[i],dh2o[i])) for i in range(n)]

weg = [m.Intermediate(m.exp(-3.5+(0.0549/tg[i]))) for i in range(n)]

wg = [m.Intermediate((pg[i]*mmg[3]*y4[i])/(r*tg[i])) for i in range(n)]

rw1 = [m.Intermediate(kw[i]*a*(weg[i]-wg[i])) for i in range(n)]

wp = [m.Intermediate(x7[i]*rhop_t[i]) for i in range(n)]
rc = [m.Intermediate(rp*((wp[i]/wpc)**(1/3))) for i in range(n)]

rw2 = [m.Intermediate((a/(rp**2))*((weg[i]-wg[i])/(((rp-rc[i])/(rp*rc[i]*dh2o[i]))+(1/(kw[i]*(rp**2)))))) for i in range(n)]

m.Equation([rw[i] == m.if2(wp[i]-wpc,rw2[i],rw1[i]) for i in range(n)])

rw_m = [m.Intermediate(rw[i]*1000/18.01528) for i in range(n)]

dhw = [m.Intermediate(func_dhw(tg[i],tp[i])) for i in range(n)]

qcond = [m.Intermediate(rw_m[i]*dhw[i]) for i in range(n)]

cpv1 = [m.Intermediate(func_cpv11(tg[i])) for i in range(n)]

cpv21 = [m.Intermediate(func_cpv21(tg[i])) for i in range(n)]
cpv22 = [m.Intermediate(func_cpv22(tg[i])) for i in range(n)]
m.Equation([cpv2[i] == m.if2(tg[i]-500,cpv21[i],cpv22[i]) for i in range(n)])

cpv3 = [m.Intermediate(func_cpv31(tg[i])) for i in range(n)]
cpv4 = [m.Intermediate(func_cpv41(tg[i])) for i in range(n)]
cpv5 = [m.Intermediate(func_cpv51(tg[i])) for i in range(n)]
cpv6 = [m.Intermediate(func_cpv6(tg[i])) for i in range(n)]
cpv7 = [m.Intermediate(func_cpv7(tg[i])) for i in range(n)]
cpv8 = [m.Intermediate(func_cpv8(tg[i])) for i in range(n)]

cpv = [[cpv1[i], cpv2[i], cpv3[i], cpv4[i], cpv5[i], cpv6[i], cpv7[i], cpv8[i]] for i in range(n)]

fg_cpv = [m.Intermediate(func_fg_cpv(g[i],cpv[i],y[i])) for i in range(n)]

h = [m.Intermediate(func_h(g[i],tg[i],y[i],cpv[i])) for i in range(n)]

qconv = [m.Intermediate((a*h[i]*(tg[i]-tp[i]))) for i in range(n)]

p = [m.Intermediate(func_pg(g[i],tg[i],y[i],rhog[i])) for i in range(n)]

cpl1 = [m.Intermediate(func_cpl11(tp[i])) for i in range(n)]
cpl2 = [m.Intermediate(func_cpl21(tp[i])) for i in range(n)]
cpl3 = [m.Intermediate(func_cpl31(tp[i])) for i in range(n)]
cpl4 = [m.Intermediate(func_cpl4(tp[i])) for i in range(n)]
cpl5 = [m.Intermediate(func_cpl5(tp[i])) for i in range(n)]
cpl6 = [m.Intermediate(func_cpl6(tp[i])) for i in range(n)]

cpl71 = [m.Intermediate(func_cpl71(tp[i])) for i in range(n)]
cpl72 = [m.Intermediate(func_cpl72(tp[i])) for i in range(n)]
m.Equation([cpl7[i] == m.if2(tp[i]-500,cpl71[i],cpl72[i]) for i in range(n)])

cpl8 = [m.Intermediate(func_cpl8(tp[i])) for i in range(n)]
cpl9 = [m.Intermediate(func_cpl9(tp[i])) for i in range(n)]

cpl = [[cpl1[i], cpl2[i], cpl3[i], cpl4[i], cpl5[i], cpl6[i], cpl7[i], cpl8[i], cpl9[i]] for i in range(n)]

rho_cpl = [m.Intermediate((rhop[i] @ cpl[i])) for i in range(n)]

# #########################################################################################################################

m.Equation(tg[0] == tg0)
m.Equation([tg[i] == tg[i-1] + dz*(qcond[i-1]-qconv[i-1])/fg_cpv[i-1] for i in range(1,n)])

m.Equation(g[0] == g0)
m.Equation([g[i] == g[i-1] + dz*rw[i-1] for i in range(1,n)])

m.Equation(pg[0] == p1)
m.Equation([pg[i] == pg[i-1] + dz*p[i-1] for i in range(1,n)])
    
m.Equation(y1[0] == yi[0])
m.Equation(y2[0] == yi[1])
m.Equation(y3[0] == yi[2])
m.Equation(y4[0] == yi[3])
m.Equation(y5[0] == yi[4])
m.Equation(y6[0] == yi[5])
m.Equation(y7[0] == yi[6])
m.Equation(y8[0] == yi[7])
m.Equation([y1[i] == y1[i-1] - dz*rw[i-1]*y1[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y2[i] == y2[i-1] - dz*rw[i-1]*y2[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y3[i] == y3[i-1] - dz*rw[i-1]*y3[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y4[i] == y4[i-1] + dz*rw[i-1]*(1-y4[i-1])/g[i-1] for i in range(1,n)])
m.Equation([y5[i] == y5[i-1] - dz*rw[i-1]*y5[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y6[i] == y6[i-1] - dz*rw[i-1]*y6[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y7[i] == y7[i-1] - dz*rw[i-1]*y7[i-1]/g[i-1] for i in range(1,n)])
m.Equation([y8[i] == y8[i-1] - dz*rw[i-1]*y8[i-1]/g[i-1] for i in range(1,n)])

m.Equation([tp[i].dt() == ((qconv[i]-qcond[i])/rho_cpl[i]) for i in range(n)])

m.Equation([x1[i].dt() == (rw[i]*x1[i]/rhop_t[i]) for i in range(n)])
m.Equation([x2[i].dt() == (rw[i]*x2[i]/rhop_t[i]) for i in range(n)])
m.Equation([x3[i].dt() == (rw[i]*x3[i]/rhop_t[i]) for i in range(n)])
m.Equation([x4[i].dt() == (rw[i]*x4[i]/rhop_t[i]) for i in range(n)])
m.Equation([x5[i].dt() == (rw[i]*x5[i]/rhop_t[i]) for i in range(n)])
m.Equation([x6[i].dt() == (rw[i]*x6[i]/rhop_t[i]) for i in range(n)])
m.Equation([x7[i].dt() == (-rw[i]*(1-x7[i])/rhop_t[i]) for i in range(n)])  ## NÃO COLOQUE RW[I-1]
m.Equation([x8[i].dt() == (rw[i]*x8[i]/rhop_t[i]) for i in range(n)])
m.Equation([x9[i].dt() == (rw[i]*x9[i]/rhop_t[i]) for i in range(n)])

###########################################################################################################################
m.options.IMODE = 5
m.options.SOLVER = 1
# m.options.NODES = 3

m.options.CSV_WRITE = 2   # write results_all.json with internal nodes

m.solve()
m.open_folder()

plt.plot(m.time,tg[0].value,'bo')
plt.plot(m.time,tg[-1].value,'bo')
# # retrieve internal nodes from results_all.json
import json
with open(m.path+'//results_all.json') as c:
    results = json.load(c)
plt.plot(results['time'],results['v1'],'rx')  
plt.plot(results['time'],results['v3'],'rx')  
plt.show()

model,NODES=2,只有在使用 APOPT Solver 和 IMODE=5 时才能求解。

IF3 也进行了测试,但没有成功。

如果所有的 if2s 都被删除,model 用 BPOPT Solver 和 IMODE=4 求解。

我想了解为什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM