无法传入NumPy二维数组的双变量函数彩色热力图绘制求助
无法传入NumPy二维数组的双变量函数彩色热力图绘制求助
我明白你的问题啦!你写的area_req函数依赖CoolProp的PropsSI方法,而这个方法没办法直接处理NumPy的二维数组——这就是直接把meshgrid生成的X、Y传进去报错的核心原因。没关系,用双重循环逐个计算每个网格点的Z值就可以完美解决,具体修改如下:
问题核心
CoolProp的PropsSI仅支持标量或者一维数组输入,而meshgrid生成的X、Y是二维数组,直接传入会触发类型不兼容的错误。通过循环逐个传入标量值,就能满足area_req的输入要求。
修改后的完整代码
import numpy as np import CoolProp.CoolProp as cp import matplotlib.pyplot as plt # 所有单位采用SI制 mdot = 10000 / 7936.64 # 蒸汽质量流量 P_atm = 101000 # 大气压 def area_req(P1, P2): P_before_trap = P_atm + (P1) * 6894.76 # 疏水阀前压力 P_after_trap = P_atm + (P2) * 6894.76 # 疏水阀后压力 enthalpy_1 = cp.PropsSI('H','P',P_before_trap,'Q',0,'water') # 疏水阀前凝结水焓值 enthalpy_2 = enthalpy_1 # 疏水阀为等焓设备 x_after_trap = cp.PropsSI('Q','P',P_after_trap,'H',enthalpy_2,'water') # 疏水阀后蒸汽干度 mdot_flash = x_after_trap * mdot # 闪蒸蒸汽质量流量 mdot_cond = (1 - x_after_trap) * mdot rho_steam = cp.PropsSI('D','P',P_after_trap,'Q',1,'water') # 混合物中蒸汽密度 rho_water = cp.PropsSI('D','P',P_after_trap,'Q',0,'water') # 混合物中凝结水密度 area_steam = mdot_flash / rho_steam / 20.32 # 蒸汽组分所需流通面积(对应流速4000 ft/min) area_cond = mdot_cond / rho_water / 1.524 # 凝结水组分所需流通面积(对应流速5 ft/sec) area_req = area_cond + area_steam return area_req # 创建x、y轴的数值序列 x = np.linspace(0, 100, 100) y = np.linspace(0, 100, 100) X, Y = np.meshgrid(x, y) # 初始化与X同形状的空数组,用于存储每个网格点的计算结果 Z = np.zeros_like(X) # 双重循环遍历所有网格点,逐个计算Z值 for i in range(X.shape[0]): for j in range(X.shape[1]): # 传入单个标量值,符合area_req的输入要求 Z[i, j] = area_req(X[i, j], Y[i, j]) # 绘制彩色热力图(优化了坐标轴匹配与标签) plt.imshow(Z, cmap='viridis', extent=[x.min(), x.max(), y.min(), y.max()], origin='lower') plt.colorbar(label='所需流通面积') plt.title('疏水阀所需流通面积热力图') plt.xlabel('P1 (psig)') plt.ylabel('P2 (psig)') plt.show()
额外说明
- 我在绘图部分加了
extent和origin='lower'参数,让坐标轴刻度和P1、P2的实际范围对应,同时补充了轴标签,让图表更直观易读。 - 100x100的网格总共10000次计算,对于CoolProp来说这个计算量完全在可接受范围内,不会有明显卡顿。
备注:内容来源于stack exchange,提问作者remusconnor
相关产品推荐
相关产品推荐

