Modelica.R134a无setState_hs函数,如何由h₆、S₆计算扩压器出口压力P₆
解决R134a由h和s计算压力的问题
替代计算方法
- 迭代逼近法:利用R134a物性的单调性,通过迭代缩小压力范围求解:
- 根据制冷循环工况预估压力区间(比如冷凝压力附近),设置初始上下限。
- 对候选压力调用库中
setState_ph/setState_ps函数,计算对应焓或熵。 - 对比计算值与目标h₆、S₆的误差,调整压力范围,直到误差小于设定阈值(如1e-6)。
- 查表插值法:若工况范围固定,预先生成R134a的h-s-压力 lookup table,模型中通过线性/非线性插值直接获取压力,适合工况稳定的场景,计算效率更高。
Modelica自定义实现思路
1. 封装迭代求解函数
编写自定义函数实现h-s到压力的转换,示例框架:
function getPressure_hs input Real h "比焓,单位:J/kg"; input Real s "比熵,单位:J/(kg·K)"; output Real P "压力,单位:Pa"; protected Real P_low = 1e5; // 初始下限,按需调整 Real P_high = 1e6; // 初始上限,按需调整 Real s_calc; Real error; Real tol = 1e-6; // 误差阈值 Integer max_iter = 50; // 最大迭代次数 Integer iter = 0; algorithm while iter < max_iter and abs(error) > tol loop P = (P_low + P_high)/2; // 调用库函数获取对应压力-焓下的熵 s_calc = Modelica.Media.Refrigerants.R134a.R134a.setState_ph(P, h).s; error = s_calc - s; if error > 0 then P_high = P; // 熵偏大,压力偏高,调高压上限 else P_low = P; // 熵偏小,压力偏低,调低压下限 end if; iter = iter + 1; end while; end getPressure_hs;
注意:需根据所用R134a库的实际接口调整状态函数调用逻辑,初始压力范围要匹配你的循环工况,避免收敛失败。
2. 两相区针对性处理
若状态点处于两相区,可先通过熵计算干度,再关联饱和压力求解:
- 调用库中饱和状态函数(如
getSatState_p)获取对应压力下的饱和液/气熵s_f、s_g,计算干度x=(s - s_f)/(s_g - s_f)。 - 计算饱和焓
h_sat = h_f + x*(h_g - h_f),迭代调整压力直到h_sat与目标h₆匹配(饱和压力与饱和焓一一对应)。
3. 直接调用底层状态方程
如果库提供了R134a的底层状态方程接口(如基于REFPROP的封装),可联立h和s的状态方程,通过Modelica的数值求解器直接解出压力,精度最高,但需熟悉制冷剂状态方程的形式。
注意事项
- 迭代前先判断状态区(单相/两相),针对不同区域选择对应逻辑,避免边界收敛问题。
- 加入最大迭代次数限制,防止死循环。
内容的提问来源于stack exchange,提问作者Dahmani Merzaka
相关产品推荐
相关产品推荐

