如何解决两相区域中coolprop数据的GEKKO bspline问题
我想在壁虎使用coolprop我的动态热仿真内。我了解到,而非直接BSPLINE或CSPLINE对象实施coolprop呼叫必须被用来允许壁虎找衍生物。但是,试图在流体两相区这样做的时候,在B样条物体不会导致正确的结果。下面是我展现壁虎的结果相比,从SciPy的二维花最少的工作的例子。我使用的是花键计算取决于压力和比焓的fluid's温度。
import numpy as np
from CoolProp.CoolProp import PropsSI as PS
from gekko import GEKKO
from matplotlib import pyplot as plt
from scipy.interpolate import bisplrep,bisplev
def coolprop_bspline():
# Gekko Setup
m = GEKKO(remote=False)
t_steps = 90
m.time = np.linspace(0,90,t_steps)
# Initial values
xi = 0.0
p_i = 10e5
tau_i = PS('T','Q',xi,'P',p_i,'R134a')
h_i = PS('H','R134a')
tau_low = tau_i - 30
tau_high = tau_i + 30
# Prepare spline data
h_low = PS('H','T',tau_low,'R134a')
h_high = PS('H',tau_high,'R134a')
h_range = np.squeeze(np.linspace(h_low,h_high,50))
p_range = np.linspace(9.0e5,11e5,10)
h_mesh,p_mesh = np.meshgrid(h_range,p_range,indexing='ij')
tau_mesh = np.reshape(
PS('T','H',np.reshape(h_mesh,(h_mesh.size,)),np.reshape(p_mesh,(p_mesh.size,'R134a'),h_mesh.shape)
# Variables
h = m.Var(h_i)
p = m.Var(p_i)
tau = m.Var(tau_i)
# Equations
m.Equations(
[
h.dt() == 1000,p.dt() == 0,]
)
m.bspline(h,p,tau,h_range,tau_mesh,data=True,kx=3,ky=3)
# Execution
m.options.IMODE = 4
m.options.soLVER = 3
m.solve(disp=True)
# Evaluate comparative spline from Scipy
spl = bisplrep(h_mesh,p_mesh,ky=3)
h_new = np.linspace(h_low,200)
p_new = np.linspace(9.0e5,200)
h_new,p_new = np.meshgrid(h_new,p_new,indexing='ij')
tau_interp = bisplev(h_new[:,0],p_new[0,:],spl)
# Plotting
# Plot result from Gekko
plt.figure(1)
plt.plot(h.value,tau.value)
plt.grid()
plt.xlabel('Enthalpy [J/kg]')
plt.ylabel('Temperature [K]')
plt.title('Gekko results with p = 1e6')
# Plot comparative spline from scipy
fig = plt.figure(2)
ax = fig.add_subplot(111,projection='3d')
ax.plot_surface(h_new,tau_interp)
ax.view_init(20,-100)
plt.xlabel('Enthalpy [J/kg]')
plt.ylabel('Pressure [Pa]')
ax.set_zlabel('Temperature [K]')
plt.title('Correct BSpline')
# Plot original data from coolprop
fig = plt.figure(3)
ax = fig.add_subplot(111,projection='3d')
ax.plot_surface(h_mesh,tau_mesh)
ax.view_init(20,-100)
plt.xlabel('Enthalpy [J/kg]')
plt.ylabel('Pressure [Pa]')
ax.set_zlabel('Temperature [K]')
plt.title('Raw coolprop data')
plt.show()
if __name__ == '__main__':
coolprop_bspline()
以下是在所得的曲线图。将 Gekko 结果与其他两个结果进行比较时,很明显,温度不应突然升高到 335000 J/kg 左右的热函所覆盖的最大值。
没有人有如何调整B样条对象正确地安装数据的想法?到目前为止,我已经尝试了不同的多项式次数 (kx,ky) 以及压力和焓的对数输入。
解决方法
Gekko 可以从数据生成 bspline,也可以使用来自另一个 bspline 生成器的节点和系数。这是使用来自另一个生成器的节点和系数的 example。
from gekko import GEKKO
import numpy as np
#knots and coeffs
m = GEKKO(remote=False)
tx = [ -1,-1,1,1]
ty = [ -1,1]
c = [1.0,0.33333333,-0.33333333,-1.0,0.11111111,-0.11111111,1.0]
x = m.Var(0.5,1)
y = m.Var(0.5,1)
z = m.Var(2)
m.bspline(x,y,z,tx,ty,c,data=False)
m.Obj(z)
m.solve()
Gekko 也可以从数据生成 bspline
from gekko import GEKKO
import numpy as np
#raw data
m = GEKKO(remote=False)
xgrid = np.linspace(-1,20)
ygrid = xgrid
z_data = x*y
x = m.Var(0.5,xgrid,ygrid,z_data)
m.Obj(z)
m.solve()
但如果您已经有了想要实施的东西,我建议您使用自己生成的那个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。