ARTICLE DETAIL

资讯详情

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

计及碳捕集电厂与需求响应的综合能源多时间尺度调度模型

计及碳捕集电厂与需求响应的综合能源多时间尺度调度模型 “这个课题我前后调了一个多月中间一度想摔电脑。”这是我对【综合能源】计及碳捕集电厂低碳特性及需求响应的综合能源系统多时间尺度调度模型的真实感受。拿到这个题目很多人的第一反应是“又是一个仿真模型”但当自己动手去做才发现难的不是Matlab语法而是怎么把碳捕集电厂这种带强耦合的设备、需求响应这种带时间弹性的负荷、以及日前-日内-实时三级调度框架全部塞进一个可解的优化模型里。这篇博文我不打算给你念PPT式的原理而是直接讲清楚这套模型的设计思路、Matlab代码怎么落地、参数怎么整定、以及我踩过的那些真坑。目标就一个你照着这篇内容能把模型跑起来能解释清楚每个模块为什么这么写答辩或项目汇报时也能讲出深度。先说结论这套模型的核心是“多时间尺度”这条主线碳捕集电厂和需求响应都是服务于“低碳经济调度”的配角。分别看每一块都是成熟技术但把它们耦合进同一个调度框架约束之间会互相影响这才是模型的真正难点。适合谁呢正在做综合能源、低碳电力调度方向研究的学生或者做园区级能源规划、虚拟电厂运营的工程师。需要的基础是熟悉线性规划、懂一点Matlab和Yalmip不需要你把碳捕集的化学机理学透但得有把物理过程翻译成数学约束的意识。1. 项目到底在做什么调度模型、碳捕集、需求响应三件事1.1 三个词组在一起解决的是什么现实问题先拆开看。“综合能源系统”指的是电、热、气等多种能源在源、网、荷、储各环节耦合成一个整体调度的目标是让这个整体在经济性、可靠性和环保性之间取得平衡。“碳捕集电厂”是燃煤机组加装了碳捕集装置运行时要消耗额外能量但捕集下来的CO2可以卖给下游或用于电转气由此形成“碳-能”耦合。“需求响应”则是把负荷从被动的“用”变成主动的“调”通过价格信号或激励手段让用户在时间上配合系统运行。这三个词原本是三个方向的研究拼在一起是因为现实问题本身是多维的要让系统低碳只靠提高新能源比例不够因为火电还要兜底要让火电低碳就得装碳捕集但碳捕集又让电厂出力特性发生变化要弥补新能源波动除了储能需求响应同样有效。于是就有了这样一个统一调度的需求——这正是这个题目的现实背景。所以你做模型时心里要有这根弦不是把三套系统简单相加而是要让碳捕集装置的能耗变成系统运行的决策变量让需求响应的弹性去配合新能源的波动最终在多个时间尺度上协同优化。1.2 适合谁参考学生、工程师分别怎么用如果你是研究生这个模型可以当作中规中矩的毕设或小论文框架。多时间尺度、碳捕集电厂、需求响应这三个关键词分别对应三类研究热点组合起来就是一篇完整论文的“方法”部分。但别把目标定成“复现一篇顶刊”先跑通小算例再逐步加复杂度。如果你是在做项目或写可研报告的工程师这个模型的价值在于提供一种“低碳调度”的量化测算工具给定园区或地区的风光出力曲线、负荷曲线、机组参数可以算出一套调度方案下的总成本、碳排放量和弃风弃光率用来评估加装碳捕集和引入需求响应值不值。这个角度下你不必纠结模型的学术创新性而应该关注参数输入输出是否清晰、求解是否稳定、结果趋势是否合理。两种用途我对模型代码的关注点完全不一样学生要在模型里看到“机理”工程师要在代码里看到“可改”。2. 模型设计思路多时间尺度框架下的低碳调度2.1 日前-日内-实时三级递进各管什么多时间尺度调度简单说就是把“明天怎么运行”的决策分成三个阶段逐步细化。为什么不能一个模型把明天全天都算完因为新能源出力和负荷预测的误差是随时间临近而缩小的更准确的信息应该留给更短时间尺度来利用。日前调度时间尺度通常是1小时一个断面优化未来24小时。这个阶段做的是全局决策比如机组启停、碳捕集装置投退、需求响应合同量。源荷预测精度不高所以日前计划允许有偏差尺度看的是“资源怎么分配”。日内滚动调度每15分钟到1小时滚动一次优化未来4小时。这个阶段相当于微调在日前计划基础上根据最新预测修正机组出力、储能充放和碳捕集运行状态同时要尽量不破坏日前那些不可快速调整的决策。实时调度几分钟到15分钟一个断面做最后校正主要是AGC层面的出力修正模型里往往简化成一个带爬坡约束的再调度问题。我实际建模时比较实用的做法是日前模型单独写一套约束日内模型在日前变量的基础上加“调整量”变量实时模型进一步加“偏差校正”变量。三层变量之间用“爬坡衔接”条件约束避免出现日内输出和日前计划打架的尴尬。这里有个隐藏难点每个时间尺度的模型都会跑一次优化如果三层代码结构不清晰调试一个变量会牵扯到另外两个模型所以强烈建议把三层模型写成三个函数输入输出接口固定好再在外面用一个主脚本循环调用。2.2 碳捕集电厂的低碳运行域怎么描述碳捕集电厂的物理结构我理解就三块燃煤机组本体、捕集装置、储液罐。烟气从电厂排出后进入吸收塔吸收剂通常是胺溶液吸收CO2成为富液再生塔加热富液释放CO2成为贫液再生需要蒸汽这部分能量来自机组抽汽或电锅炉反映到电网上就是“捕集能耗”。建模时最关键的一个思想是“净出力”就是我常说的“毛出力减去捕集能耗才是真正上送电网的功率”。很多初学者把碳捕集电厂当成普通火电只加了一个捕集效率参数这是不对的。碳捕集电厂的可调范围不是一条固定上下限而是一个由烟气量、吸收剂循环量、储液罐液位共同决定的“运行域”。简化建模时我用了这样的思路毛出力与净出力关系净出力 毛出力 - 捕集能耗 - 厂用电。捕集能耗与捕集量成正比捕集量又与烟气量和捕集率有关。烟气量大致与毛出力成正比所以捕集能耗本质上也是毛出力的函数写出来会有一个二次项或双线性项求解时需要用分段线性化处理。储液罐的作用是解耦捕集和发电当电价高时电厂希望多发但捕集装置不一定需要全速运行富液可以暂存储液罐当电价低时捕集装置可以加大吸收功率把之前没处理完的CO2补上。这个“解耦”特性是多时间尺度调度中特别有意思的点——碳捕集电厂实际上自己就带了一部分“时间平移”能力它能在时间维度上把碳捕集任务重新分配。模型里如果丢了这个特性那你做的就只是“火电加个碳税”创新性和实用性都会大打折扣。我当时给运行域建模时把储液罐液位当成状态变量用液位平衡约束和进出液流量约束来刻画效果比直接限定捕集率区间要灵活很多。2.3 需求响应的三类负荷建模需求响应代码实现的核心陷阱是单位不统一——电价是元/MWh热负荷可能是GJ气负荷单位又不一样我吃过亏。建模前务必统一成“电-气-热三个网络的功率单位”一般电用MW、天然气用m³/h或流入功率MW、热用MWth统一后再写平衡约束。我在模型里把DR负荷分成三类可削减负荷用户允许减少一部分用电但每一时段削减量有限且一天累计削减量不能超过合同量。对应约束是各时段削减量上下限加一个日累计约束。可转移负荷比如洗衣机、工业粉碎机用电量不变但工作时间可平移。对应的建模是各时段负荷变化量之和为零转移前后总用电量守恒。可中断负荷允许在特定时段完全断电并获得补偿。这类通常用0-1变量表达把负荷乘以中断状态中断时消耗为0。三种DR同时考虑时最怕负荷平衡约束写重了。比如某个时段既有可转移负荷的转入量又有可削减量如果直接叠加在原始负荷上可能把系统负荷算得过高或过低。我的做法是先定义“基线负荷”再在基线负荷基础上叠加“DR调整量”调整量是一个可正可负的连续变量可转移加上一个非正变量可削减中断负荷单独列为0-1变量。这样清晰且不容易超需求响应上限。2.4 目标函数成本、碳交易与弃风惩罚的博弈很多模型的目标就是“总成本最小”但如果只是把燃煤成本加购电价加碳交易成本结果会非常单调也无法体现多时间尺度的必要性。我做目标函数时把这几项都放进去机组燃料成本、启停成本、碳捕集运行成本吸收剂损耗、再生能耗成本、碳交易成本排放配额与实际排放之差乘以碳价、购电/购气成本、需求响应补偿成本、弃风弃光惩罚。碳交易成本这项我建议这样写总碳排放 机组实际排放 - 捕集量。如果总碳排放低于配额则负成本收益高于配额则正成本。这个表达式把碳捕集的效益直接体现到经济性上也为“低碳特性”提供了量化出口。此外弃风弃光惩罚系数要大于燃煤发电成本否则优化器会选择直接弃风而不是调整火电出力。我刚开始设的惩罚太小结果模型宁可弃风也不动火电后来把惩罚系数调到燃煤成本的1.5~2倍模型才开始主动消纳新能源。这个经验回头看很简单但当时折腾了很久。3. Matlab代码实现从数学公式到可跑的结果3.1 数据准备与基础参数代码的第一步不是写约束是准备数据。这套模型需要的数据包括三类源侧数据、负荷侧数据、价格与参数数据。我一般把数据集中放在一个Excel或data.m文件里脚本只读不写。源侧数据主要是风电、光伏的预测出力曲线负荷侧是电、热、气基线负荷价格数据是分时电价、气价、碳价参数数据是机组爬坡率、效率、储能容量、DR可调比例等。这里有一个容易忽视的点最小运行时间和启停成本参数。多时间尺度模型里机组启停决策通常在日前做日内和实时只在潮汐阶段调整。如果日前模型里没有加最小启停时间约束优化器可能会让机组频繁启停去应对负荷波动这样算出来的结果给工程人员看会被一眼质疑。3.2 Yalmip建模的代码骨架Matlab里最顺手的建模语言是Yalmip配合Cplex或Gurobi求解器。为什么不用纯Matlab优化工具箱因为这类问题大量是混合整数规划机组启停、管线投运Yalmip的约束定义更接近数学公式调试起来直观。核心代码骨架大概长这样%% 变量定义 x_g sdpvar(N_g, T, full); % 机组出力 u_g binvar(N_g, T); % 机组启停状态 q_ccs sdpvar(1, T, full); % 捕集CO2量 lvl sdpvar(1, T1, full); % 储液罐液位 dr_cut sdpvar(N_dr, T, full); % 可削减量 dr_shift sdpvar(N_dr, T, full); % 可转移量可正可负 %% 约束 % 功率平衡 Constraints [Constraints, sum(x_g,1) x_wind x_pv ... load_e sum(dr_cut,1) sum(dr_shift,1) p2g_load]; % 碳捕集电厂净出力 Constraints [Constraints, x_g(k,:) x_net(k,:) e_ccs(k,:)]; % 储液罐液位 Constraints [Constraints, lvl(t1) lvl(t) q_ccs(t) - q_reg(t)]; %% 目标函数 Objective sum(sum(fuel_cost .* x_g)) sum(sum(start_cost .* max(0,u_g(:,t)-u_g(:,t-1)))) ... sum(carbon_price .* (emission - q_ccs)) ...注意这里变量维度里的T日前模型是24日内是4~6实时可能取24个15分钟断面。不同时间尺度共享一套约束函数更好。另一个细节是start_cost的计算如果直接用max函数Yalmip不一定能正确处理建议用辅助变量加不等式来线性化启停成本。3.3 求解器配置与求解复盘求解器配置是新手最容易卡住的环节。Yalmip本身不求解它只是翻译官最终解算靠Cplex或Gurobi。安装完成后先跑这个确认环境正常assign(solver,gurobi); % 或 cplex ops sdpsettings(solver,gurobi,verbose,2,... gurobi.TimeLimit,600,... gurobi.MIPGap,0.01); result optimize(Constraints, Objective, ops);求解完成后先看result.problem为0表示求解成功为1表示不可行为2表示数值问题。这里我要强调求解成功不代表结果合理。我遇到过连续变量全为0、但目标函数显示为负的荒唐情况后来发现是一个约束漏写了下界。所以每次求解完毕至少要检查火电机组出力是否在上下限内、功率平衡是否精确归零、储液罐液位是否在全生命周期内非负。求解速度上如果T从24扩大到96整数变量规模会增加求解时间常常指数增长。我常用的降复杂手段是去掉不必要的二进制变量比如日内调度固定日前启停方案只让出力连续变化把碳捕集能耗用分段线性近似需求响应连续化在激励型DR里把可中断负荷的0-1变量放宽成连续变量。牺牲一点精度换来稳定可复现值。4. 参数整定与结果分析不要只贴一张图4.1 碳捕集效率、储液罐容量的整定心得碳捕集效率这个参数名义上取90%很正常但实际运行中捕集率往往是可调的。我把捕集率设成一个可调变量后模型会在新能源大发、电价低的时段降低毛出力同时提高捕集率把碳排放降下去在负荷高峰、电价高的时段适当降低捕集率保证净出力足够。这就是“碳捕集运行灵活性”的体现。如果你固定捕集率90%等于把这种灵活性丢了。储液罐容量参数对结果影响很大。容量太小罐子缓冲能力不足碳捕集装置只能“边发边捕”捕集能耗无法在时间上转移容量太大成本高且超过实际工程可能。一个合理的取值方法按机组额定烟气量下4~8小时的捕集量来设定储液罐容量。这样系统至少有4小时左右的“碳缓冲”足以支撑日内滚动和实时调整。4.2 多时间尺度结果的对比维度模型跑出来的结果如果只放一张负荷平衡图过于单薄。我强烈建议做三组对比这样论文才能“讲故事”第一组对比是“无碳捕集vs有碳捕集”。总成本、碳排放、弃风率的变化三条曲线或表格摆出来。第二组是“无需求响应vs有需求响应”重点看DR对峰谷差的改善和系统成本的降幅。第三组是“单时间尺度vs多时间尺度”这是最能体现功夫的地方——单时间尺度模型只有日前由于预测误差实际运行爬坡不够用弃风率偏高多时间尺度模型实时段能校正弃风率和失负荷率明显更低。建议画一个表格不同模型下的总成本、碳排放、弃风率、求解时间四个指标一列谁好谁坏一目了然。5. 我踩过的坑模型不可行、求解慢、结果异常5.1 约束写错导致无解的排查清单模型不可行是这类优化项目里最折磨人的问题。我的排查顺序按“从大到小”第一查功率平衡约束。多能互补系统最容易漏的是热负荷平衡、气负荷平衡很多人只写了电平衡。第二查变量维度。Yalmip的full和rect矩阵变量在后续切片索引时容易维数错乱尤其是T1的液位变量和T的流量变量对接时。第三查储液罐的初始和终止液位约束。如果要求终止液位不小于初始液位但总捕集量不够就会直接无解。第四查0-1变量的耦合约束。机组启停和出力上下界的Big-M写法如果M取值太大数值稳定性差太小又会截断可行域。有一个坑特别隐蔽N-1安全约束和多能耦合网络约束如果管网模型里只写了节点能量平衡漏了管道容量约束模型可能永远无解。排查时可以把约束逐条注释掉看哪一条让模型从“有解”变“无解”二分法很快能定位。5.2 求解速度优化实战求解慢一般瓶颈在整数变量和强耦合约束。我调试时用过一个60节点的电热气网算例原来单次日前求解要40分钟优化后压缩到不到5分钟。优化手段按效果排序一是给求解器设MIPGap。优化问题不需要绝对最优MIPGap设为1%~2%速度能提升一个数量级。二是削减冗余变量。比如把24个时段的储液罐状态变量改成只有日内滚动时段的少量变量反正日前阶段不需要每个时刻的液位都作为自由变量。三是提供初始可行解。先用连续松弛求一个结果把对应的整数变量赋值给整数变量作为初始解Gurobi和Cplex对MIP有初始解会快非常多。还有一个容易被忽略的点Matlab本身的数据结构。如果在循环里逐条添加Yalmip约束比如for循环里Constraints [Constraints, ...]几百条问题不大几千条时性能急剧下降。更高效的做法是构造约束矩阵一次性传入Yalmip。这个优化对日内滚动96个时段尤其重要。最后分享一个我对这套模型的小认知。做多时间尺度调度难点从来不是“时间尺度”这四个字而是每个尺度之间变量的衔接关系是否物理可执行。碳捕集电厂是这套模型里最有意思的设备它自己就像一个微型储能系统既有能量存储富液罐又有碳排放的时间平移能力。明白了这一点参数选型和结果分析都会顺很多。你真正把这一层逻辑想通再去跟导师、同行讨论会比我当时只会说“我跑了个仿真”强太多。先按这篇把基础框架跑起来后面再往代码里加碳价波动、风光预测误差、多元储能等扩展方向都有明确的抓手。
返回列表