[英]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.