ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

碳势-能源价格双响应的综合能源系统低碳经济调度Matlab复现

碳势-能源价格双响应的综合能源系统低碳经济调度Matlab复现 最近在做综合能源系统调度方向的复现工作顺手把一篇EI论文的核心模型和Matlab实现拆了一遍。这篇论文的切入点很有代表性题目里同时出现了“碳势”和“能源价格”两个响应信号目标是把低碳和经济两个目标揉进同一个调度框架里。很多刚入门的同学看到“碳势-能源价格双响应”这几个字容易懵以为是什么玄乎的高阶理论其实拆开看逻辑非常清晰。这篇内容我就从模型原理、数学建模、Matlab代码实现到仿真分析完整讲一遍我是怎么复现的以及在复现过程中踩过的坑。先说清楚这篇文章适合谁看如果你在做综合能源系统优化调度、碳排放流分析、需求响应建模或者打算复现类似EI论文作为自己的研究基础那这篇能帮你省不少时间。如果你刚接触MatlabYalmip求解器也能从代码框架里找到可以直接抄作业的写法。我尽量把每一步的“为什么”也讲出来而不是只给一堆公式和代码片段这样你遇到变体问题时才能灵活改。1. 这篇EI到底在做什么碳势与能源价格双响应的逻辑起点1.1 为什么是“双响应”而不是单纯低碳或单纯经济传统综合能源系统IES调度里最常见的两派做法一派只盯运行成本追求购电购气费用最低另一派只盯碳排放强制压减高碳机组出力。实际运行中这两者经常打架——低碳方案可能更贵经济方案可能排放更高。这篇论文的思路不是做折中而是给系统里的负荷侧和供给侧同时引入两个可感知的信号碳势和能源价格。所谓双响应就是让系统中各个单元在接收到这两个信号后主动调整自身用能行为或出力行为。这里的“响应”不是物理层面的自动控制而是优化模型里的“信号-行为”映射。比如电网节点碳势高说明该节点消耗的电能对应的碳排放强度大那么这部分负荷如果能在时间上平移或者改用天然气、热能等其他能源形式就能降低整体碳排放。能源价格信号则驱动经济性峰时电价高储能放电、用户削减可转移负荷谷时电价低储能充电、增加电负荷。当两个信号同时作用时调度方案会出现比单信号更复杂的权衡。1.2 碳势的物理含义从碳排放流到节点碳势很多教程一上来就抛碳势公式但如果你没搞懂“碳排放流”这个概念后面代码大概率是照着抄。碳排放流的本质是把碳排放责任从发电侧追踪到负荷侧。发电厂排出多少碳这部分碳排放会随电网潮流“流动”到各个节点最终由该节点的负荷承担。节点碳势就是单位电量在该节点被消费时所对应的碳排放量单位通常是 kgCO2/kWh。这个思路和价格流很像——电价随潮流在各节点变化碳势也随潮流在各节点分布。不同之处在于碳势不仅取决于机组本身的碳排放强度还取决于电网拓扑、潮流方向以及各机组出力比例。所以在IES里你不能简单把所有电负荷乘一个平均碳排放因子那样会丢失空间差异性。EI论文里常用改进的碳排放流模型把气网、热网也纳进去形成综合碳势。复现的时候最耗时间的就是这部分矩阵运算后面我会讲怎么用Matlab向量化写。1.3 能源价格响应需求侧如何被价格信号调动能源价格响应在电力市场里研究得很多典型是价格型需求响应Price-Based Demand ResponsePBDR。核心是电价变化会改变用户用电意愿负荷量随价格弹性变化。用数学表达就是负荷变化率 价格弹性系数 × 价格变化率。在IES里这个逻辑可以扩展为电、气、热三种能源的价格同时影响三类负荷而且存在交叉弹性——电价涨了用户可能把一部分电负荷转为气负荷或热负荷。这就引出了“多能互补”和“需求响应”的交叉点。在碳势和能源价格双响应下负荷侧的灵活性被充分挖掘既能响应经济信号也能响应低碳信号。设计模型时需要把价格弹性矩阵和碳势敏感性参数同时放进约束或目标函数。这一步是模型创新点也是复现时最容易出bug的地方——参数数量多单位不统一迭代容易震荡。2. 复现前先建模综合能源系统低碳经济调度的数学模型2.1 系统拓扑与设备建模的取舍综合能源系统没有标准拓扑EI论文常自己定义一个包含风电、光伏、燃气轮机、电锅炉、燃气锅炉、储能、电负荷热负荷的微网或区域IES。复现第一步不是写代码而是先把系统拓扑画清楚。我的做法是用一个简单的节点图来表示电网从上级网购电风电光伏并入气网从上级气网购气燃气轮机同时产出电和热电锅炉和燃气锅炉供热蓄电池储电蓄热罐储热甚至可以加电转气P2G环节。设备建模的核心是效率曲线和运行区间。复现时不必追求完全精确的非线性效率曲线很多EI论文为了可解性把设备效率当作常数或线性化处理。例如燃气轮机的电效率设为固定值0.35热回收效率设为0.4这样就得到热电比为0.4/0.35≈1.14。这个比值很重要决定了热电联产机组在调度中的出力范围。如果后续要改进可以把效率写成与出力相关的分段线性函数但一开始复现不要引入太多非线性否则模型可能根本解不出来。2.2 目标函数碳排放成本与经济成本如何同框双响应的落脚点在目标函数。常见写法是min F C_energy C_carbon其中C_energy包含购电费用、购气费用、设备运行维护费用、需求响应补偿费用C_carbon可以是系统总碳排放量乘以碳价也可以是碳交易机制下的碳配额成本。前者是简单的排放定价后者更复杂涉及基准配额和超额惩罚。EI论文里“低碳经济调度”通常把两者都考虑形式为C_carbon λ_c × (E_total - E_quota)如果E_total大于配额就需要购买碳配额如果小于则可以出售盈余配额获得收益。这样就把碳排放从硬约束变成了经济信号。碳势进入目标函数的方式通常是在C_energy中加入一个与节点碳势相关的惩罚项或者直接把节点碳势乘以负荷电量作为碳排放计算依据。这里要注意如果直接采用系统总排放碳势的空间差异性就体现不出来论文的创新点就会缩水。所以建议把电能碳排放部分按节点碳势加权计算而不是用单一排放因子。2.3 约束条件的坑电网、气网、热网与储能的耦合IES调度建模最繁琐的是约束。电网约束包括节点功率平衡、线路潮流限制、上级购电上下限气网约束包括天然气节点平衡、购气量限制热网约束包括热功率平衡、温度或流量简化模型储能约束包括SOC递推、充放电功率限值、周期始末SOC相等设备约束包括燃气轮机运行区间、锅炉出力限制、爬坡约束等。这些约束在Matlab里写起来不难难的是变量的维度和索引匹配。一个常见的坑是时间维度。调度的决策变量通常是24小时的也就是每个变量都是一个24维列向量。比如蓄电池的充电功率P_ch是24维放电功率P_dis也是24维SOC是25维包括初始状态。写约束时要注意Matlab的索引不能把SOC(1)和P_ch(1)的关系弄错。另外燃气轮机的爬坡约束涉及相邻两个时段的出力差如果用循环写24次会慢用矩阵移位构造会更高效。2.4 双响应机制如何进入模型双响应机制主要通过两种方式进入模型。第一种是约束方式负荷不再是固定值而是随价格和碳势变化的变量。以电负荷为例P_load(t) P_base(t) × [1 e_p × (price(t) - price_ref)/price_ref e_c × (carbon_intensity(t) - carbon_ref)/carbon_ref]其中e_p是自价格弹性系数通常为负e_c是碳势响应系数通常也为负表示碳势高时用户减少用电。这种线性化响应函数简单、可解但需要留意过大的弹性系数会导致负荷变成负值必须加边界约束。第二种是补偿成本方式用户提供了负荷调整量系统需要支付补偿费用。这部分会进入目标函数与运行成本形成竞争。复现时我建议先实现第一种方式跑通后再加补偿成本因为补偿成本涉及分段线性或二次函数会增加求解复杂度。还有一个需要注意的概念碳势本身不是输入常数它依赖调度结果。也就是说碳势和调度变量之间存在耦合你先有各机组出力才能算节点碳势有了碳势负荷才会调整负荷变了机组出力又变。这就变成了一个不动点问题或混合整数非线性问题。EI论文通常用迭代法或者将碳势用上一轮结果代替形成顺序求解。具体实现后面讲。3. 求解思路与Matlab实现要点3.1 为什么这个模型不是简单线性规划如果你把设备效率都当常数目标函数里没有非线性项约束也都是线性的那这确实是个线性规划问题。但碳排放流的节点碳势计算涉及潮流分布通常是按直流潮流或交流潮流来算而潮流方程本身是非线性的。有些论文采用直流潮流线性化把电压、无功忽略掉只保留有功和相角那么碳势计算可以线性化。但这样和实际电力系统偏差较大审稿人可能会挑战。我复现的这个模型里设备模型加进了0-1变量比如储能充电放电不能同时进行燃气轮机启停状态这就变成了混合整数线性规划MILP。如果再把碳势迭代或负荷响应非线性项加进去会变成混合整数非线性规划MINLP。对于EI复现来说大多数论文会用线性化手段把MINLP化回MILP然后求全局最优。因此你首先需要明确你要解的是LP、MILP还是MINLP这决定了求解器选择。3.2 求解器选型yalmipcplex/gurobi还是matlab自带linprogMatlab自带的linprog能解LPintlinprog能解MILP但对于变量规模稍大的IES调度模型性能一般特别是有几百个0-1变量时可能比较慢。建议使用Yalmip建模后端对接Cplex或Gurobi。Yalmip是一个Matlab的建模语言写约束非常方便而且换求解器只需改一行代码。Gurobi有学术免费许可Cplex也有社区版安装都不复杂。我用的是YalmipR2019bGurobi 9.5组合。需要注意版本兼容性Yalmip更新频繁老版本可能不识别新求解器。另外Gurobi安装后要在Matlab里加路径并运行gurobi_setup。如果只想快速验证模型也可以用intlinprog代码改造成本不大Yalmip的optimize会自己调求解器你只要安装并添加路径就行。3.3 代码架构从参数初始化到结果输出的一个实战框架我写IES调度代码的习惯是分文件管理主脚本、参数文件、数据文件、模型构建函数、结果绘图。这样后期改参数不用翻一坨代码。核心流程如下主脚本main.m清空环境、加载参数、调用模型构建、求解、输出结果。参数文件parameters.m定义系统参数包括设备容量、效率、价格、碳配额、弹性系数等。数据文件load_data.m定义24小时电负荷、热负荷、风电光伏预测值、分时电价等。模型构建build_model.m用Yalmip定义变量、目标函数和约束返回optimization problem。求解求解器调用ops sdpsettings(solver,gurobi,verbose,2); optimize(Constraints, Objective, ops);结果处理post_process.m取出变量计算各成本项绘制调度图。变量定义不建议全用单个字母而是用结构体。比如x.gen表示燃气轮机出力x.ess_ch表示充电功率。虽然代码写起来长一点但排查错误时能省很多时间。尤其复现时你往往需要对照论文里的符号结构体命名能让你快速定位到对应物理量。3.4 数据构造用典型日数据还是随机数据EI复现时经常遇到原始数据不全的问题。论文里往往只给部分参数很多图表数据是经过处理后的结果。我的做法是优先采用论文公开数据如果论文没给就参考同方向文献的典型日数据比如某些标准IES算例数据。尽量避免用完全随机的数据因为模型可能得到违反物理常识的结果而你无法判断是模型错误还是数据错误。构造24小时数据时要注意时间粒度和量纲。电负荷一般用kW或MW天然气用m³或kWh热量用kWh或GJ。单位不统一会导致目标函数里两个成本项相差几个数量级求解器容易出数值问题。我的技巧是统一采用kW和kWh为基准天然气的热值按9.7kWh/m³换算这样所有能量都在同一量纲下目标函数系数不会过于悬殊。4. 仿真结果怎么分析才像EI论文4.1 你要画出什么样的图调度方案、碳势分布、价格响应曲线复现之后你得能画出几类关键图。第一张是系统各设备24小时出力堆叠图比如电功率平衡图包括风电、光伏、燃气轮机、购电、储能充放电、电负荷曲线。第二张是热功率平衡图包括燃气轮机余热、燃气锅炉、电锅炉、热储能、热负荷曲线。第三张是节点碳势随时间的变化曲线或者不同节点碳势对比柱状图。第四张是负荷响应前后对比图体现双响应机制对负荷曲线的影响。第五张是成本构成饼图或柱状图对比不同方案下的经济性和碳排放。从这些图里你应该能得出几个典型结论双响应策略下碳排放量下降总成本可能略有上升或者不升反降因为减少了碳交易成本储能会在碳势低或电价低时充电在碳势高或电价高时放电燃气轮机在碳势高时会减少出力由燃气锅炉或储能补足供热缺口等。我的建议是先复现出这些结论再考虑跑对比实验——因为如果基础场景的结果不符合物理直觉说明模型或代码有问题跑再多对比也没意义。4.2 对比实验设置的四个维度一篇EI论文要有说服力需要设置几个对比方案。复现时同样要按这些维度设计方案1无响应调度即负荷固定目标只考虑经济成本不考虑碳排放。这是基准方案。方案2仅考虑碳势响应目标中加入碳排放成本负荷对碳势响应但不考虑价格弹性。方案3仅考虑能源价格响应负荷对电价响应目标只考虑经济成本。方案4碳势-能源价格双响应即论文模型目标同时考虑成本和碳排放负荷对两个信号都响应。有时还会加一个方案5把碳排放作为硬约束而不是成本项对比两种碳处理方式的差异。每个方案都要记录总成本、运行成本、碳排放量、碳交易成本、负荷峰谷差、清洁能源消纳率等指标。整理成表格能直观看出双响应的优势。我在复现时发现单纯加碳势响应可能导致成本上升但加上价格响应后由于负荷转移降低了系统峰值购电成本下降反而可能抵消一部分低碳成本。这就是双响应机制协同价值的体现。4.3 从结果反推机理性结论论文讨论部分往往是对仿真结果进行机理解释。复现后你也得学会“看图说话”但要说得有物理意义。比如为什么价格响应能够降低碳势因为电价峰时段往往对应燃煤机组出力较大、碳势较高的时段负荷从峰时转移到谷时相当于躲开了高碳电。这时候价格信号和碳势信号方向一致起协同作用。但如果碳势高峰期与电价低谷期重叠两个信号就相互矛盾。此时双响应模型的优势就体现出来了系统会在低碳激励和经济激励之间做最优折中。比如当电价为低谷但碳势也很低时用户会增加用电当电价为低谷但碳势很高时用户不会因为电价低就大量用电而是选择其他能源。这种“信号冲突”下的决策行为才是双响应机制最能出彩的地方。复现时建议专门设置一个场景来展示这种冲突作为论文的亮点。5. 从复现到改进我在调试中踩过的坑5.1 碳势初值不收敛的排查因为碳势和负荷互相耦合我一开始采用迭代法先假设负荷不变求解调度计算碳势再用新碳势更新负荷约束重新求解直到碳势变化小于阈值。结果发现经常振荡不收敛有时候在两个解之间来回跳。排查后发现问题出在碳势的更新步长。如果完全用本轮计算值替换上一轮值相当于大步长迭代系统容易过冲。解决办法是采用松弛迭代carbon_new alpha * carbon_calc (1 - alpha) * carbon_oldalpha取0.3-0.5。这样迭代相对稳定一般10轮以内能收敛。另外还要设置最大迭代次数和收敛精度输出每一轮的碳势变化曲线方便观察。还有一点要注意碳势响应系数e_c不要设太大否则微小碳势变化就会导致负荷大幅波动数值上很难收敛。建议e_c绝对值在0.05-0.2之间。5.2 价格弹性系数设置不当导致调度方案跳变价格弹性系数是需求响应模型里的敏感参数。初学时我把自弹性设为-0.5交叉弹性设为0.3结果仿真出来24h电负荷出现多处跳变甚至负荷在某时段降到接近0。原因是线性响应模型没有限制负荷变化范围当电价波动幅度大时负荷变化量也很大。解决办法是在约束里加入负荷调整比例限制比如-P_max_shift P_load(t) - P_base(t) P_max_shift同时把价格弹性的计算改为相对基准价差而不是绝对价格差。更稳妥的做法是直接用价格型需求响应的标准模型即用价格弹性矩阵并保证矩阵对角占优。交叉弹性如果设置不当可能出现负荷转移总量不平衡导致系统功率失衡。我建议先只用自弹性跑通再加交叉弹性每加一组参数都要观察结果的合理性。5.3 求解器数值问题大数与小数的共处IES模型里存在量级差异极大的参数购电费用可能是10^4量级碳势可能是0.x量级弹性系数可能是10^-1量级。Yalmip建模时变量之间的系数相差过大Gurobi容易报数值警告甚至出现“Infeasible or unbounded”等莫名其妙的结果。解决方法是做标幺化或归一化。把所有价格、碳排放量、功率都除以各自的基准值。简单做法是在参数定义阶段设置一个基准功率比如100kW和基准价格所有量和对应的基准值做除法。这样目标函数各项的系数都在1附近求解器收敛快很多。还有一个技巧避免在约束里出现过大的Big-M值。如果要用Big-M表示逻辑约束M不要取10^6取求解变量可能达到的最大值的1.2倍即可比如1000。过大的M会引入数值病态。5.4 代码运行时间的优化IES调度一个典型算例变量数量大约几千个其中0-1变量可能有几十到几百个。Gurobi一般几秒到几分钟能解完。如果你的代码跑得很慢先检查是不是用了大量for循环。在Matlab里Yalmip的约束定义如果放在循环里每次循环都会增加一个约束内部会自动处理但循环次数多时依然有开销。我常用的优化手段是向量化。比如Constraints [Constraints, P_generator P_min : P_generator P_max];如果P_generator是24维变量这条约束就一次性定义了24时段的下限。不要写成for t1:24 Constraints [Constraints, P_generator(t) P_min]; end后者虽然也没错但代码更冗长且调试时不易发现维度错误。还有一个点是尽量少用非线性函数比如min、max、absYalmip本身支持但会引入额外变量。如果确实需要可以用线性化的辅助变量和不等式表达。6. 关于“EI复现”的一些大实话6.1 复现不等于抄代码现在很多人在网上找论文复现代码直接下载运行出几张图就觉得完成了。这不是复现是“尝鲜”。真正的复现应该是你拿到论文从数学模型开始自己在Matlab里把目标函数、约束条件、求解流程一步步搭起来再对照论文结果验证正确性。这个过程会遇到很多论文里根本没写的细节——比如参数怎么设置、碳势迭代怎么收敛、0-1变量怎么处理——而这些细节恰恰是最有价值的经验。我在复现这篇碳势-价格双响应调度模型时光碳势迭代和负荷响应的耦合就调了两天。如果把这份代码发到GitHub别人直接跑可能一次就出结果但他永远不知道迭代不收敛时该怎么调。复现的意义在于踩坑而不是跑通。6.2 如何把复现经验转化为自己的创新点复现完一篇EI你可以把它当基线然后做三件事改模型、改算法、改场景。改模型比如把原来的线性碳势计算改成动态碳势或者纳入碳捕集设备改算法比如用改进粒子群代替商业求解器但注意要和原模型对比性能改场景比如从单个园区IES扩展到多园区或者加入电动汽车、绿氢等新元素。改完之后你的工作就有了增量。但提醒一句不要为了创新而创新。IES调度方向论文已经很多想发上好期刊要在“双响应”机制本身做更深的理论分析比如证明解的存在性、分析信号的时滞影响、或者从博弈论角度看碳势与价格信号的主从关系。6.3 给准备做IES调度研究的朋友的建议如果你刚开始做这个方向我建议先不要碰复杂的论文先找一篇结构清晰的、有公开数据的IES调度论文用MatlabYalmip把它复现出来。不懂MILP就先学线性规划不懂碳排放流就先把电碳流看懂。优先级是先会跑通模型再理解模型再改进模型。另外数据管理非常重要。你必须建立一个电子表格记录所有论文里的参数并标注来源论文表格、参考文献、自己假设。因为调度模型的参数太多一旦遗失某个效率值或弹性系数结果可能完全对不上。给自己留一个参数清单文档比代码注释更重要。最后不要迷信“顶级EI复现”这种标签。EI会议论文质量参差不齐有些代码里的错误连作者自己都没发现。复现时保持批判性如果结果和论文不一致先检查你的代码再检查论文逻辑很可能能找到论文里的疏漏。我这次复现时就发现论文里一个公式的下标范围写得模糊实际推敲之后做了合理修正最终结果反而比原论文更顺。这种经验才是复现工作里最值钱的部分。
返回列表