做了几年电热氢综合能源系统的仿真,我一直有个感觉:各种平衡约束一列,模型能算,但算完总不知道系统到底“差在哪”。明明弃风率很低、弃光率也很低、负荷也都供上了,可折算到全年综合效率就是不理想。后来把观测口径从“能量平衡”换成“熵产”重新看整套系统,很多之前解释不了的现象才慢慢说得通。
这篇文章想聊聊我在Matlab里搭建面向可再生能源接入的电热氢综合能源系统熵态模型与机理分析框架时的一些思考。主要涉及三件事:为什么这种场景要引入熵态模型而不是只盯能量效率、熵产在电热氢系统里到底怎么分布、怎么把熵平衡方程写成可执行代码并用它做机理分析。适合正在做综合能源仿真、搞微电网调度、或者准备用电-氢耦合方向论文的同学参考。
1. 为什么在“多能互补”里引入熵,而不是只盯能量效率
1.1 电、热、氢三种能量的“价值密度”完全不同
先打个比方。把系统里流过的电、热水、氢气当成三种货币:电是所有支付场景都能用的现金;氢是旅行支票,能兑现,但兑现要排队、也要扣手续费;热则是只能在指定商店里消费的优惠券。三种货币面额相同的时候,实际购买力完全不同。
放到能量系统里,这个“购买力”就是能量品位。一度电能驱动电机、电解水、压缩空气,几乎可以百分之百转化为有用功,是高品位能量。氢气的化学能也很高,但它必须先经过反应或燃烧才能释放,释放过程已经有损耗。热水呢?300℃蒸汽可以带着汽轮机转,60℃热水连给吸收式制冷机提供驱动热都费劲。
如果只做功率平衡,这三种能量在程序里就只是三个数字——电功率、热功率、氢功率各归各守恒。但一旦涉及转换,比如电制氢、氢热电联供、电锅炉供热、余热回收,能量发生跨形态流动,就会出现一个很关键的问题:高品位能量降级成了低品位能量。能量总数没有变少,但这份能量“还能做什么事”变少了。热力学上,描述这种不可逆降级的核心量就是熵产。把全系统的熵产加总,相当于看这台机器吃进去的能量被消耗得有多“粗糙”。
综合能源系统和单一电网最大的区别就在这里。电网只做“数量平衡”,合格就行;而综合能源系统里能量频频跨形态转换,每一道转换都在发生品位贬值。如果不引入类似熵产这样的状态量,全年能耗账单分析就永远是笔糊涂账。
1.2 可再生能源接入后,传统效率评估开始失效
真正让我决定用熵态模型重新建模的,是可再生能源的强波动。
风机和光伏出力完全是气象驱动的,出力曲线一会儿爬升一会儿跳水。电解槽、电锅炉、燃料电池如果跟着波动作部分负荷运行,设备实际上经常偏离设计工况点。大多数论文里的仿真模型都直接写“电解槽效率取75%、电锅炉效率取0.95”,仿佛设备永远工作在额定点。问题是,当电解槽负载率从100%降到20%的时候,能量转换损耗占输入的比例会显著上升;频繁调节还会带来热管理上的额外不可逆损失。
传统能量效率模型把这些损耗统统看成常数,于是一个很奇怪的场景就会出现:从能量守恒看,系统始终满足供需平衡,没有任何能量被浪费;但仔细核算全年的购能费用和燃料消耗,系统却比设计值高了将近一倍。能量守恒没错,设备电耗参数也没错,错在那种“看一眼效率就能推全局”的思路。效率只是一个运行点的结果,熵产率才是直接衡量不可逆损失的物理量,它对运行点和设备状态是敏感的。
所以,面向可再生能源接入的电热氢系统,真正需要的不是再建一套“能流平衡+常数效率”的模型,而是能把设备部分负荷特性、热品味高低、储热/储氢的时间迁延都统一纳进来的分析框架。熵态模型的价值就在这:它把能量品位的贬值过程显式变成状态变量,而不是藏在常数效率后面看不见。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统解构与逐支路熵产定位:建模前必须做的物理功课
2.1 面向代码实现的电热氢系统拓扑约定
写代码之前先要把系统画成一棵能枚举的树,否则后面到处都是隐式耦合,算出来也不知道在算什么。我习惯按母线分三层的做法:
| 母线 | 供给侧 | 转换/储能侧 | 需求侧 |
|---|---|---|---|
| 电 | 风电、光伏、上级电网 | 电解槽、电锅炉、热泵、燃料电池 | 常规电负荷 |
| 热 | 电锅炉、热泵、燃料电池余热回收 | 储热罐 | 供热负荷 |
| 氢 | 电解槽 | 储氢罐 | 氢负荷、燃料电池 |
这套拓扑不算复杂,但已经覆盖了“电→氢”“电→热”“氢→电+热”三条最主要转换路径。可再生电优先给电负荷,富余的走电制氢或电制热;氢既能作为最终产品外供,也能在电力不足时通过燃料电池回馈电能。
代码结构上,我会把每条母线对应一个平衡函数,把每台设备对应一个独立的子函数。设备函数输入是它获得的功率指令与当前温度/储氢状态,输出是产出的能量流和本时段的熵产率。这样母线之间的耦合在数据层解决,不会写到最后变成一坨几千行的顺序判断。
2.2 各转换支路的熵产来源逐条拆解
核心问题是:熵产到底在哪些环节产生?我拆成四类。
第一类是电化学转换设备,也就是电解槽和燃料电池。电解槽输入高品位电能,把水分解为氢和氧,反应本身需要消耗能量,同时还伴随欧姆损耗、活化损耗和热管理损耗。从火用分析的角度看,输入电的火用减去氢带走化学火用、再减去可回收热量的火用,剩余部分全部是火用损失。燃料电池正好反过来,氢的化学能不能全部变成电,有一部分必然变成热,这同样对应熵产。
第二类是纯电热转换设备,典型是电锅炉和电热泵。这部分最容易引入工程简化的坑。我见过不少模型里直接写“电锅炉热效率0.95”,意思是5%的能量丢了,其余的都以热的形式进入热力系统。但如果分解到熵平衡,问题远不止这5%:电能原来是不携带熵的有序能,变成热以后,它的温度品位决定了这份热量还能做多少功。把1MW电直接变成300℃高温热和把它变成45℃热水,虽然热量数量可能随效率不同有所差异,但后者的火用损失极大。
第三类是换热网络。电解槽、燃料电池都带余热回收,可回收余热的质量取决于介质温度和换热温差。换热温差越大,熵产越大。设备层算完能量效率,系统层还得按传热温差补算一层熵产。很多仿真代码把余热回收直接视为“热量等于回收系数乘以多余能量”,这个做法会把大量不可逆损失抹掉。
第四类是储能设备。储氢罐和储热罐本身在静置过程中也有耗散。储热罐无论保温多好,总会有热损失,温度慢慢下降,这个过程的本质就是热量从高温向环境低温泄漏,熵产持续增加。储氢罐如果建模到压力层面,充放气过程的节流和压力损失同样是不可逆源。但工程上为控制计算规模,储罐的熵产经常可以只保留主要项——储热罐取散热损失,储氢罐取节流/压缩损耗。
2.3 时间维度的“熵延迟”特性
这部分极易被忽略。电能的平衡是瞬间完成的,母线电压波动在毫秒级就要被响应;热力系统因为管道和储热体的热惯性,可以达到小时级;氢储能由于储罐大、充放速率受电解槽和燃料电池约束,响应尺度能以天为单位。
在电热氢综合系统里,可再生电忽然多了,直接拿去制氢,氢不会立刻被消耗,可以存在罐里等下一个氢需求高峰;多余电转成热,热量在储热罐里慢慢放,能撑过晚高峰。所谓“多能互补”,本质就是把一种时间尺度上的波动转移到另一种时间尺度上消化。
熵态模型恰恰擅长描述这个现象:储能设备把熵产分散到了不同时间段,而不是像电气设备那样在功率波动的当下就立刻产生不可逆损失。所以,不同时间尺度之间的错配,会在熵产曲线上呈现出明显不同的形态。这一特点后面可以用于机理分析。
3. 熵态模型的数学形式与Matlab代码映射
3.1 熵平衡方程和可执行的状态更新式
热力学熵平衡的标准形式是:系统熵的变化等于流入流出的熵流加上系统内部不可逆过程产生的熵产。放在离散时间仿真里,可以写成:
S_stor(t+1) = S_stor(t) + (流入熵流 - 流出熵流 + 内部熵产)× Δt
不过如果直接对每个设备都算绝对熵,会遇到一个工程麻烦:储氢罐、储热罐里的工质状态不同,算绝对熵需要大量物性查询。更工程化的做法是绕一点,先把每个设备的“火用损”算出来,再用环境温度折算熵产:
σ_k = I_k / T0
其中 I_k 是设备k的火用损失,T0是环境参考温度,σ_k 的单位是kW/K。火用损的单位是kW,除一个温度,换算成熵产率。为什么要绕这一下?因为火用损刚好等于输入火用减去输出火用,而输入电功率、输出氢功率、输出热功率都是模型里已经在算的量,不需要额外引入物性数据库。这个近似在工程分析精度内足够可靠。
于是整个系统的总熵产率就是所有设备熵产率之和:
σ_total(t) = Σ σ_k(t)
一个调度策略在时间窗口T内的“熵态劣化程度”,可以看成累计熵产量:
S_total = Σ σ_total(t) × Δt
到这里应该能看出一个重要的建模思路:熵产不是虚拟量,它通过火用损与设备功率直接挂钩,可以被求出来,也可以放到目标函数里求最优。
3.2 设备熵产函数的代码实现思路
我在Matlab里喜欢把设备模型和熵产计算封装到同一个函数。比如电解槽模型,输入是分配给它的电功率P_el,输出是氢的化学功率P_H2、可回收热功率Q_rec和对应温度的熵产。
说明一下工程近似项:氢的化学火用与化学功率的比值可以做修正,但工程仿真常直接按“氢的低热值功率”处理。这么做会带来10%-20%的偏差,具体在第5节专门说。
matlab复制function sigma = electrolyzer_entropy(P_el, P_H2_chem, Q_rec, T_rec, T0)
% electrolyzer entropy production rate
% P_el : input electric power, kW
% P_H2_chem : chemical power carried by H2, kW (LHV basis)
% Q_rec : recoverable waste heat, kW
% T_rec : equivalent temperature of recovered heat, K
% T0 : ambient reference temperature, K
% 输入电火用近似等于电功率,因为电能几乎全火用
Ex_in = P_el;
% 氢携带的化学火用,工程简化按化学功率算
Ex_h2 = P_H2_chem;
% 可回收热量的火用:卡诺系数修正
Ex_heat = Q_rec * max(1 - T0 / T_rec, 0);
% 火用损失
I_loss = max(Ex_in - Ex_h2 - Ex_heat, 0);
% 火用损折算为熵产
sigma = I_loss / T0;
end
换热器的熵产不用重新调用火用函数,直接用换热温差公式:
matlab复制function sigma = heat_exchanger_entropy(Q, T_hot, T_cold)
% Q : heat transfer rate, kW
% T_hot : hot side temperature, K
% T_cold : cold side temperature, K
sigma = Q * (1/T_cold - 1/T_hot);
end
这个函数看起来简单,却是很多人漏掉的一道重要环节:两个温度相差越大,同样的热量转移产生熵产越大。现实中用300℃过热蒸汽去加热一个只需要45℃的热水回路,换热器熵产非常巨大;如果改用60℃的低温烟气或燃料电池余热去承担同一热负荷,熵产就小得多。这部分在机理分析里经常会改变结论。
3.3 主循环推进的整体框架
对整个系统做长周期仿真时,主循环通常按小时步长推进,外层再套不同季节或不同来风场景。伪代码结构如下:
matlab复制dt = 3600; % 时间步长:1小时
T0 = 293.15; % 环境参考温度,K
N = length(P_wind); % 时间序列长度
S_prod = zeros(N, 1); % 记录总熵产率
S_acc = 0;
for t = 1:N
% 1. 根据当前风电、光伏、电负荷计算母线净负荷
net_e = P_wind(t) + P_pv(t) + P_buy(t) - P_load(t);
% 2. 按调度策略分配剩余电力到电解槽、电锅炉和电池/储热
% 这部分可以是固定规则,也可以嵌套优化求解器
[P_elz, P_eb, P_hp] = dispatch_policy(net_e, state(t), params);
% 3. 更新储氢、储热等状态
state(t+1) = update_storage(state(t), P_elz, P_eb, ...);
% 4. 逐设备计算熵产率并累加
s1 = electrolyzer_entropy(P_elz, ...);
s2 = electric_boiler_entropy(P_eb, T_heat_required, T0);
s3 = heat_exchanger_entropy(Q_hx, T_hot, T_cold);
s4 = storage_entropy(state(t), state(t+1), T0);
S_prod(t) = s1 + s2 + s3 + s4;
% 5. 累计整合熵产
S_acc = S_acc + S_prod(t) * dt;
end
这个框架虽然看起来是“先计算功率平衡,再事后计算熵产”,但它已经能回答大量“系统在哪里损失品位”的问题。如果要做最优调度,只需把S_acc作为目标函数或约束条件放入优化器,决策变量就是每个时刻的功率分配系数。因为有熵产项在目标函数里,优化器会尽量避免“高品位电烧低品位热”的方案。
对动态过程更敏感的场合,可以把单时间步的整体循环换成Simulink模型,设备熵产函数用Matlab Function模块嵌入。不过对于做全年8760小时机理扫描和参数灵敏度分析,脚本式主循环更顺手,因为跑批量和灵敏度只需要再套一层for循环。
3.4 初值处理和单位陷阱
一个很容易忽略的细节是参考温度T0选取。熵产率是通过“火用损/T0”折算的,T0应该在所有设备中统一。冬天取273.15K还是293.15K,对结论会不会有影响?如果只是相对比较不同调度策略,影响不大;但如果要核算全年绝对熵产并与外部报告对比,就必须固定T0为全年平均环境温度或者逐时环境温度。
单位则是另一个大坑。电功率单位常用MW,热量单位可能突然出现kW或GJ/h,氢气用kg/h或Nm³/h。设备函数内部一旦口径不是同一套,算出来的火用损可能是实际值的1000倍。我的习惯是主循环统一用kW和K,氢气能量流换算成kW(化学功率),最后做全年统计时再输出GWh等单位。
4. 机理分析能回答什么:三个值得关注的结果
4.1 波动传导存在显著的时间尺度错配
用熵态模型跑典型风光场景(一组以100MW风电、60MW光伏为输入,电解槽容量40MW,电锅炉20MW,储氢罐可容纳8小时满负荷产氢的算例)后,我发现一个很直观的规律:不同能量母线对波动的“消化方式”差异很大。
电力母线对可再生波动完全没有缓冲能力,波动会直接反映在电解槽或电锅炉的功率指令上;热力母线有储热罐,能把15分钟级别的功率波动分散成小时级甚至更长的放热过程;氢储能因为储罐容量相对富余,可以吸收跨日的波动。熵产率在时间轴上的分布因此非常不均匀——如果不做储热和储氢缓冲,所有波动压力都会转化为电解槽和电锅炉的即时部分负荷熵产,曲线尖峰很陡;启用储能缓冲后,熵产峰明显被削平,但储能设备自身静置耗散熵产会增加。
这个结果说明一个道理:接入可再生能源后,综合能源系统调度不能只盯“每小时瞬时功率平衡”,而要考虑波动在电、热、氢三个时间尺度之间的分配。凡是把高频波动强行交给电解槽跟随的系统,单位制氢熵产都会比较高;把高频分量先交给热储能消化、让电解槽运行在相对平稳的基载区间,系统总熵产反而小。
4.2 “电→氢→电”到底该不该做,有个临界判据
电转氢再通过燃料电池转电,是很多综合能源方案里的“保底手段”。从能量效率看,这条路效率低得吓人:电解槽效率约75%,燃料电池效率约50%,两级相乘只有37%左右。很多人据此说电转氢再发电是“脱裤子放屁”。
但熵产分析能把问题看得更细。电转氢路线虽然单次转换损耗高,但氢储能的自放电损失几乎可以忽略——储氢罐放一星期仍然能保住绝大部分化学能。作为对比,如果采用电池储能来平移电力,虽然单次电进电出效率可达90%,但电池的自放电和容量衰减随时间累积。到底选哪条储能路线,取决于需要“平移电能”的时间尺度。
我按电价差和熵产算过一个简单判据:如果只是为了削峰填谷几小时,电池或抽蓄的往返熵产远小于电氢再发电;但如果要平抑的是跨周甚至跨季节的可再生出力波动,氢气凭借超低自放电率的优势变得不可替代。电转氢再转电不是不行,而是要找到合适的时间尺度窗口;熵产模型恰恰能提供“多久以上的存储周期该走氢路线”的定量边界。
4.3 设备参数灵敏度排序可以定位系统瓶颈
机理分析的另一层价值在于定位瓶颈。用变量摄动法做参数灵敏度:逐次把某个设备参数变更10%,观察系统累计熵产或综合供能成本的变化幅度,把所有设备放在一起排序。
在配置合理但尚可优化的系统里,我观察到影响系统熵产的排序往往是:电解槽最低运行负载率 > 储氢容量 > 储热罐保温水平 > 电锅炉供水温度参数 > 热泵/电锅炉额定效率。电解槽的最低运行负载率排在最前,因为它直接决定了可再生电力波动时电解槽能否继续运行;如果最低负载率设置得很高,系统就不得不在低负载时段频繁启停电制氢设备,每次启停都伴随大量热管理和不可逆损失。这一条对工程设计很有参考价值:与其追求电解槽额定点效率高1个百分点,不如把功夫花在扩大电解槽的低负载稳定运行范围上。
另一个经常被误判的参数是热泵或电锅炉的额定效率。在熵产函数里,真正起作用的是设备产出的热端温度和换热网络的温差,而不只是“电转热的比例”。同样的电锅炉,供应85℃供暖水和供应60℃地暖水,系统熵产率可能有显著差异。单看COP或效率无法捕捉这个差别,灵敏度分析却很容易暴露出来,这也是“电”和“热”两种能量必须在同一框架下考虑的理由。
5. 仿真和调度实现时最容易踩的四个坑
5.1 把设备效率当成常数
前面反复提到过这个坑,因为它在代码里实在太普遍。电解槽的电耗随负载率变化呈现明显的非线性特征:低负载时单方氢电耗上升,同时系统的辅助设备仍然维持固定能耗;燃料电池部分负载时效率曲线同样非线性。在实际建模中,不建议直接给效率常数,至少用分段线性函数拟合厂商提供的负载率-效率曲线;如果拿不到完整曲线,应该给出80%额定效率、50%额定效率两个关键点,代码里线性插值。这个操作对熵产计算结果影响极大——部分负荷工况在可再生场景里占据主导地位,不用分段模型等于研究可再生能源场景却完全不看设备在非额定工况下的表现。
5.2 氢能量基准不统一:LHV/HHV的乱用
氢的能量折算有两种基准:低热值LHV和高热值HHV。电解水的反应焓变与氢气燃烧焓之间差的17%是水的汽化潜热。如果设备效率曲线是基于LHV标定的,熵产函数里的火用损也应该统一基于LHV;反之亦然。更麻烦的是,有些论文里的电解槽效率其实来自HHV,另一些来自LHV,直接混用会导致制氢能耗误差扩大。
解决方法是程序开头定义一个全局基准变量并统一到底。我习惯全系统统一采用LHV基准,因为燃料电池发电模型中多数厂商数据基于LHV。至于严格热力学火用分析,氢的化学火用还会随反应物/产物的状态变化,不过工程仿真相对于单纯能量效率已经够用了。
5.3 热负荷没有温度和品位信息
我接手过的几乎所有综合能源代码,都只把热负荷写成“需要多少kW热量”的标量。问题是,同样是100kW热负荷,45℃供暖系统和250℃工业蒸汽负荷是完全不同的东西。前者用低温余热就能满足,后者必须先经过热泵或锅炉升级品位。如果没有品位信息,熵产模型根本无从算起。
建议至少给每类热负荷配一个等效温度,哪怕调度代码里不显式使用,也要在熵产换算式里用到。如果嫌麻烦,可以在热负荷侧定义一个“目标等效温度”,把低于这个温度的热量看成不可用,高于这个温度的多余热量则需要通过掺混/换热平衡。这一步让模型从“功率充足率”升级为“温度对口供应率”,机理分析结论会随之完全不同。
5.4 熵产目标与运行约束的冲突处理
把熵产最小作为目标函数后,优化器会本能地让可再生电少转热、少制氢,因为所有转换都产生不可逆损失。如果不在约束中保证最低制氢量、最低储氢水平或最大弃电率限制,解出来的运行策略可能变成“为了最小化熵产,宁可大量弃风弃光也不做任何转换”。这在物理上不错,但不符合项目现实需求。
现实项目中熵产目标更适合放在两个位置:一是作为比较指标,在满足弃电率、供能可靠性等硬约束前提下,选出熵产更小的调度策略;二是作为多目标目标函数中的一个目标项,与运行成本或弃电率加权组合。如果一定要单目标最小化,需要增加“可再生能源利用率下限”或“氢产量下限”这样的约束,否则分析结果指导价值有限。这个坑我踩过一次,后来每次跑熵产优化之前都会先检查约束集是否完整。
6. 一些后续可以继续探索的扩展
模型搭好以后,还有几件事可以继续往下做。
第一,把熵态模型与全年气象数据打通,做不同季节、不同可再生能源渗透率工况下的熵产分布扫描。这样能找出系统在“春季大风季”和“夏季高光伏季”的薄弱环节差异——前者的瓶颈通常是制氢设备低载运行,后者的瓶颈可能变成热负荷低谷时段的电解槽频繁启停。这类结论对整个系统的全年运行策略很有指导意义。
第二,将“储热静置损失”“储氢罐温度维持能耗”这类时间相关耗散项加进熵产模型。很多可再生能源电解水制氢系统在严寒地区需要给罐体和管路保温,这部分电耗长时间存在,在熵产模型中相当于一个与负荷无关的固定熵产基线。增加这些项之后,模型会自动识别“储氢规模过大反而因为保温耗能拉低整体能效”这类长期边际效应。
第三,把熵态模型与状态空间辨识结合。如果对完整的物理模型求解时间不满意,可以考虑先用大量场景下的仿真数据训练一个降阶回归模型,然后用降阶模型代替原始物理模型做在线调度或参数寻优。Matlab的系统辨识工具箱在这条路上能省不少事,我的经验是先保留物理模型的输入输出口径,再做数据驱动降阶,这样降阶模型的可解释性还在。
回到最初的问题,为什么要在电热氢综合能源系统里做熵态模型?因为我逐步意识到,这类系统的核心挑战从来不是“能不能满足负荷”,而是“用多大代价满足了负荷”。传统能流分析始终绕不开效率常数的粗糙假设,实际调试一次、对比几次反常结果就会明白:模型缺少的是一个能表达能量品位随时间演化的状态量。熵产最小化不是要把系统内部的真实工质状态全部仿真出来,而是承认“万事皆会消耗有序度”,然后把这种消耗放进量化模型里。只要把设备和储能的熵产率定义清楚,Matlab代码层面的工程量并不大,得到的结果却比单纯能流分析要深刻得多。
如果在实际仿真中也遇到类似“能量平衡看起来全对、结果却不对”的困惑,可以试着从设备负载率曲线和热量品位这两个点入手查一遍模型,很可能问题就藏在那里。
