简介:一份关于制冷系统设计计算中经验公式应用的PDF文献,作者林瑞墉来自厦门水产学院机械工程系。内容面向制冷系统优化设计、性能仿真与数值计算的工程技术人员及高校相关专业师生,旨在用拟合经验公式替代繁琐的逐项迭代和表格插值,提高计算效率并降低内存开销。文中重点讨论单位容积制冷量、制冷量换算系数、压缩机输气系数和指示效率四类常用项目,提出基于最小二乘曲面拟合的二元多项式,针对氨、R12等常用制冷剂给出经验公式及系数表格,可直接用于压缩机选型、工况换算和效率估算。文件为单篇PDF文档,约500KB,共1个文件,方便下载后离线查阅。目前已有115人浏览学习,适合作为课程设计、科研仿真或工程初算时的简洁参考。
1. 制冷系统优化设计卡在迭代,经验公式省的不只是时间
做制冷系统优化设计的人大多有过这种体会:目标函数是非线性的,搜索算法一步要迭代几十次,每一次迭代都得反复算制冷剂热物性。如果走“查表加插值”的老路,表格数据得常驻内存;如果走“马丁-侯状态方程或 R-K 状态方程”的精确路线,每一次迭代都要解高次方程,算得慢不说,程序还越写越臃肿。论文里林瑞墉老师的做法很直接:对单位容积制冷量、制冷量换算系数、输气系数、指示效率这四类高频参数,直接用最小二乘曲面拟合出显式多项式,用的时候代系数即可。公式形式统一、不占内存、不查表、不插值,精度经检验能满足工程设计需求。这篇文章就把这组经验公式的方法论和落地写法拆开讲,适合正在做制冷系统仿真或压缩机选型程序的人参考。
2. 最小二乘曲面拟合:二元多项式怎么把热物性表压成显式函数
2.1 为什么选择二次曲面拟合而不是分段插值
从数值计算的角度看,制冷系统优化设计里最常换的输入就是冷凝温度t_cond和蒸发温度t_evap,这两个温度一变化,制冷剂的单位容积制冷量、输气系数等指标跟着变。文献里给出的数据往往是二维表格,例如行是冷凝温度、列是蒸发温度,中间是目标参数的实测值或由热物性关联式计算出的值。如果直接用二维插值,每次迭代都要根据当前温度去表格里找相邻网格点,再做双线性插值。这种做法的优点是简单,缺点是表格必须常驻内存、插值本身有额外的寻址开销,而且在网格稀疏的区域插值误差会明显变大。
经验公式的思路是用一个二元多项式在最小二乘意义下逼近整个曲面。假设有网格点(t_cond_i, t_evap_j),对应函数值为q_v(i,j),要找到一个多项式P(t_cond, t_evap),使得所有网格点上的偏差平方和最小。论文里采用的策略是分两步走:先固定蒸发温度,对冷凝温度做一元最小二乘拟合;再对求出的系数做关于蒸发温度的拟合。这是最小二乘曲线拟合在曲面上的直接推广,实现简单,数值稳定性也容易控制。
2.2 分步拟合的数学过程
2.2.1 固定蒸发温度 t_evap、对冷凝温度 t_cond 拟合
设一共有m个蒸发温度网格,n个冷凝温度网格。对第j个蒸发温度,构造一个关于t_cond的多项式:
P_j(t_cond) = c_0(j) + c_1(j) * t_cond + c_2(j) * t_cond^2 + ...用最小二乘求出这一组系数c_0(j), c_1(j), c_2(j), ...。这一步相当于把二维曲面沿着冷凝温度方向 “切” 成m条曲线,每条曲线单独拟合。
2.2.2 对系数 c_k(j) 再拟合
得到一个c_k(j)序列后,它是蒸发温度的函数。继续用最小二乘拟合:
c_k(t_evap) = d_0 + d_1 * t_evap + d_2 * t_evap^2 + ...把两个方向的多项式组合起来,就是论文里给出的那种形式:
F(t_cond, t_evap) = Σ_a Σ_b coeff[a][b] * (t_cond - C1)^a * (t_evap - C2)^b注意多项式里的自变量不是直接用温度,而是做了平移,写成了(t_cond - 常数)和(t_evap - 常数)的幂次形式。这样做的好处是降低多项式在拟合区间内的条件数,避免高阶幂次导致数值溢出的风险。实际编程时,我会把C1和C2一起做成常量数组,和系数表放在同一个结构体里。
2.3 拟合过程中网格缺值与虚拟值处理
论文里特别提到一个问题:单位容积制冷量的二维网格中,并不是每个交叉点都有物理意义上的值。比如某些低蒸发温度与高冷凝温度的组合,对应的压缩比过大,实际工况很少用到,原文献的表格里留空。最小二乘拟合要求所有网格点都参与计算,所以必须先给这些空位补上“虚拟值”。论文的做法是在拟合程序里对缺少有效值的网点先估计一个合理数值,再统一进入拟合流程。
我自己的经验是,虚拟值的选择会影响拟合曲面在边界区域的形状,尤其是高阶多项式对外推很敏感。稳妥的做法是把虚拟值取成相邻有效点的线性外推结果,并且给这些点附加一个较低的权重,避免它们过度拉偏拟合面。在论文给出的系数表中,网格数据后标注了“样本来源”,部分网格点明确来自[1]、[2]等文献,这说明原始数据本身就存在多源整合的问题,拟合前统一格式是必要的预处理步骤。
3. 单位容积制冷量 q_v 的经验公式落地
3.1 按焓差定义还是按表格拟合
论文里先给出了单位容积制冷量的理论定义:
q_v = (h_蒸发 - h_节流阀前) / v_蒸发其中h_蒸发是压缩机入口处的制冷剂蒸气焓值,h_节流阀前是节流前的液态制冷剂焓值,v_蒸发是压缩机入口的蒸气比容。理论计算时,这三个状态参数可以用热物性关联方程求出,但每算一次都要解状态方程,开销大。
当压缩机入口为饱和汽态时,这三个值都只取决于蒸发温度和冷凝温度,因此整个表达式本质上是一个二元函数。论文的方法是针对多种制冷剂,先在网格点上用文献数据算出q_v值,再拟合成形如上面的二元多项式。这样做的好处是迭代时不再反解状态方程,查系数表就能算。
3.2 系数表怎么读
论文的表 1 到表 5 给出了不同制冷剂的拟合系数,表 5-1 到 5-3 是单位容积制冷量的详细系数。表格的格式很统一,每一组都包括:
| 字段 | 含义 |
|---|---|
| 制冷剂 | 适用对象,如 R12、R22、R502、R717(氨)等 |
| 冷凝温度范围 | 拟合数据的适用范围 |
| 蒸发温度范围 | 拟合数据的适用范围 |
| 幂次常数 | 多项式在 t_cond 方向的最大幂次 p、在 t_evap 方向的最大幂次 q |
| 多项式系数 | 按幂次展开后的系数值 |
| 检验点数 | 用于误差检验的独立数据点数 |
| 最大绝对误差 | 拟合面与原始数据点在检验点上的最大偏差 |
| 平均绝对误差 | 检验点上偏差绝对值的平均值 |
| 样本来源 | 原始数据出自哪篇文献 |
注意表格里的系数使用的是科学计数法,比如0.1234E+03表示0.1234 × 10^3。OCR 出来的文本中有些负数被拆行了,读表时要结合上下文判断符号归属。论文末尾有一段说明,表格中的数据以计算机算法语言的单精度浮点数格式表示,0.1234E-03就是0.1234 × 10^(-3),这一点在写解析器的时候要格外小心。
3.3 Python 实现:输入温度直接出 q_v
拟合公式的通用形式可以写成:
# -*- coding: utf-8 -*- def poly2d_value(coeff, p, q, x_off, y_off, x, y): """ 二元多项式求值 coeff: 2D list, coeff[a][b] 对应 (x - x_off)^a * (y - y_off)^b p: x 方向最高幂次 q: y 方向最高幂次 x_off, y_off: 自变量平移常量 x, y: 输入的冷凝温度、蒸发温度 """ result = 0.0 for a in range(p + 1): for b in range(q + 1): result += coeff[a][b] * (x - x_off) ** a * (y - y_off) ** b return result这段代码是最核心的求值函数。coeff[a][b]的索引顺序是第一个维度对应(t_cond - C1)的幂次,第二个维度对应(t_evap - C2)的幂次。x_off和y_off就是论文公式里的两个常数项,拟合时已经确定。
调用时,只需要把对应制冷剂的一组系数填进去即可。比如 R22 的某组系数可能是p=3, q=3,那就传一个4x4的二维数组。这里我加上温度范围检查,防止外推超出拟合区间导致误差失控:
def qv_r22(t_cond, t_evap): """R22 单位容积制冷量,输入单位均为摄氏度""" # 这里替换为论文表 5 中 R22 的实际系数 coeff_r22 = [[1.2345E+02, -3.4567E+00, 1.2345E-02, -1.2345E-05], [-2.3456E+00, 4.5678E-02, -1.2345E-04, 1.2345E-07], [1.2345E-02, -2.3456E-04, 0.0, 0.0], [-1.2345E-05, 0.0, 0.0, 0.0]] if not (-40 <= t_evap <= 10 and 20 <= t_cond <= 60): raise ValueError("温度超出拟合范围,避免外推") return poly2d_value(coeff_r22, 3, 3, 50.0, -15.0, t_cond, t_evap)使用经验公式时有一个很容易踩的坑:把t_cond和t_evap用绝对温标代入。多项式系数是在摄氏温标下拟合出来的,如果换成开尔文,系数全部作废。调用前务必确认输入单位与拟合时一致。另外,拟合数据通常覆盖特定的温度区间,比如冷凝温度 20~50°C、蒸发温度 -40~10°C,超出这个范围后,多项式外推的误差增长很快。所以生产级代码里一定要加温度边界检查。
4. 输气系数 λ 与制冷量换算系数 ξ:压缩机的两个换算开关
4.1 输气系数的定义拆分与拟合
输气系数λ按定义是四个分系数的乘积:
λ = λ_v * λ_p * λ_t * λ_l其中λ_v是容积系数,由余隙容积和压缩比决定;λ_p是压力系数,反映吸气压力损失;λ_t是温度系数,受气缸壁与气体间温差影响;λ_l是泄漏系数。这四个系数都与压缩机的具体结构和工况有关。对于定型产品,直接采用制造厂的试验值最可靠;但在优化设计阶段,压缩机参数还没有确定,只能按理论公式计算。论文指出,从计算式分析可以得出λ是冷凝温度和蒸发温度的函数,因此可以拟合成二元经验公式,形式为:
# 输气系数的通用拟合形式 def compressor_lambda(t_cond, t_evap, coeff, p, q, C_cond, C_evap): """ 输气系数经验公式 拟合形式: λ = Σ coeff[a][b] * (t_cond - C_cond)^a * (t_evap - C_evap)^b 论文针对氨和 R12 的立式及 V 型压缩机分别给出了系数 """ return poly2d_value(coeff, p, q, C_cond, C_evap, t_cond, t_evap)论文表格中氨的拟合系数列在表 3 中,R12 的列在另一张表里。注意氨和 R12 的幂次可能不同,写程序时不能混用。我一般在代码里把系数定义成模块级常量,给每台压缩机一个独立的字典,避免在调用时传参出错。
实际工程中,输气系数还可以用更粗略的经验公式估算,比如λ = λ_v * λ_p * λ_t * λ_l分别用经验公式代入,但那样做参数太多,每个系数都有自己的适用范围。论文这条思路明显更适合数值优化:完全绕过物理分解,直接把最终的合成系数拟合出来,参数少,计算快。
4.2 制冷量换算系数:标准工况到设计工况的桥
制冷量换算系数ξ解决的是一个很现实的问题:样本上标的是标准工况制冷量,实际运行工况变了,制冷量怎么换算?论文给出的关系式是:
Q_设计 = Q_标准 * ξ而ξ的计算式为:
ξ = (λ_设计 / λ_标准) * (q_v_设计 / q_v_标准)其中Q_标准是标准工况下的制冷量,Q_设计是设计工况下的制冷量,λ_标准和λ_设计分别是两种工况下的输气系数,q_v_标准和q_v_设计是相应的单位容积制冷量。因为在标准工况下Q_标准、λ_标准、q_v_标准都是已知常数,所以ξ本质上只随设计工况的冷凝温度和蒸发温度变化,可以单独拟合成二元多项式:
def capacity_conversion_factor(t_cond, t_evap, refrigerant="NH3"): """ 制冷量换算系数 ξ = Q_design / Q_standard 论文表 2 给出了氨和 R12 立式/V 型压缩机的拟合系数 """ # 氨 - 立式压缩机系数示例(来自拟合表格,幂次 3x3) coeff_nh3 = [[8.7654E-01, -3.2100E-03, 1.2345E-05, -2.3456E-08], [1.2345E-02, -4.5678E-05, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]] # 系数占位,使用时替换为论文表 2 中的实际数值 if refrigerant == "NH3": return poly2d_value(coeff_nh3, 2, 1, 30.0, -15.0, t_cond, t_evap)使用换算系数时容易犯的错是拿错基准:制冷量换算系数依赖压缩机的型号系列,同一个制冷剂、不同系列(立式与 V 型)的系数不一样。论文表格中明确区分了压缩机的形式和制冷剂种类,选型计算前首先要确认样本上的制冷量对应的是哪个标准工况(如空调工况、标准工况),然后对照论文表格背靠背地选定系数组。
5. 指示效率 η_i 的拟合与整机验证
5.1 指示效率在功率计算中的位置
指示效率η_i表征压缩过程中实际指示功与理论绝热压缩功的偏离程度。它的重要性在于直接参与两个关键量计算:一是压缩机的有效功率,二是压缩机出口的制冷剂热力状态。有效功率的计算通常按:
P_eff = Q_comp / (η_i * η_m)其中η_m是机械效率。如果η_i算不准,后边的冷凝器热负荷、压缩机轴承选型、配电机功率都会跟着偏差。
论文对氨和氟利昂的立式、V 型压缩机的指示效率做了同样的二元多项式拟合。形式与前面的公式保持一致:
def indicator_efficiency(t_cond, t_evap, ref_type="NH3"): """ 指示效率 η_i 的经验公式 拟合形式: η_i = Σ coeff[a][b] * (t_cond - C1)^a * (t_evap - C2)^b """ # 氨立式压缩机的系数示例,实际数值以论文表 4 为准 coeff_nh3 = [[7.6543E-01, -2.1000E-03, 0.0, 0.0], [-3.2100E-03, 1.2345E-05, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]] return poly2d_value(coeff_nh3, 1, 1, 30.0, -15.0, t_cond, t_evap)与前面几个指标不同,指示效率的取值范围在 0.6 到 0.95 之间,本身的数值变化区间相对小。拟合多项式的次数不需要太高,论文里给出的检验结果显示,1~2次幂就能把误差控制在可接受范围。如果拟合次数取高了,会出现“过拟合”:训练点上误差极小,但检验点上的误差反而变大,特别是在温差较大的角落点。我自己在跑这类拟合时,一般先试2x2次,看最大绝对误差;如果某个角落点的误差超过5%,再考虑升次而不是一上来就用4x4。
5.2 拟合误差的验证方法
论文的表格里同时给出了“最大绝对误差”和“平均绝对误差”两个指标,这是检查拟合质量最直接的途径。我的做法是拿到经验公式后,先用原始文献里的表格数据做一次回代验证:
import numpy as np # 示意:把文献表格中的网格点代入公式,统计误差 def validate_formula(fit_func, grid_points, true_values): """ fit_func: 经验公式函数,输入 (t_cond, t_evap) 输出计算值 grid_points: 列表,每个元素为 (t_cond, t_evap) true_values: 对应网格点上的真实值(来自文献表格) """ errors = [] for point, true_v in zip(grid_points, true_values): calc_v = fit_func(point[0], point[1]) rel_err = abs(calc_v - true_v) / true_v errors.append(rel_err) errors = np.array(errors) print("样本数: %d" % len(errors)) print("最大相对误差: %.4f%%" % (errors.max() * 100)) print("平均相对误差: %.4f%%" % (errors.mean() * 100))运行后如果最大相对误差超过5%,猜都不用猜,多半是系数抄错或者温标用错。还有一个容易被忽略的问题:原始表格中个别网格点的数据本身存在印刷误差,如果拟合时那个点参与计算,它会把邻近区域的拟合面拉偏。在整理数据阶段画一张散点图,观察有无明显离群点,该剔除的剔除,然后用拟合误差反向检测,两轮下来基本能定位问题。
5.3 在优化迭代场景中的应用建议
把四类经验公式组合起来,就构成了一个完整的压缩机模块。每次迭代只需要传入t_cond和t_evap,依次查四个公式,得到q_v、λ、ξ、η_i,再计算出制冷量、功率和出口状态。与每次迭代都调用状态方程相比,这种做法的优势不只是省时间,更关键的是计算流程是确定性的——不会因为状态方程求解器不收敛而中断迭代。常见的做法是把拟合系数放在独立的配置文件中,类似JSON格式,这样换制冷剂时不需要重新编译程序,只改配置即可。要注意的是,经验公式只适用于拟合区域内,系统仿真时一旦搜索算法跑到边界外,需要回退到理论关联式计算,比如用马丁-侯状态方程跑一遍真值,再把结果拉回拟合域内继续迭代。论文最后建议在优化设计编程中优先采用经验公式,依据就在这里:稳定、快速、精度可接受。
在把公式写进正式代码前,可以用交叉验证做一次量化评估:随机抽取网格点的一部分作为训练集,另一部分作为验证集,对比两种划分下的误差差异。如果差异不大,说明拟合模型稳定;如果训练集误差远小于验证集误差,说明出现过拟合,应降低多项式次数。论文表格中给出的检验点数和误差数据,本身就保留了这个交叉验证的思路。直接引用来校验自己的实现是可行且稳妥的。
本文还有配套的精品资源,点击获取