微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两相区域中coolprop数据的GEKKO bspline问题

如何解决两相区域中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 左右的热函所覆盖的最大值。

Results from Gekko

Raw coolprop data

Correct spline from Scipy

没有人有如何调整B样条对象正确地安装数据的想法?到目前为止,我已经尝试了不同的多项式次数 (kx,ky) 以及压力和焓的对数输入。

解决方法

Gekko 可以从数据生成 bspline,也可以使用来自另一个 bspline 生成器的节点和系数。这是使用来自另一个生成器的节点和系数的 example

bspline

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 举报,一经查实,本站将立刻删除。