十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

压缩机膨胀机变工况建模:无量纲相似准则与Matlab特性拟合实战

压缩机膨胀机变工况建模:无量纲相似准则与Matlab特性拟合实战 搞系统级仿真的人尤其做过压缩空气储能、燃气轮机、制冷空调循环动态建模的应该都有这种体会手头压缩机或膨胀机的设计点参数齐得很额定压比、额定流量、额定效率一应俱全可真要把模型跑起来按负荷跟随、启动、停机这些变工况工况去算就发现事情没那么简单。我当年搭储能系统动态模型时就卡在这上面——样本上给的数据全是单点可仿真一拉工况压比虚高、流量算错、效率曲线像过山车整套模型根本没法收敛。后来折腾了一圈把问题收敛到了两个字特性。解决思路也很明确必须拿到压缩机与膨胀机的变工况特性曲线再用无量纲相似准则把有限的数据点扩展成覆盖全工况的特性面。这套方法配合Matlab做曲线拟合和曲面插值是目前工程上最主流、也最容易被新手绕晕的做法。这篇博文我从原理讲到代码从拟合策略讲到排坑经验把我实际项目中踩过的坑、总结的套路全部交代清楚希望能给正在做压缩机、膨胀机建模或者做相关系统仿真的朋友省下几周时间。1. 为什么要变工况建模绕不开无量纲相似准则1.1 单点设计数据与真实运行工况的差距压缩机、膨胀机这类旋转机械厂家样本上最常见的就是一组设计工况点。比如某型号离心压缩机设计流量是12.5 kg/s设计压比3.3设计转速14800 rpm额定等熵效率86%。这些数据用于选型没问题用于系统方案估算也够用但一旦要建动态仿真模型、做控制策略验证或者变负荷能力分析就必须回答一连串问题流量降到7 kg/s时压比还能维持多少转速提到110%时效率往哪个方向跑进口温度从15℃升到35℃特性线整体平移多少这些问题的答案就是变工况特性曲线。严格来说一台压缩机的全工况特性是一个多维曲面自变量包括转速、流量、进口压力、进口温度因变量包括压比、效率、功率。想通过台架实验把整个曲面全部测出来成本极其高昂实验周期也很长。实际工程中厂家通常只会提供几条等转速线的数据甚至只有设计点附近的数据。这时候如果直接拿这几条线做插值误差大不说往往还因为坐标不一致导致数据完全对不上。有一说一我在项目里第一次尝试直接拿折合流量和压比做二维插值时就出现过不同进气条件下的数据点互相打架的情况。后来才理解问题不在于插值算法本身而在于没先做无量纲化——也就是把不同进口温度、压力、转速下的运行状态归一到同一个相似基准里让散落在不同坐标下的实测点落到同一条特性线上。1.2 无量纲相似准则到底在相似什么无量纲相似准则的物理基础其实在教科书里就有对几何相似的旋转机械当流动的马赫数和雷诺数对应相等时内部的流场就是相似的。基于这个相似性可以把压比、效率、流量、转速这几个物理量组合成若干个不随绝对工况变化的无量纲参数从而把不同工况下测到的数据统一到一套通用特性曲线上。这里的关键是马赫数相似。旋转机械内部流动的气体速度与叶轮线速度密切相关而叶轮线速度正比于转速乘直径气体音速正比于根号下温度。所以转速对相似性的影响本质上是转速对应的马赫数的影响。把转速按进口温度的根号做折算就是标准的折合转速n_corr n / √(T_in / T_ref)流量这边同理。质量流量与密度、流速和通流面积有关密度正比于压力除以温度流速相似又要求马赫数相同所以折算后得到折合流量m_corr m × √(T_in / T_ref) / (p_in / p_ref)为什么要这样组合我一般跟人解释的时候打一个比方两台几何相似的机器只要叶轮马赫数相同气体在叶轮里的流动姿态就一样速度三角形成比例。这时候如果流量也满足相似关系那么流道内各处的速度三角形就都成比例压比和效率自然就一致了。换句话说无量纲相似准则把温度变了、压力变了、转速变了这些外在因素剥离开留下的才是反映机器本身性能的内在规律。还需要说明一点严格的相似还要求雷诺数相等。但工程上压缩机、膨胀机的工况范围里雷诺数通常处于自模化区域雷诺数变化对特性的影响相对小尤其在高压比大流量区间完全可以忽略。这也是无量纲相似准则能在工程建模中被广泛接受的原因。1.3 工程上最常用的三种无量纲化形式工程上处理压缩机、膨胀机特性无量纲化有三种常见形式各有各的适用场景第一种就是前面说的折合参数形式用进口温度、压力做折算得到折合转速、折合流量。这种形式数值直观跟厂家实验数据的输出格式几乎一致系统仿真里最常用。做燃气轮机和压缩机行业的人张口闭口折合转速换算转速说的基本都是这一套。第二种是系数形式把流量换算成流量系数φ压头换算成压头系数ψ效率直接看等熵效率η。这种形式学术味更浓公式里用到叶轮直径D和叶尖速度uφ m / (ρ × D² × u) ψ h / (u² / 2)好处是几何尺寸的影响被显式包含了可以对比不同规格机器的特性。但实际系统仿真中叶轮直径、叶尖速度这些参数往往拿不全反而约束了使用。第三种是相对值形式把流量、转速、压比都归一化成相对设计点的百分数也就是常说的相似率换算。比如流量比、转速比、压比分别除以额定值。这种形式在电力行业和热力系统设计软件里出现频率很高优点是直观缺点是丢掉了绝对工况信息跨机型对比能力弱。实际项目中我的做法是先用折合参数形式做数据预处理和曲线拟合然后在系统仿真模型内部再换算回真实工况。这样既保证了特性的相似性对外又保留了明确的物理量纲。2. Matlab建模前的数据准备与无量纲化处理2.1 数据来源实验数据、样本数据、还是仿真数据建模之前先要解决的问题是数据从哪来。这个问题的答案直接决定后面拟合策略和精度预期。如果项目有条件做台架实验那自然是最理想的情况。实验数据通常按等转速线记录每条等转速线下测多个流量点记录压力、温度、流量、转速、功率。这种数据最干净物理规律体现得最清晰直接把实验记录整理成数据表格就行。需要注意的是实验数据往往带测量噪声特别是效率这种间接计算量由温度、功率换算而来噪声会被放大后面说数据清洗的时候会详细讲。如果只有厂家样本那就得靠扫描或者从PDF里抠数据了。样本上一般给的是设计点参数运气好的话有几条等转速特性线的图形但没有原始数据表。这时候要么用图形取点工具手动提点要么用Matlab的Image Processing Toolbox从曲线图里自动提取。手动取点虽然累但胜在可控曲线交点、拐点、端点都能照顾到。自动取点需要先做颜色分离和坐标标定曲线重叠严重的时候效果并不理想。最不推荐的是拿纯仿真数据拟合。如果仿真软件本身的性能模型就不准拟合出来的特性自然没有物理基础属于自欺欺人。我自己见过一些项目拿CFD结果强行拟合出一条漂亮曲线结果跟真机实测对不上整个仿真链路的可信度都被质疑。数据源头的可靠性再怎么强调都不过分。2.2 无量纲化计算的代码实现数据准备好之后第一步就是做无量纲化。Matlab里面这段代码非常简单但细节特别容易出错。先把原始数据整理成三个列向量原始流量m_raw或者体积流量、标况流量先统一单位、进口温度T_in单位K不是℃、进口压力p_in单位Pa或bar统一即可、转速n单位rpm。然后选基准参考点。这里的选择有讲究参考温度取设计点进口温度参考压力取设计点进口压力这样折合参数在额定点附近数值最接近原始数据直观上便于跟样本对照。代码实现大概是% 折合参数计算 T_ref (设计点进口温度, K); p_ref (设计点进口压力, Pa); T_in_K T_in 273.15; m_corr m_raw .* sqrt(T_in_K / T_ref) ./ (p_in / p_ref); n_corr n ./ sqrt(T_in_K / T_ref); % 压比与效率直接计算 p_ratio p_out ./ p_in; eta_is (T_out_is - T_in) ./ (T_out - T_in); % 压缩机这里有个容易踩的坑温度换算。进口温度如果是摄氏温度直接除以基准温度算折合差出来273.15 K的偏移折算后的数字偏差大得离谱。另一个坑是压力必须用绝对压力表压一定要先加上大气压再参与计算否则压比全错。我还习惯在折合计算后立刻出图把不同工况下的数据点按折合转速分组画出来用不同颜色标出。这样一眼就能看出数据是否落在合理区间哪些点明显偏离散得很远也为后面的清洗提供了直观依据。2.3 数据清洗与坐标变换的坑无量纲化完成之后还不是直接拟合必须先清洗数据。这里说的清洗不是把看着不舒服的点删掉而是有依据的筛选。第一个原则是物理可行性偏离等转速线趋势超过合理范围的点大概率是测量或记录错误要剔除。比如压比-流量曲线通常是单调下降的转速固定时流量增大会伴压比降低如果出现个别点反向先确认不是喘振点附近的数据再考虑剔除。第二个原则是稀疏区域处理有些转速区域数据点很少比如只有两个点强行拟合一条三次多项式完全是在碰运气。这种情况我的建议是不要单独拟合而是用相邻转速的数据做补充或者降低该区域模型的阶次。第三个容易忽略的点是数据去重与排序。整理数据时一定要把每条等转速线按折合流量从小到大排序不然polyfit出来的系数完全乱套。我在早期项目里就吃过这个亏数据表格里流量没排序polyfit结果诡异查了半天才发现是数据顺序问题。还有一个进阶处理效率数据往往比压比数据更脏。效率是间接量受温度测量误差影响特别大。对效率曲线做滤波或者平滑处理是有必要的但平滑窗口不要开太大否则效率峰值会被削平后面控制策略里做最优转速优化的结果就不准了。3. 特性曲线拟合的核心代码与实现细节3.1 等转速线的多项式拟合策略数据清洗完就可以开始拟合了。最经典的策略是对每条等转速线分别做多项式拟合。压比-流量曲线一般用二次或三次多项式就够了因为等转速线在特性图上本来就比较光滑如果三次多项式拟合出来还有明显波浪那基本说明数据有问题或者阶数选择不合适。实际拟合时我会对每条等转速线跑一个循环先尝试三次多项式挡掉拟合残差过大的情况再降阶n_corr_list unique(n_corr); % 提取等转速线 poly_coeffs cell(length(n_corr_list), 1); for i 1:length(n_corr_list) idx abs(n_corr - n_corr_list(i)) 0.002; % 按转速分组 m_i m_corr(idx); pr_i p_ratio(idx); % 尝试三次多项式 p3 polyfit(m_i, pr_i, 3); pr_fit3 polyval(p3, m_i); res pr_i - pr_fit3; if max(abs(res)) 阈值 % 阈值根据量级确定 p3 polyfit(m_i, pr_i, 2); % 降阶为二次 end poly_coeffs{i} p3; end这个阈值怎么定我的经验是看压比量纲如果压比在1.5到4之间残差绝对值的上限可以放宽到0.02到0.03如果压比很高接近10残差上限放宽到0.05也不影响整体精度。关键是看拟合曲线在后续仿真里是否会引起数值振荡而不是一味追求残差最小。3.2 效率特性拟合与峰值偏移处理效率曲线是建模的另一个关键点也是最容易做砸的地方。效率随流量的变化通常是先升后降的拱形曲线所以二次多项式是最自然的选择。但直接对效率-流量做二次拟合有一个隐患每条等转速线的效率峰值点所对应的流量位置并不固定通常会随转速升高向大流量方向移动。如果不考虑这个偏移把每条线分开独立拟合拟合出来的曲面在峰值附近容易起鼓包仿真扫过这个区域时效率会突然跳高又跳低系统动态响应看起来特别假。这些年我摸索出的做法是对效率曲线的自变量做归一化处理把折合流量除以这条转速线对应的堵塞流量或设计流量得到相对流量然后再做二次拟合% 对每条等转速线 m_rel m_corr_i / m_corr_design_i; % 相对流量 p_eta polyfit(m_rel, eta_i, 2);用相对流量做自变量后效率峰值点在不同转速下的位置会接近一致拟合出来的效率曲面自然平滑。这个细节我跟不少人提过效果显著但很多代码里压根没人写。3.3 从离散曲线到连续特性曲面拟合完每条等转速线之后下一步是把整个转速区间内的特性变成一个连续曲面这样仿真时任意转速、任意流量都能查出对应的压比和效率。最直接的做法是构造插值函数。把折合流量m_corr、折合转速n_corr作为自变量压比pr和效率eta作为因变量用scatteredInterpolant或者griddedInterpolant建立二维插值F_pr scatteredInterpolant(m_corr_all, n_corr_all, pr_all, linear, linear); F_eta scatteredInterpolant(m_corr_all, n_corr_all, eta_all, linear, linear);插值方法我建议用线性插值不要默认选natural或nearest。原因是特性曲面在宽广范围内变化比较平缓线性插值足够还不会在数据稀疏区产生过冲。只有当你手里数据点极其密集、对光滑性要求特别高时才考虑用cubic。另外要注意的是插值域范围。scatteredInterpolant默认不支持外插如果你在仿真中给出的折合流量或折合转速超出了数据覆盖范围它直接返回NaN这一下就能让整个Simulink模型报错。解决方法是自己包一层保护逻辑检测输入是否在范围内超出时就按边界值处理或者改用最近的等转速线数据外推。3.4 压缩机与膨胀机的差异化处理前面讲的拟合方法对压缩机和膨胀机都适用但两者有几个本质区别处理不好会让模型偏差非常大。第一是压比的定义方向。压缩机压比是出口压力比进口压力大于1膨胀机习惯用膨胀比是进口压力比出口压力也是大于1。在代码里统一用高压侧比低压侧算是可以的但要注意效率公式里温比的指数方向反了。等熵效率的计算公式压缩机是η_c (T_out_is - T_in) / (T_out - T_in)膨胀机是η_e (T_in - T_out) / (T_in - T_out_is)其中T_out_is是等熵膨胀过程的出口温度。这两者在代码里要是写混了效率直接变成大于1或者小于0一看就知道不对劲。第二是阻塞工况的差异。压缩机在大流量端有堵塞choking现象流量到某个临界值后不再随压比降低而增大。膨胀机在喷嘴达到音速后也存在临界流量。区别在于膨胀机的高膨胀比工况更容易触发阻塞所以拟合膨胀机特性时最好显式把阻塞流量作为一个约束参数加进去。如果忽略这一点在大压比工况下仿真流量会被明显高估甚至高估20%以上。第三是喘振边界。压缩机在小流量区域存在喘振边界这条线左边是失稳区正常控制策略不允许运行。拟合曲线时如果能拿到喘振边界数据建议单独存一条曲线仿真时加一个边界检测模块一旦工况点越界就触发防喘振逻辑。膨胀机虽然没有明显喘振但在极低负荷下效率下跌得非常快拟合时要在低流量端加约束防止效率被多项式拟合出负值。4. 常见问题与工程排查实录4.1 拟合外推发散用Matlab做完拟合之后最常见的问题就是外推发散。场景一般是仿真模型里给定了一个偏离数据范围的折合转速插值函数返回了NaN或者多项式外推后压比变成负的、效率超过100%整个模型直接崩掉。我排查这类问题时第一步先检查数据覆盖范围第二步看代码里有没有做边界保护。很多时候问题根本不是算法本身而是没有对输入做限幅。边界保护的策略有两种一种是简单限幅超出范围就卡边界值另一种是外推用最近等转速线的多项式继续算。我个人更推荐限幅加警告因为外推值没有物理根据一旦用到系统控制逻辑里容易出大问题。宁可仿真结果在边界处保持恒定也比跳一个离谱值好。4.2 无量纲化后曲线不重合另一个高频问题是按理说无量纲化之后不同进气条件下的数据点应该落在一起但实际画图发现它们分成好几簇根本不重合。这种情况下我会先检查雷诺数影响。刚才提到过自模化区域内雷诺数影响可以忽略但这是有条件的。如果工作压力特别低、工质温度特别高或者叶轮直径特别小雷诺数会跌出自模化区特性曲线就会出现可观测的偏移。解决方法是引入雷诺数修正系数把效率和压比乘以一个修正因子。其次要检查的是几何是否真的相似。如果数据来自可调导叶机构比如压缩机的进口导叶、膨胀机喷嘴环几何参数本身在变那单靠转速和流量两个无量纲参数是远远不够的还必须把导叶开度作为第三个自变量。这种情况下数据必须按导叶开度分层处理每条特性线只对应一个导叶开度模型也得升级成三维插值。还有一个更隐蔽的原因温度测点位置不统一。有些实验数据用的是机壳表面温度有些用的是管道中热电偶温度两者在高压比工况下差距不小折算出来的无量纲参数自然对不上。这种数据只能重新核测点或者放弃参与拟合。4.3 阻塞工况与边界约束阻塞工况前面提过这里给一个具体处理例子。假设拟合出的压比-流量曲线在低压比端也就是大流量端持续单调下降预测流量达到25 kg/s但根据喷嘴面积和工质物性计算临界流量只有21 kg/s。那么实际物理过程是压比低到一定程度后流量维持在21 kg/s不再变化曲线变成一段水平线。如果没有这段水平线约束系统仿真的压比往低压方向摆动时流量预测会偏大热力系统的能量平衡随之偏离。我的做法是在拟合完成后手动加约束找出各转速下流量值的上限形成一条包络线然后对模型输出做饱和处理m_corr_final min(m_corr_interp, m_choke(n_corr));其中m_choke是随转速变化的临界流量数组一般用设计点附近的临界流量乘以根号转速比来做近似。注意这个做法只适用于没有实验数据条件下的近似如果喷嘴喉部面积和形状有详细参数用气动公式算临界流量更可靠。4.4 模型接入Simulink的最后一步曲线拟合和插值函数做完还要把模型封装成可被Simulink调用的形式才能实际投入使用。我最常用的做法是写一个独立的函数文件输入是折合转速和折合流量输出是压比、效率、功率内部调用拟合好的插值函数或查找表。如果要用Simulink的Lookup Table模块那就需要把特性曲面离散成规则网格再用n-D Lookup Table读表。这个做法的优点是在仿真中计算速度快、适合实时仿真缺点是高精度曲面的网格点一旦取得太多模型文件会变得很大。一般折中取21×21或者31×31个网格点对动态仿真的精度已经足够。还有一个建议把无量纲换算和反换算写进同一个封装函数里这样Simulink模型里看到的输入输出都是真实物理量比如m_kg_s、n_rpm、p_ratio模型内部才做无量纲转换。跟控制逻辑对接的时候真实物理量更直观也方便设置边界报警和防喘振策略。5. 从曲线到模型完整封装流程的实操心得5.1 一个可以直接套用的Matlab脚本结构很多朋友喜欢把曲线拟合、插值、封装全部写在一个大脚本里图省事。但实际项目迭代几次后这种脚本改起来非常痛苦。我现在习惯把流程拆成四个文件数据导入与清洗脚本、无量纲化与拟合脚本、插值函数生成与保存脚本、Simulink调用用的函数文件。前三个每次跑一遍生成一个.mat文件保存插值对象第四个函数在仿真中反复调用。这里给出一个可以参考的Simulink调用函数的骨架function [pr, eta, P_shaft] compExpModel(n_corr_in, m_corr_in, T_in, p_in, params) pr_limit params.pr_limit; n_limit_max params.n_max; n_limit_min params.n_min; n_c max(min(n_corr_in, n_limit_max), n_limit_min); m_c max(m_corr_in, params.m_min); % 防止负流量 pr params.F_pr(m_c, n_c); eta params.F_eta(m_c, n_c); % 根据物理约束修正 pr max(pr, params.pr_min); m_c_actual m_corr_in * (p_in / params.p_ref) / sqrt(T_in / params.T_ref); P_shaft 计算功率; % 压比、效率、流量、温度四者的函数 end这里把边界限幅放在函数开头统一处理比在Simulink里加一堆Saturation模块要清爽得多调试起来也更快。5.2 如何对拟合结果做工程可信度检查拟合完不能直接就交付一定要做可信度检查。我会做三件事第一件是残差分析。把所有数据点的拟合残差画成散点图确认残差是零均值、无明显趋势的白噪声。如果残差在某个流量区间系统性为正、在另一个区间系统性为负说明多项式阶数不够或者形式不对需要调整。第二件是曲线形态检查。把拟合出来的曲面画成三维图或者等值线图人眼扫一遍。合格的特性曲面应该是光滑的、单调性合理的。如果等值线出现奇怪的波纹、尖刺哪怕拟合残差很小也说明模型有隐患。这类形态问题在数据稀疏时尤其容易发生。第三件是极值点合理性检查。压比最大值是否接近设计值附近效率峰值是否落在80%到87%这个合理区间如果某个转速下效率插值出了91%甚至99%那基本可以断定数据或者拟合出了问题必须排查。我见过有同事拿到拟合结果直接交付结果效率超过100%的漂亮曲面图审核时被专家一眼打回来场面非常尴尬。5.3 基于个人经验的最终提醒多说一句这套方法看着简单但真正做下来大头还是在数据整理和边界处理上。拟合本身用几十行代码就能搞定可数据的采集、清洗、无量纲化、物理约束每一项都比拟合更耗时间。尤其是当你跟不同厂家打交道的时候样本上怎么定义压比、效率怎么标定各家公司习惯还不一样拿到手的数据能不能直接进模型一定要先做一致性核对。就像我开头说的变工况特性曲线是无量纲相似准则在旋转机械建模里的最好落点。把这些东西做扎实之后你会发现系统级仿真的稳定性和可信度会上一个台阶。现在这个封装好的模型已经在我好几个项目里服役从储能系统负荷跟随到压缩机防喘振控制策略验证表现都很稳。最后再分享一个小技巧建模过程中所有数据处理步骤和拟合参数都顺手记录在一个文档里等评审或复现的时候能省下大量解释成本——这也是独立做完一个可靠模型的底气所在。
返回列表