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