简体   繁体   English

Gekko 中偏微分方程中的节点

[英]Nodes in partial differential equations in gekko

I am currently working on a dynamic heat transfer model, using the Gekko library.我目前正在使用 Gekko 库研究动态热传递 model。 The model consists of a system of partial differential equations. model 由偏微分方程组组成。 As indicated on the APMonitor platform, the differentials that vary in space have been discretized, while differentials in time have been solved numerically by Orthogonal Collocation on Finite Elements method.如 APMonitor 平台所示,空间变化的微分已离散化,而时间微分已通过有限元正交搭配法进行数值求解。

However I have a problem, the model is not solved with more than 2 nodes.但是我有一个问题,model 没有解决超过 2 个节点。

This is the model:这是 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()

The model, with NODES=2, is only solved when APOPT Solver and IMODE=5 is used. model,NODES=2,只有在使用 APOPT Solver 和 IMODE=5 时才能求解。

The IF3 was also tested, but without success. IF3 也进行了测试,但没有成功。

If all the if2s are removed, the model is solved with BPOPT Solver and IMODE=4.如果所有的 if2s 都被删除,model 用 BPOPT Solver 和 IMODE=4 求解。

I would like to understand why.我想了解为什么。

I am currently working on a dynamic heat transfer model, using the Gekko library.我目前正在使用 Gekko 库研究动态热传递 model。 The model consists of a system of partial differential equations. model 由偏微分方程组组成。 As indicated on the APMonitor platform, the differentials that vary in space have been discretized, while differentials in time have been solved numerically by Orthogonal Collocation on Finite Elements method.如 APMonitor 平台所示,空间变化的微分已离散化,而时间微分已通过有限元正交搭配法进行数值求解。

However I have a problem, the model is not solved with more than 2 nodes.但是我有一个问题,model 没有解决超过 2 个节点。

This is the model:这是 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()

The model, with NODES=2, is only solved when APOPT Solver and IMODE=5 is used. model,NODES=2,只有在使用 APOPT Solver 和 IMODE=5 时才能求解。

The IF3 was also tested, but without success. IF3 也进行了测试,但没有成功。

If all the if2s are removed, the model is solved with BPOPT Solver and IMODE=4.如果所有的 if2s 都被删除,model 用 BPOPT Solver 和 IMODE=4 求解。

I would like to understand why.我想了解为什么。

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

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