ARTICLE DETAIL

资讯详情

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

含光热电站、有机朗肯循环与P2G的综合能源优化调度实践

含光热电站、有机朗肯循环与P2G的综合能源优化调度实践 前阵子我把一个“含光热电站、有机朗肯循环、P2G的综合能源优化调度”算例完整跑了一遍系统里同时包含光热电站CSP、有机朗肯循环ORC和电转气P2G三个模块最后用Matlab写成统一优化调度代码。这个题目看起来模块多、公式杂但其实拆开之后主线很清晰把太阳能光热、低温余热回收、电转气三条能量路径放进同一个目标函数里用线性规划或混合整数线性规划求解最优调度方案。这篇文章我就把整个项目的建模思路、数学表达、Matlab实现和调试过程中踩过的坑完整写出来给正在做综合能源优化调度研究、毕业设计或者工程项目初评的朋友一份可以直接参考的实操记录。1. 项目概述与整体思路设计1.1 标题拆解三个模块到底在充当什么角色先看标题“含光热电站、有机朗肯循环、P2G的综合能源优化调度”它其实是由四个关键词组成的综合能源系统、光热电站、有机朗肯循环、电转气。综合能源优化调度是这个项目的总框架后面三个是系统内具体的能量转换设备。光热电站Concentrating Solar PowerCSP和普通光伏最大的区别在于它能把太阳能先转化为热能再通过热功转换发电而且通常配有熔盐储热系统。这意味着CSP的出力不是完全“靠天吃饭”可以在太阳辐照好的时候把热量存起来在晚上或负荷高峰时段再放热发电相当于一个自带储能的可控可再生电源。有机朗肯循环Organic Rankine CycleORC是一种利用低沸点有机工质回收中低温余热发电的技术。它的热源温度范围很广从几十度的工业废热到300多度的烟气余热都能用。在这个系统里ORC主要用来回收CSP发电过程中产生的低温余热把原本排放掉的热量再变成电能属于提效模块。电转气Power to GasP2G则是把富余电能通过电解水制成氢气氢气再和二氧化碳反应生成甲烷或者直接作为氢能使用。P2G的价值在于它是电网和气网之间的“连接器”当系统里可再生能源出力过剩时P2G可以消纳这部分弃电把电能转化为燃气储存或者供给气负荷。这三个模块放在一起本质上构成了一条完整的“光能-热能-电能-气能”多能互补链条优化调度的任务就是决定每个时刻各个设备怎么运行让整个系统的运行成本最低、可再生能源消纳率最高。1.2 方案选型逻辑为什么非得把这三种技术绑在一起我见过不少人在做综合能源系统时犯同一个毛病设备堆得越多越好结果模型越来越复杂求解越来越慢最后也不知道到底哪些设备在起作用。所以立项之前一定要想明白组合逻辑。CSP在这个系统里的定位是“可调度的可再生能源主力”。它既可以发电又可以通过储热系统把能量在不同时间搬移。比如白天太阳辐照强光照资源好CSP就把一部分热量存入储热罐等到晚上电负荷还很高但光伏已经没出力的时候放热发电。这种时间搬移能力对系统调度非常重要。ORC的加入则是基于一个很现实的原因CSP的汽轮机组排气、导热油余热或者储热罐低温段都存在大量温度不高不低的热量直接排放太浪费。ORC正好能把这部分余热“二次发电”。它的投资成本相对不高结构简单没有复杂的燃烧过程很适合作为CSP系统的尾部余热回收模块。P2G的作用主要是解决“弃电去哪儿”的问题。如果系统里既有光伏又有风电再叠加CSP在中午和夜间低负荷时段很容易出现电力供大于求。这时候与其弃掉不如把电送给P2G设备制氢制甲烷。虽然电转气全链条效率不算高一般在50%左右但在弃电场景下这部分电本来就要被废弃拿来转气相当于“捡回来的收益”。所以这三个模块的组合逻辑是CSP作为主电源 ORC作为余热回收升级 P2G作为跨网储能与消纳出口。调度模型的优化目标就是让这三者协同运行在满足电、热、气三类负荷的前提下实现系统整体经济性最优。1.3 这项目适合谁参考能解决什么问题如果你的方向是综合能源系统规划与运行优化这个算例可以直接作为基础框架如果你在做光热电站相关课题可以参考CSP的储热调度建模方式如果你在研究可再生能源消纳P2G部分的建模和结果分析能给你提供一套完整的算例支撑。从解决问题角度看这个项目主要解决三个实际问题第一多种能源设备之间的时间耦合怎么建模比如储热罐的SOC怎么进入优化约束第二不同能源形式之间的转换效率怎么折算比如电能转化为燃气怎么统一单位第三在Matlab里怎么高效表达并求解一个线性优化问题。这些内容我在后面的章节都会详细展开。2. 各子系统建模把物理过程翻译成数学语言2.1 光热电站CSP光-热-电-储四环节耦合CSP的建模不能像光伏那样只看光照出力因为它内部有集热、传热、储热、换热、发电多个环节而且这些环节之间存在强耦合。我在算例里采用的是工程上常用的“分层简化建模”方式把整个CSP看成一个光热输入、两个储热端口、一个电出力端口的能量节点。首先定义光场吸收的热功率。模型里给定太阳法向直接辐射DNI、镜场面积A和光场综合效率集热场输出的热功率近似为Q_solar(t) DNI(t) * A * eta_field * (1 - heat_loss)eta_field包含了镜面反射率、集热管吸收率、光学损失等因素实际工程中一般在0.4~0.5之间。heat_loss是散热损失比例可以取一个常数简化处理。然后是储热罐的模型。储热罐的蓄热量用SOC表示储能设备的通用状态方程是SOC(t1) SOC(t) (eta_ch * Q_charge(t) - Q_discharge(t) / eta_dis) * dt / E_max其中Q_charge和Q_discharge分别是充热和放热功率eta_ch和eta_dis是充放热效率E_max是储热罐最大容量。要注意放热效率在分母上因为放热过程有损耗实际提供给下游的热量要小于储热罐中释放的热量这个细节很多初学者会写反。CSP内部的热平衡关系是Q_solar(t) Q_discharge(t) Q_charge(t) Q_turbine(t)Q_turbine是进入汽轮机的热功率。汽轮机的电出力P_csp(t)通过一个热电转换效率关联P_csp(t) eta_csp * Q_turbine(t)eta_csp对于熔盐工质汽轮机组可以取0.36~0.42。除此之外还要给汽轮机设置出力上下限和爬坡约束避免调度结果出现过于剧烈的出力波动。储热罐的引入让CSP具有了时间搬移能力但也带来了两个需要特别注意的地方。一是SOC不能越界必须限制在0和1之间二是很多算例会给定调度周期始末SOC相等或者至少给定初值否则模型在优化时会出现“把储热罐放干”这种不符合运行逻辑的结果。2.2 有机朗肯循环ORC低温余热的发电回收路径ORC建模的关键是搞清楚热源在哪里、热源温度是多少。现在系统里有CSPORC的热源可以取自CSP汽轮机排汽余热、导热油回路余热或者储热罐换热后的低温热不管哪种来源在优化模型里都可以抽象成一个“从系统中提取的热功率”变量Q_orc_in。ORC发电功率的简化模型是P_orc(t) eta_orc * Q_orc_in(t)eta_orc是ORC系统的热电转换效率。这个效率不是随便取的它和热源温度、工质类型、冷源温度密切相关。如果热源只有80~120℃亚临界ORC的综合发电效率一般在6%~12%之间如果热源温度到250~350℃效率可以达到15%~22%。我这边热源取的是CSP余热温度不高不低eta_orc取12%比较合适。工质选择也是一个值得展开的点。ORC工质要求沸点适中、化学稳定性好、环保性好。R245fa是过去几年低温ORC项目用得最多的工质适合100~180℃热源R1233zd(E)和R1234ze(E)是新一代低GWP工质环保性能好逐渐在替代R245fa如果热源温度再高一些可以用环己烷或者甲苯。ORC自身的能量平衡是Q_orc_in(t) P_orc(t) Q_orc_out(t)Q_orc_out是冷凝器排出的低温余热。这部分热量如果还有利用价值比如作为热网补热可以再接入热负荷平衡如果不考虑利用就写成散热量。我在算例里把Q_orc_out的一部分作为供热补充接入热网相当于把余热“吃干榨净”了。需要提醒的是ORC的出力可能受热源侧限制。Q_orc_in不能超过热源能提供的最大热功率而且ORC是连续可调的设备一般不做启停0-1变量直接让它连续运行即可。如果系统里热源功率波动太大ORC出力也会跟着波动需要注意爬坡约束的配合。2.3 P2G电转气电-氢-气的能量搬移通道P2G过程分两步第一步是电解水制氢第二步是氢气甲烷化。如果只制氢不甲烷化系统里多了一个氢负荷或者氢储罐需要另外建模这个算例里我们写成“电-天然气”全链条输出的燃气直接对接天然气负荷这样系统就形成了电、气、热三种能源的完整闭环。假设P2G整体从输入电能到输出天然气的综合热效率为eta_p2g那么P_gas_out(t) eta_p2g * P_p2g_in(t)P_p2g_in是P2G消耗的电功率P_gas_out是输出天然气按热值折算的功率单位统一为MW或者MWh。电转天然气的全链条效率电解槽约70%左右甲烷化约70%~80%乘起来大约在50%上下算例里取0.55。P2G的约束主要有三个。第一是输入功率上下限一般是0到设备额定功率第二是爬坡约束电解槽不能瞬间从零跳到满功率需要限制相邻调度时刻的功率变化量第三如果甲烷化过程需要消耗二氧化碳而CO2的获取量有限那么P2G的最大出力还会受到CO2供应上限的限制。不过这个算例暂不考虑CO2供给约束有兴趣的朋友可以把这个约束加进去做扩展。P2G设备投入运行后系统里多了一个“电力消费者的同时也是一个气源”。它的运行方向通常是在光伏大发的中午时段如果电负荷不够吃P2G启动消纳在夜间风电高发而负荷低谷时段P2G也可以启动把多余风电转成天然气储存或供给气负荷。这样P2G相当于一个时间转移和能源形态转换的双重缓冲器。3. 优化调度建模与Matlab代码实现3.1 目标函数设计从“只要省钱”到“系统性最优”综合能源优化调度的目标函数有很多种写法最基础的是运行成本最小化。算例里我采用的目标函数包括以下几部分从上级电网购电费用、向电网售电收益、购气费用、可再生能源弃电惩罚费用、设备运行维护费用。表达式可以写成min sum_t [ Price_buy(t) * P_buy(t) - Price_sell(t) * P_sell(t) Price_gas * F_gas_buy(t) lambda_curtail * (P_curt_pv(t) P_curt_wind(t)) c_csp * P_csp(t) c_orc * P_orc(t) c_p2g * P_p2g_in(t) ]其中弃电惩罚项很重要。如果不加弃电惩罚削峰填谷模型可能宁可弃掉可再生能源也不愿意让P2G启动因为P2G运行也有成本。加上lambda_curtail之后模型会在“弃电惩罚”和“P2G运行成本”之间做权衡这个惩罚系数取多大直接决定P2G被启用的频率是一个值得重点做敏感性分析的参数。如果想要做低碳调度可以在目标函数里加一个碳排放成本项对购电和购气对应的碳排放进行定价。碳价给多少模型优化结果会明显变化这个留给读者自己实验。核心思路是目标函数要把所有设备运行的经济信号放在同一个维度上比较不能因为某个模块小就忽略它的成本。3.2 关键约束功率平衡、储能SOC、转换关系与爬坡调度模型的约束条件分成几大类这里逐个说明。第一类是功率平衡约束。电功率平衡是最核心的P_pv(t) P_wind(t) P_csp(t) P_orc(t) P_buy(t) P_load(t) P_p2g_in(t) P_sell(t) P_curt_pv(t) P_curt_wind(t)注意这里把弃电量也写进等式的右侧了因为实际物理过程中光伏和风电发出的电要么被利用要么被丢弃不可能凭空消失。热功率平衡为Q_heat_source(t) Q_orc_out_recover(t) Q_heat_load(t) Q_heat_dump(t)气功率平衡为P_gas_out(t) F_gas_buy(t) F_gas_load(t)如果P2G输出的燃气超过气负荷需求可以加一个燃气储气罐模型把多余的气储存起来。这个算例暂时简化为P2G和气网购气共同满足气负荷不设储气罐。第二类是储能设备的SOC约束。前面已经给出了SOC递推方程除了这个动态方程之外还需要SOC上下限约束、末时刻SOC的约束以及充放热功率的不等式约束。这些约束保证了储热罐不会出现“既在充又在放”的荒谬情况。第三类是设备转换与爬坡约束。CSP汽轮机出力上下限和爬坡限制、ORC热源输入上限、P2G输入功率上下限和爬坡限制这些都需要一一写进模型。如果一时加不齐也没关系后面调试的时候哪里不对补哪里。3.3 代码框架从参数初始化到调用求解器Matlab实现综合能源优化调度我强烈建议用YALMIP工具箱建模再调用CPLEX或者Gurobi求解。YALMIP的语法非常接近数学表达式的写法可以大幅度减少开发时间。如果你刚装好Matlab记得先确认优化工具箱和相关求解器已经配置好。整体代码框架如下%% 步骤1清空环境与读取基础数据 clear; clc; close all; T 24; dt 1; % 调度周期24小时步长1小时 %% 步骤2载入预测数据典型日曲线 % P_pv, P_wind, Load_elec, Load_heat, Load_gas, DNI % 可以从Excel读取也可以直接在脚本里赋值 %% 步骤3定义决策变量 P_csp sdpvar(1, T); % CSP电出力 Q_turbine sdpvar(1, T); % 进入汽轮机的热功率 Q_ch sdpvar(1, T); % 储热罐充热功率 Q_dis sdpvar(1, T); % 储热罐放热功率 SOC sdpvar(1, T); % 储热罐蓄热状态 P_orc sdpvar(1, T); % ORC电出力 Q_orc_in sdpvar(1, T); % ORC输入热功率 P_p2g sdpvar(1, T); % P2G消耗电功率 P_gas_out sdpvar(1, T); % P2G输出燃气功率 P_buy sdpvar(1, T); % 从电网购电 P_sell sdpvar(1, T); % 向电网售电 P_curt_pv sdpvar(1, T); % 弃光伏功率 P_curt_wind sdpvar(1, T); % 弃风功率 F_gas_buy sdpvar(1, T); % 购气功率 %% 步骤4构建约束条件 Constraints []; %% 步骤5定义目标函数 Objective ... %% 步骤6求解 ops sdpsettings(solver, cplex, verbose, 2); result optimize(Constraints, Objective, ops); %% 步骤7结果输出与画图这个框架一眼看下来很清爽实际写的时候就是往里面填内容。只要约束和目标的代码不出语法错误YALMIP会帮你把优化问题自动整理成标准形式交给求解器。3.4 核心代码片段解析这里放一段CSP储热约束的代码这是整个模型里最容易写错的环节之一。%% CSP光场热功率计算 Q_solar DNI * A_mirror * eta_field * (1 - heat_loss); % 1xT 行向量 %% 储热罐SOC递推约束 % 写法1循环逐时刻添加 for t 1:T-1 Constraints [Constraints, SOC(t1) SOC(t) ... (eta_ch * Q_ch(t) - Q_dis(t) / eta_dis) * dt / E_max]; end Constraints [Constraints, SOC(1) SOC_initial]; Constraints [Constraints, SOC(end) SOC_initial]; % 始末SOC一致 Constraints [Constraints, 0 SOC 1]; %% CSP内部热平衡 Constraints [Constraints, Q_solar Q_dis Q_ch Q_turbine]; %% CSP发电转换与出力限制 Constraints [Constraints, P_csp eta_csp * Q_turbine]; Constraints [Constraints, 0 P_csp P_csp_max];注意SOC递推方程的符号充电时SOC增加等式右边加eta_ch乘以Q_ch放电时SOC减少等式右边减去Q_dis除以eta_dis千万别把效率乘除位置写反。目标函数的代码写法如下%% 目标函数运行成本最小化 Objective sum(Price_buy .* P_buy) - sum(Price_sell .* P_sell) ... sum(Price_gas * F_gas_buy) ... lambda_curtail * (sum(P_curt_pv) sum(P_curt_wind)) ... c_csp * sum(P_csp) c_orc * sum(P_orc) c_p2g * sum(P_p2g);YALMIP里矩阵乘法和逐元素乘法要分清点乘是逐元素普通乘法是矩阵乘法写错会直接报维度错误。4. 典型算例与结果分析4.1 算例场景与参数设定为了验证模型我构造了一个典型的冬季日场景。光伏装机80MW风电装机120MW电负荷峰值约150MW热负荷峰值约60MW气负荷峰值约30MW。CSP镜场面积取40万平方米光场综合效率0.45储热罐容量250MWhCSP电出力上限50MW。ORC的输入热功率上限50MW发电效率0.12。P2G额定输入功率20MW综合转换效率0.55。电价采用分时电价峰时段1.1元/kWh平时段0.65元/kWh谷时段0.32元/kWh。购气价格按热值折算为0.35元/kWh。弃电惩罚系数取150元/MWh这个数值高于P2G单位功率的运行成本所以模型会优先考虑用P2G消纳弃电。我将整个模型写成线性规划问题用YALMIP建模后调用CPLEX求解单次调度秒级之内就能算完速度很快。4.2 调度结果怎么看三个模块是怎么协同的算例结果出来后不要急着贴图表先看能量平衡是否满足再看设备出力曲线是否符合物理直觉。优化结果显示CSP在白天太阳辐照好的时段尽量多发电同时储热罐蓄热到了傍晚光伏出力下降、电负荷仍高的时候储热罐放热CSP继续维持较高出力。这是一个非常典型的储热调度模式说明SOC方程和热平衡约束写的没毛病。ORC的出力曲线则完全跟随CSP的余热供应情况。白天CSP运行时间长、余热量大ORC出力相应提高夜间CSP低负荷运行时ORC出力下降。整体来看ORC贡献了额外的电量虽然单机容量不大但在高峰时段能减轻购电压力。P2G的运行集中在两个时段中午光伏大发时段和夜间风电大发时段。在这两个时段里系统供电能力大于用电需求如果不开启P2G就会出现弃电开启P2G后富余电能转化为燃气供给气负荷。从结果看含P2G方案的弃电率明显下降购电量也显著减少。调度结果中还出现了一个有意思的现象由于P2G在夜间消耗了大量风电系统向电网购电的功率峰值比无P2G方案更低。这说明P2G不仅能消纳弃电还能通过“削减用电低谷时的过剩出力”来优化系统整体购电曲线。4.3 参数敏感性改哪些值对结果影响最大跑完基础算例我又做了几个参数敏感性分析。第一个是P2G转换效率从0.4变化到0.65第二个是储热罐容量从150MWh变化到350MWh第三个是弃电惩罚系数从50变化到300元/MWh。P2G效率提升后相同电功率输入得到更多燃气P2G的单位运行经济性变好系统更愿意启动P2G弃电率进一步下降。但如果效率低于0.45左右模型会认为P2G的运行成本相对于弃电惩罚太高宁可少量弃电也不启动P2G。所以P2G效率是决定它能否“入列”的关键参数。储热罐容量对CSP的影响更大。容量从150MWh增加到350MWh后CSP夜间出力的持续时间明显变长系统对晚间高电价时段购电的依赖降低运行成本下降。不过储热容量继续增加后成本下降幅度放缓说明存在边际收益递减。弃电惩罚系数则直接改变了调度决策的风格。惩罚系数偏低时系统遇到弃电风险就顺手弃掉P2G的利用率不高惩罚系数调高后模型会想尽办法利用各种手段消纳可再生电力P2G的启停次数和功率深度都增加。这个参数在工程场景中其实对应着政策考核力度是很有现实意义的调节旋钮。5. 常见问题与排查技巧实录5.1 求解失败与无可行解排查用YALMIP跑优化模型最常见的报错是“Infeasible problem”或者求解器返回无解。遇到这种问题不要慌按照从简单到复杂的顺序排查。第一步检查变量维度是否一致。很多无解问题本质上是因为矩阵维度不匹配YALMIP在构建约束的时候报错不明显但求解器一定会给出不可行或者边界错误。第二步检查SOC初末值约束如果末端SOC强制等于初值而储热容量太小系统在物理上无法做到“充得进、放得出”就会无解。第三步检查功率平衡中的正负号尤其是P2G消耗功率在电平衡中是负荷项放在等式右侧如果写错到左侧模型结果会完全乱掉。排查无解问题的一个通用技巧是把目标函数删掉只求解可行域。如果连可行域都为空说明约束之间硬性冲突如果可行域有解但加上目标函数后无解那问题出在目标函数或求解参数设置上。这个方法可以快速缩小排查范围。5.2 结果不合理与不收敛处理有时候模型有解但结果一看就不对。比如CSP出力曲线像锯齿一样剧烈波动这通常是缺少爬坡约束。汽轮机组在实际运行中出力变化率受限如果模型里没写爬坡约束求解器就会利用目标函数的空隙制造出不合理的高频波动。解决办法是在约束里补充Constraints [Constraints, -Ramprate diff(P_csp) Ramprate];这里diff是相邻时刻的功率差左边负爬坡右边正爬坡。还有一种情况是SOC曲线在周期内漂移比如初始和末端SOC设定不一致或者储热罐充放热效率设置不当导致储热量逐渐累积或衰减。解决办法是检查递推方程里dt有没有乘以检查初末SOC是否按要求锁定再给SOC变量设置一个合理的上下限。另外如果发现P2G在某段时间内没有启动但弃电惩罚又很高需要查看P2G的爬坡约束是不是限制得太死。电解槽启动确实需要时间但一小时级别的调度模型里爬坡约束一般不会卡得太紧。如果仍然无法启动可以把P2G的爬坡约束放宽或者删除看结果是否改善以此判断问题所在。5.3 建模和写代码时最容易被忽略的细节有几个细节是我这次实操中反复踩过的坑值得单独拎出来说。第一个是单位统一。综合能源系统里同时存在“电、热、气”三种能量气负荷如果用的是体积单位立方米电压和热量用的是MWh换算起来非常容易出错。我的做法是全程统一为功率单位MW和能量单位MWh天然气按热值折算成等效功率。比如1立方米天然气热值大约9.88kWh在气负荷数据里直接除以3.6换算成MWh后面所有模型都不再做单位换算。第二个是效率符号位置。储能设备充放热效率的位置非常容易写反充电效率乘在输入侧放电效率除在输出侧。如果写成反过来模型的能量收支就不守恒结果会出现“凭空多出能量”或“凭空消失能量”的诡异现象。第三个是数据对齐。光伏、风电、负荷、DNI四个预测曲线的时间轴必须完全对齐任何一个序列起点差一小时整个调度结果都会错位。建议数据统一放在Excel表格里用统一的序号列导入Matlab后先用绘图命令画一遍肉眼确认各曲线的时序关系没有问题。第四个是求解器参数设置。如果问题规模不算大没必要开太多求解器选项默认参数往往效果就很好。但如果加了二进制变量导致求解时间暴涨可以考虑调整YALMIP的求解器参数让CPLEX或者Gurobi启用MIP割平面策略。对于纯线性规划问题CPLEX默认参数已经很快不需要额外配置。综合能源优化调度这类项目模型不复杂难的是各个模块之间耦合约束的准确表达。CSP、ORC、P2G三者的时间尺度和能量形态各不相同只有把它们各自的物理约束和系统平衡约束写对了调度结果才有参考意义。我建议大家在跑通基础算例后根据自己的场景去改参数、加设备、换目标函数比如加入碳交易成本、增加储气罐、考虑需求响应这样整个框架才能变成你自己的东西。后面如果有机会我准备把不确定性场景下的调度也做进去让结果更贴近实际运行环境。
返回列表