
做这个题目之前我先说点实在的所谓“面向可再生能源接入的电热氢综合能源系统熵态模型与机理分析”听起来很学术但落到工程上目标非常朴素——就是回答三个问题可再生能源发出来的电怎么用才不浪费电、热、氢三个网络耦合在一起整体效率到底怎么样系统里到底是哪个环节在“偷偷”损耗能量我在实际做这套模型和Matlab仿真的时候用的是热力学第二定律的思路即用熵产不可逆损失来给整个系统做“病理诊断”。这个思路我实测下来非常有效尤其当你面对的不再是单一设备而是一堆设备耦合在一起的综合能源系统时能量品质的退化比能量数量的损失更值得关注也更能暴露问题。这篇文章会把整套模型从思路到方程再到代码实现完整拆开讲包括我踩过的坑、调试经验和怎么解读仿真结果。适合正在做综合能源、氢储能、可再生能源消纳方向的研究生、工程师以及想用Matlab把热力学分析落到具体系统上的朋友。1. 先把这个系统讲明白电、热、氢为什么能组队1.1 可再生能源接入带来的“三难问题”搞过新能源消纳的人都知道风电光伏一多起来电网侧就出现三个绕不开的麻烦。第一是波动性。光伏出力跟着太阳走中午尖峰、晚上归零风电更是“看天吃饭”一阵风过来可能几分钟内出力波动20%以上。这个特性导致电源侧的可调度性极差。第二是时间错配。光伏大发的时候往往是午间而用电高峰在晚间风电大发常在夜间负荷低谷。这种时间上的错配靠传统“发多少用多少”的调度模式根本处理不了。第三是弃电问题。当新能源渗透率超过一定阈值电网调峰能力不足只能强制弃风弃光。我见过不少风电场冬季夜间弃风率能到20%以上那不仅是经济损失更意味着前期投资沉淀大量浪费。要解决这三个问题核心是引入储能。但到底用哪种储能这里就有讲究了。电化学储能响应快、效率高往返80%~90%但成本高、容量有限适合做小时级调节。热储能成本低、容量大、效率也还不错但热能没法远距离传输只能就地使用。氢储能呢能量密度高可以做到周级、月级甚至跨季节存储但“电→氢→电”的往返效率通常只有30%~40%非常难看。所以单独押注任何一种储能都不划算。真正工程上合理的做法就是把三种储能配合起来让电化学储能应对秒级到分钟级的快速波动热储能吸收小时级的热负荷波动氢储能承担几天甚至跨季节的余电消纳。这就是电热氢综合能源系统的核心价值——它们不是简单的能量叠加而是时间尺度和能量品位的互补。1.2 电热氢耦合的系统级优势建立电热氢综合能源系统最直接的好处是可以把原本要弃掉的可再生能源电量“分段利用”。以电解水制氢为例电解槽在工作时不是只产氢它同时还会产生大量热。如果在系统设计阶段就把这部分热利用起来供给热网或储热罐那么电解槽的实际能量利用率就能明显提升。我做过一个简单测算碱性电解槽在额定工况下如果余热全部回收系统综合效率比纯制氢场景能高出8~12个百分点。再看燃料电池。燃料电池发电时也有接近40%~50%的能量以热量形式排放。在综合能源系统里这部分热可以用来供暖或预热生活热水。这样一来燃料电池虽然“电效率”不高但“热电联供综合效率”可以做到80%以上。这种思路在分布式能源领域已经非常成熟但放到“可再生能源→氢→热电联供”这个大链条里能发挥的空间更大。还有一个容易被忽略的点储氢罐本身是一个很好的“能量时移”装置。可再生能源大发时电解槽满负荷制氢把氢气压缩存储在高压罐里等到风光出力不足或者电价高企的时候再把氢气拿出来给燃料电池发电。整个过程相当于把电力的“生产”与“消费”在时间维度上解耦了而且解耦的尺度比电池大得多。再加上储热罐的辅助整个系统的调度灵活性会显著提升。当然系统耦合度越高建模和分析难度也越大。这时候就需要一个能从“能量品质”层面统一评估系统状态的工具——这就是我用熵态模型的根本原因。2. 熵态模型为什么非要用熵来说事2.1 熵平衡方程如何落到工程设备上先说一个我在做这个项目时体会很深的事情传统的能量平衡模型说白了就是统计“进来了多少能量、出去多少能量、存了多少能量”然后算个效率。这种一阶分析对单一设备还行但对多能耦合系统远远不够。它只能告诉你“能量去哪里了”却说不清“为什么同样的能量数量有的系统好用有的系统不好用”。熵就不一样。熵是热力学第二定律的核心概念它度量的是系统内部微观状态的混乱程度。更关键的是能量转换过程中的所有不可逆因素——摩擦、温差传热、压降、化学反应极化、焦耳热——都会产生熵。也就是说熵产率的大小直接反映了系统能量品质退化的速率。熵产越多意味着同样数量的能量可以做的“有用功”越少系统的实际可用能损失越大。对综合能源系统做熵分析第一步是为每个设备建立熵平衡方程。通用的连续系统熵平衡式是这样的dS/dt Σ(Q_k/T_k) Σ(m_in·s_in) - Σ(m_out·s_out) S_gen这里dS/dt是控制体积内熵的累积率Σ(Q_k/T_k)是穿过边界的热流与边界温度之比代表热流携带的熵流Σ(m_in·s_in)和Σ(m_out·s_out)是流入、流出工质携带的熵流S_gen就是熵产率永远是大于等于零的。在Matlab代码里我不会真的把每个设备的熵平衡写成手推公式而是用一个统一的函数接口输入各设备的热流、温度、进出口工质状态输出当步的熵产率。这样做的好处是后期想增加新设备比如加一台余热锅炉只需要实现同一个接口就行不用动主程序。工程上还要特别注意温度的单位。熵平衡里所有温度都用热力学温度开尔文。我见过不止一次有人拿摄氏度直接代入算出来的熵产率全是错的而且错得很离谱。这个坑我在第6章还会再提。2.2 熵产率与㶲损识别系统“最痛”的位置熵产率虽然物理意义清晰但在工程报告里直接给别人看“某某设备熵产率是2.35 W/K”对方往往没概念。所以我习惯同时给出一个更直观的指标㶲损。㶲exergy是能量中“可以做功”的那部分而㶲损就是不可逆过程导致的可用能损失。在有环境温度T0的情况下㶲损和熵产率的关系很简单Ex_loss T0 × S_gen这个公式特别好用因为它的单位是瓦特或千瓦可以直接和电功率、热功率做对比。比如你算出某台换热器的㶲损是15 kW而它实际传递的热量是500 kW那就能直接说“这台换热器因为温差传热把15 kW的可用能白白浪费掉了”。我经常把整个系统的熵产率按设备累加做成一个占比表。这个表就是系统“病理报告”的核心哪台设备熵产占比最大哪里就是最值得优化的对象。在可再生能源接入场景下电解槽和燃料电池通常是熵产大户其次是储热罐的温差传热最后才是管道和阀门的压损。有了这个排序你在做方案设计时就有了明确的优先级而不是凭感觉东一榔头西一棒子。2.3 熵态变量的定义与状态转移“熵态模型”这个说法有些文献叫“熵产分析”有些叫“熵态评估”我在这个项目中把它落地为一组具体的状态变量。系统的状态不再只是“储氢罐压力多少、储热罐温度多少、光伏出力多少”而是在这些基础上增加一组熵相关变量各设备的熵产率S_gen,i瞬时值系统熵产累积量S_gen,total从仿真开始到当前时刻的累加系统㶲效率ψ输出㶲/输入㶲这组变量共同构成了系统的“熵态”。在24小时动态仿真中每一时刻都能计算出系统当前的熵态把所有时间点连起来就得到了整个调度周期内系统能量品质的动态演化轨迹。为什么要这么做因为可再生能源接入场景下系统运行状态是高度时序化的——光伏午间大发、晚间负荷高峰、凌晨低谷每个时段系统的最优运行点不一样熵产最大的设备也不一样。只有把熵态作为随时间变化的状态量来观察才能发现系统在哪些时段“特别浪费”进而针对性地调整运行策略。比如我在一次仿真中发现傍晚时段电解槽因为光伏出力下降而频繁降载运行导致电解槽在低电流密度下的熵产率反而升高。这是因为低负荷时活化过电压占比升高单位产氢量的不可逆损失变大。这个发现靠单纯的稳态效率分析是看不出来的必须动态跟踪熵态曲线才能抓到。3. 机理建模把每个设备写成可求解的方程3.1 电解槽与燃料电池的电压-热-氢耦合模型在这个系统里电解槽和燃料电池是最核心的两个电化学设备建模的时候需要把电、热、氢三者的耦合关系写清楚。电解槽我用的是碱性电解槽模型因为工程上碱性电解槽最成熟、成本最低。单电池电压是三个部分之和U_cell U_rev U_act U_ohmU_rev是可逆分解电压由能斯特方程和经验温度修正决定。在标况附近可以近似写成U_rev 1.23 - 0.0009 × (T - 298.15)U_act是活化过电压用Butler-Volmer方程的反正弦近似U_act (R·T) / (α·2·F) × asinh(I / (2·I0))U_ohm是欧姆过电压和电流密度、膜电阻率有关。温度越高离子电导率越高欧姆过电压越小所以电解槽温度管理很重要。产氢速率直接由法拉第定律给出n_H2 η_F × I × N_cell / (2·F)这里的η_F是法拉第效率N_cell是串联电池片数F是法拉第常数96485 C/mol。产热部分的计算是很多人会搞混的地方。碱性电解槽有一个热中性电压U_th大约1.48V。当U_cell大于U_th时电解槽整体是放热的当U_cell小于U_th时电解槽反而需要从外界吸热来维持温度。用公式表达就是Q_gen (U_cell - U_th) × I × N_cell (1 - η_F) × U_th × I × N_cell第一项是过电压产生的焦耳热第二项是法拉第效率损失带来的副反应热。后者往往被忽略导致仿真中电解槽温度场偏保守。燃料电池我采用的是质子交换膜燃料电池PEMFC模型电压方程比电解槽多一个浓差过电压项U_fc E_nernst - U_act - U_ohm - U_conc燃料电池的产热可以用类似热中性电压的方法计算只是这时热中性电压与理论电压的差要按氢的低热值/高热值来分别讨论。我习惯用HHV基准即Q_fc (1.48 - U_fc) × I_fc × N_cell_fc这样算出来的热量和试验台实测值比较吻合。3.2 储氢罐、储热罐与能量管理策略储氢罐的模型相对简单。忽略氢气的非理想性在40MPa以下用理想气体近似误差可接受罐内压力动态可以写为dP/dt (n_in - n_out) × R × T_tank / V_tankn_in是电解槽产氢进入罐的流量n_out是燃料电池或对外供氢的流量。工程上罐内温度会因为压缩和膨胀发生变化但为简化我在初版模型里假设罐内恒温后续再考虑温度修正。储热罐我用的是单节点集中参数模型核心是能量守恒dT_tank/dt (Q_charge - Q_discharge - Q_loss) / (m_store × cp_water)Q_loss是储热罐对外散热和罐体保温性能、环境温度、储热温度差成正比。在很多论文里Q_loss被直接忽略但做实际项目时尤其是模拟24小时动态过程夜间长时间储热的散热损失可能占储热量的10%以上不容小觑。能量管理策略在综合能源系统里是决定系统运行状态的关键。我在这套模型里实现的是一个规则优先级策略可再生能源优先满足电负荷若有余电优先给电解槽制氢若电解槽已达额定功率仍有富余则启动电锅炉或热泵产热并存入储热罐若可再生能源不足先由储热罐放热满足热负荷电负荷缺口由燃料电池发电补上若仍不足则从电网购电。这套策略不算最优但胜在逻辑清晰、便于调试。后期如果要换成模型预测控制MPC或强化学习只需要把策略模块替换掉底层设备模型不用动。3.3 可再生能源发电模型与典型场景生成光伏和风电的出力模型相对直观。光伏输出功率可以写成P_pv η_pv × G × A × [1 - β × (T_cell - T_ref)]风速和风机出力的关系一般用分段函数描述从切入风速到额定风速之间按三次方关系增长。这些在Matlab里实现起来不难真正的难点在于输入数据的场景选择。可再生能源出力和负荷曲线都是强时变数据如果拿一整年的逐小时数据跑仿真计算量太大而且结果不便于分析。我的做法是用K-means聚类算法从全年数据中提取典型日。把每天的光伏出力曲线、风电出力曲线、电负荷曲线、热负荷曲线拼成一个特征向量聚成春夏秋冬四类每类取质心作为典型场景。这样仿真时长就从8760小时压缩到4×24小时并且仍然能覆盖不同季节的运行特征。在实际代码里K-means聚类用Matlab自带的kmeans函数就能完成。不需要多么高深的算法关键是你喂进去的特征向量要能写清楚“这一天新能源和负荷的整体形态”。4. Matlab实现从方程到可以跑的仿真4.1 代码架构与文件组织我写这类仿真程序有一个固定的习惯主脚本只做三件事——定义参数、调求解器、画图。所有设备模型单独写成函数文件不把一堆公式堆在主脚本里。这套工程习惯在多个项目里反复验证过确实能减少调试的痛感。文件组织大致如下project_root/ ├── main_IES_entropy.m % 主程序 ├── params_IES.m % 返回参数结构体 ├── models/ │ ├── electrolyzer_model.m % 电解槽模型 │ ├── fuelcell_model.m % 燃料电池模型 │ ├── h2tank_model.m % 储氢罐模型 │ ├── heatstore_model.m % 储热罐模型 │ ├── boiler_model.m % 电锅炉/热泵模型 │ ├── pv_model.m % 光伏模型 │ └── wind_model.m % 风电模型 ├── entropy/ │ └── entropy_balance.m % 通用熵平衡函数 └── scenario/ └── scenario_gen.m % 典型日场景生成参数用结构体统一管理是个好习惯。我在params_IES.m中返回一个大的结构体params里面按设备再分子结构体比如params.el、params.fc、params.tank。这样在调用设备模型时传参非常清晰不用几十个参数一个个列。4.2 核心求解方法与状态初值设置这个系统的动态模型是一组常微分方程ODE状态变量包括储氢罐压力、储热罐温度、电解槽温度、燃料电池温度等。Matlab里求解ODE我强烈建议直接上ode15s而不是看起来更“通用”的ode45。原因很简单这套系统的时间常数跨度太大了。电解槽热惯性对应的时间常数可能是几十分钟到几小时而储氢罐压力在阀门快速动作时变化可能只需要几秒钟。这种刚性stiff问题用ode45跑步长会被最短时间常数限制计算量极其巨大甚至直接发散。ode15s是变阶多步法专门对付这类刚性系统实测下来计算稳定性好很多。求解调用方式大概是这样的% 在main_IES_entropy.m中 x0 [P_tank0; T_heat0; T_el0; T_fc0]; [t, X] ode15s((t,x) system_dynamics(t, x, params, scenario), ... [0 24*3600], x0, ... odeset(RelTol, 1e-5, AbsTol, 1e-6, MaxStep, 100));system_dynamics是一个包装函数内部调用各设备模型计算微分项并累加熵产率变量。这里要注意如果你的熵产率是累积量记得把它也作为状态变量放进x向量里而不是用全局变量。用全局变量在ode15s的多次求值过程中会出现不可预期的错误累积——这也是我早期调试时被坑得最惨的地方之一。初值怎么设我的一般做法是先跑一遍静态潮流计算或者用fsolve解稳态方程组把系统在起始时刻的稳定状态求出来作为ODE的初始值x0。直接用拍脑袋的初值会导致积分刚开始时系统剧烈波动甚至因为物理量越界而报错。4.3 一个手算算例验证模型数值合理性写代码之前我强烈建议先用笔算一遍经典工况验证模型参数有没有量级上的错误。这里用碱性电解槽的额定工况举个例子参数接近实际设备。设电解槽运行温度T333.15K60°C电流密度2000 A/m²单片有效面积0.1m²N_cell100片。先算电流I2000×0.1200A。可逆电压只做温度修正U_rev 1.23 - 0.0009×(333.15 - 298.15) 1.1985V活化过电压估算。取电荷转移系数α0.5交换电流密度I00.1A/m²碱性电解槽量级代入U_act (8.314×333.15) / (0.5×2×96485) × asinh(2000/(2×0.1)) ≈ 0.0287 × 9.9 ≈ 0.284V欧姆过电压按经验取0.1V。于是单电池电压U_cell 1.1985 0.284 0.1 1.5825V电堆电压就是158.25V电功率P_el 200 × 158.25 ≈ 31.65 kW氢产量取法拉第效率85%n_H2 0.85×200×100/(2×96485) ≈ 0.0881 mol/s 折算成标况体积流量0.0881×22.4×3600 ≈ 7.10 Nm³/h这样单位制氢电耗就是31.65/7.1≈4.46 kWh/Nm³和工业碱性电解槽实际值4.3~5.0 kWh/Nm³基本吻合说明模型参数是合理的。再算一下熵产率。以环境温度298.15K为基准氢的吉布斯自由能ΔG约237.1kJ/mol那么氢产物的㶲流为0.0881×237.1 ≈ 20.89 kW输入电功31.65kW两者之差就是电解过程的不可逆损失Ex_loss ≈ 31.65 - 20.89 10.76 kW对应的熵产率S_gen ≈ 10.76×1000/298.15 ≈ 36.1 W/K这个数字意味着这台电解槽每小时产生的熵约为130kJ/K。如果不用电解手段而是把这部分电能直接给到电热泵产热熵产会明显低很多。但电解槽的价值在于产出了高品质的氢能所以不能简单看熵产值的绝对大小还得看系统层面的目标函数怎么设定——这是熵分析中一个需要权衡的地方。我在代码里跑完这个工况后会拿仿真输出与手算值对比误差控制在2%以内才认为模型正确。这是一个非常有效的校验手段。5. 仿真结果怎么读熵产曲线与机理发现5.1 24小时动态仿真结果解读做过动态仿真的人都知道跑出曲线只是第一步真正有价值的是从曲线里读出系统的运行规律。我以某个典型夏季日为例。这一天光伏大发风电较弱。从熵产率的时间曲线上可以明显看到三个高峰第一个高峰出现在上午9点到11点因为光伏出力快速爬升电解槽从低负荷切换到高负荷此时电解槽电流密度上升活化过电压和欧姆过电压都在增大电解槽熵产率同步升高。这个阶段的熵产增加是“主动的”因为系统正把多余电能转为氢储能是可再生消纳的代价。第二个高峰出现在中午12点到14点光伏达到峰值系统余电充足。如果储氢罐压力已经接近上限电解槽可能被迫降载同时电锅炉启动产热。这时热负荷若不高多余热量只能存入储热罐而储热罐与热网回水温差较大导致储热过程温差传热熵产显著增加。这是一个“被动的”熵产高峰可以理解为系统储能容量不足导致的品质损失。第三个高峰出现在晚上19点到22点光伏归零、电负荷上升燃料电池启动补电。燃料电池的极化损失和产热导致熵产率再次冲高。尤其当燃料电池工作在低功率区间时单位发电量的熵产更高所以如果调度策略允许尽量避免燃料电池长时间处于20%以下负荷。这三个高峰对应的是三种完全不同的系统运行状态和损耗机理。做熵态分析最核心的价值就在于此同样的熵产数值背后的成因可以完全不同优化手段也各有侧重。5.2 设备熵产占比与改进方向把整个仿真周期内各设备的熵产按时间积分可以得到熵产累积量占比。我跑完典型日后通常做一张汇总表下面是一个示例数值为接近我实际项目结果的示意值设备熵产占比主要成因改进方向电解槽42%活化过电压、欧姆热、法拉第效率损失提高运行温度、优化催化剂、降低电流密度燃料电池31%极化损失、产热优化负荷区间、提高进气压力储热系统14%温差传热、散热损失分层储热、优化储放热策略储氢压缩8%压缩过程不可逆采用多级压缩、中间冷却管道/阀门5%压降、节流优化管径、减少节流阀这个占比排序在大多数配置下是稳定的电化学设备的熵产是大头热存储中等管道损失最小。所以做优化时优先投入在电解槽和燃料电池上性价比最高。一个有意思的现象是储热系统的熵产占比虽然只有14%但它的熵产几乎全部集中在“大温差充放热”的时候。只要把储热罐的充热温度从85°C降到70°C储热系统的熵产就能下降30%以上。当然温度降低会影响供热质量这就要结合热负荷需求做权衡了。5.3 策略对比熵产累积量如何区分运行策略优劣我在项目里做过一组对比实验同样一个系统、同样一组新能源出力数据分别用两套运行策略跑24小时仿真。策略A是“电气优先”余电优先给电解槽电解槽满负荷后再考虑电锅炉。 策略B是“多能协调”根据当前储氢罐压力、储热罐温度、未来几小时的新能源预测动态分配余电给电解槽和电锅炉。从能量平衡角度看两套策略的总弃电量差距不大如果只看系统总效率甚至策略A还略高一些。但对比系统熵产累积量后发现策略B的全天熵产比策略A低了约11%。差异主要来自两个细节策略B会在光伏大发前预先降低电解槽负荷避免午间电解槽因储氢罐满压而频繁启停减少了瞬态过程的额外损耗同时策略B会在热负荷低谷时适当降低储热罐充热功率降低温差传热熵产。换句话说策略B牺牲了一点点电量消纳但换来了更低的总㶲损。这个案例让我确信熵态模型在运行策略评估上比单纯的能量效率分析更有辨识度。如果你做综合能源调度优化建议把系统熵产累积量或㶲损总量作为目标函数之一它能捕捉到很多传统目标函数看不到的“隐性损耗”。6. 常见报错与调试心得6.1 方程刚性导致仿真直接崩掉这是我在这个项目里遇到的第一个大坑。刚开始图省事直接用ode45求解结果跑到仿真中段就报错错误信息通常是“计算过程中步长低于最小值”。原因前面提过就是系统里电化学设备的快速动态和储热罐、储氢罐的慢速动态时间常数差了好几个数量级。ode45是显式算法为了保证稳定性步长必须跟随最快动态而总仿真时长又取决于最慢动态算一步步长可能小到毫秒级跑24小时根本算不完。解决办法很简单把ode45换成ode15s或ode23t。ode15s是隐式算法对刚性系统天然有优势而且Matlab的ode15s实现比较成熟自动变阶变步长的效果很好。换完之后同样的仿真时间从算不完变成几十秒出结果。还有一个额外的建议用odeset里的MaxStep限制最大步长。如果不设ode15s在系统状态相对平稳时可能跳出很大的步长导致事件检测精度下降。我一般设MaxStep60秒既能保证精度又不至于太慢。6.2 初值不一致导致功率平衡发散系统的能量管理策略里有大量的“if-else”判断逻辑比如“如果储氢罐压力达到上限就停止电解槽”。这种逻辑在ODE求解过程中会产生一个麻烦ode15s会尝试不同步长在某个时间步里试图把状态推到一个极端值比如压力超过上限导致策略切换条件被触发然后系统从一个不满足物理约束的状态继续积分最终功率平衡发散。这个问题我排查了很久才发现根源是初值设置得离平衡点太远。比如储热罐温度初值设得和热负荷需求的稳态值差了很远导致系统在最初几个小时内剧烈波动甚至触发了策略中的保护逻辑。我的解决办法是分两步走先用一个简化稳态模型算一遍得到各状态变量在起始时段的合理值作为ODE的初值再把能量管理策略里的硬切换改为带滞环的逻辑避免状态在阈值边界来回跳动。滞环宽度不需要太大比如储氢罐压力上限40MPa切换到35MPa时才重新启动电解槽这样系统就不会因为微小的压力波动频繁启停。6.3 熵产率计算出现负值如果你在仿真里发现某台设备的熵产率是负的先别怀疑热力学第二定律出了问题99%的情况是你的代码某个地方符号搞反了。我遇到的最典型情况是换热器/储热罐模型里的热流方向。在Matlab里我习惯把“流入设备的能量为正”但设备模型函数里有的地方用了“放出热量为正”的约定两套约定混在一起熵平衡方程就出现了符号错位算出来的S_gen就成了负数。排查方法是每台设备单独测试固定一组输入手算熵产的理论值哪怕只是量级估计然后和函数输出对比。如果只有一台设备输出异常问题基本就锁定在那台设备的符号约定上。另外还有一个容易忽略的细节热流携带的熵流是Q/T这个T必须是放热/吸热边界处的热力学温度而不是环境温度。有些模型直接用环境温度T0代替设备温度算出来的熵产会系统性偏大或偏小。具体取哪个温度要看热量从哪个边界传出去。这个细节不搞清楚熵产数值可能差出30%以上。最后再分享一个我个人的工程习惯在写熵平衡函数时我总会在代码注释里把每个项的物理方向写清楚比如“0表示热量从电解槽流向冷却水”。虽然这会让代码看起来啰嗦一些但调试的时候能省下大量时间。特别是隔了几个月再回来改代码没有这些注释你可能要重新推导半天才能搞明白当时的符号约定。