ARTICLE DETAIL

资讯详情

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

基于ADMM的多微网电能交互优化与碳排放约束实现

基于ADMM的多微网电能交互优化与碳排放约束实现 1. 为什么要用ADMM解决多微网电能交互问题先说结论多微网电能交互本质上是一个多主体参与的分布式资源优化问题而ADMM交替方向乘子法恰好是处理这类问题的经典数学工具。我在实际跑完整个Matlab实现后最深的体会是——选对求解框架比调参本身更重要。1.1 多微网交互问题的核心矛盾传统电力系统是大电网集中调度一个调度中心说了算。但多微网场景完全不同每个微网都有自己的光伏、风电、储能和负荷它们之间既想互相买卖电能又不想把自己的运行数据全盘托出。这种“既要协作又要隐私”的矛盾决定了问题不能用一个集中式模型硬解。举一个我在仿真里反复遇到的例子微网A午间光伏大发余电想卖给微网B微网B晚间负荷高峰需要买电补充。如果让一个中心节点收集所有微网的负荷、出力、储能SOC数据再统一求解理论上能得到全局最优但实际中没有任何一个微网愿意把自己的完整运行曲线交给别人——这涉及到运营隐私和商业利益。ADMM的价值正好在这里体现它把全局问题拆成各个微网自己的子问题各微网内部求解自己的优化模型只交换“联络线功率”这个边界变量迭代若干轮后收敛到一致解。这个过程中各微网的核心数据如储能容量、负荷特性不需要暴露。1.2 碳排放约束为什么让问题更复杂现在的微网优化不能只盯着经济性。政策要求碳排放约束这就让目标函数从单一的成本最小化变成了经济性碳排的综合优化。我在模型中给每个微网设置了碳排放配额发电单元分为两类一类是光伏、风电这类零碳电源一类是微型燃气轮机这类低碳但仍有排放的电源。当微网本地清洁能源不足时除了从大电网购电还可以从其他微网购电——这相当于在“买电成本”和“碳排成本”之间做权衡。问题复杂在碳排放约束让微网之间的交互电价不再只是市场供需的产物还要体现碳成本的传导。一个微网如果自己碳排放超标它有两种选择一是增加从清洁微网购电的比例二是接受惩罚。这两种选择都会改变交互功率的博弈结果。ADMM的分散式迭代恰好能处理这种耦合约束下的协商过程。1.3 为什么选ADMM而不是其他分布式算法很多人会问分布式优化还有对偶分解、交替方向法、增广拉格朗日法为什么偏偏用ADMM对比我实际测试过的几种方法算法收敛速度通信负担实现难度适用场景对偶分解较慢需要严格凸需同步梯度信息低凸问题增广拉格朗日法较快需要全局耦合变量中小规模集中式ADMM适中通常几十轮迭代仅交换边界变量中大规模分布式ADMM最大的优势是分解性它的迭代更新天然分成“各微网本地求解”和“全局变量协调”两个层次。每个微网的子问题可以独立并行计算这个特性在多微网场景中简直就是量身定做的。另外ADMM对目标函数的凸性要求没有对偶分解那么严格目标函数中包含储能SOC这类动态约束时处理起来也更灵活。我实际跑下来典型的三微网系统大概需要30到80轮迭代收敛这个速度完全能满足日前调度的计算需求。2. 模型构建多微网系统的数学表达这一节是整个实现的基础。模型建对了后面ADMM套上去就是水到渠成模型建得含糊后面调参与排错会非常痛苦。我的建议是先不急着写代码把数学表达式在纸上理清楚。2.1 系统结构与基础假设我搭建的多微网系统包含三个微网MG1、MG2、MG3它们通过一条公共联络线连接同时各自通过变压器与大电网相连。每个微网内部包含可再生能源光伏风电输出功率为预测值不可调度微型燃气轮机可调度有出力上下限和爬坡约束储能系统可充可放有SOC上下限和充放电功率约束本地负荷为已知预测值系统运行周期为24小时单位调度间隔为1小时。在这个时间尺度下微型燃气轮机的启停时间常数可以忽略储能响应完全来得及所以模型不用考虑秒级动态过程。需要特别说明的是为了保证ADMM的收敛性我在模型中只考虑有功功率交互忽略无功功率和电压约束。这是目前多微网分布式优化研究的常见假设——焦点在能量管理层面而非电力系统稳态分析层面。如果后续要扩展可以把ADMM内嵌到最优潮流计算中但那完全是另一个量级的复杂度。2.2 目标函数经济性与碳排放的统一每个微网的目标函数包含三个部分购电成本或售电收益、燃气轮机发电成本、碳排放成本。第一项是微网与大电网交互的成本从大电网购电为正向大电网售电为负。这里的关键是电价采用分时电价我在仿真中设置了峰、平、谷三个时段的电价峰时段1.5元/kWh平时段1.0元/kWh谷时段0.6元/kWh。第二项是微型燃气轮机的发电成本。由于燃气轮机的效率曲线接近线性我用二次函数来逼近其成本特性$$C_{MT}(P_{MT}) a \cdot P_{MT}^2 b \cdot P_{MT} c$$实测中二次项系数a取0.02左右时能较好地反映机组在低负荷率时效率下降的特性。这些系数通常由设备厂商提供或通过历史运行数据拟合得到。第三项是碳排放成本。我采用碳排放配额机制每个微网在调度周期内有固定的碳排放配额实际排放量来自燃气轮机和从大电网购电对应的间接排放如果超出配额则需要按碳价格购买碳排放权。综合三个部分每个微网的目标函数为$$\min \sum_{t1}^{24} [C_{buy}(t) C_{MT}(t) C_{carbon}(t)]$$这三个部分放在同一个目标函数里看起来简单但实际代码中每个部分都需要单独处理——分时电价是分段常数函数发电成本是二次函数碳成本是带条件判断的函数。在Matlab中我建议用函数句柄把这三个部分分别定义最后在目标函数中相加这样可以大幅减少调试时的定位难度。2.3 约束条件功率平衡与运行边界约束条件是多微网优化模型中“水最深”的部分。约束写多了问题不可行约束写少了结果不符合实际。我踩过不少坑下面逐条说明。功率平衡约束是每个微网在每个时刻都必须满足的光伏出力 风电出力 燃气轮机出力 储能放电功率 从其他微网购电功率 从大网购电功率 负荷 储能充电功率 向其他微网售电功率 向大网售电功率这个约束在ADMM分解中会被“松弛”掉一部分——各微网内部的功率平衡由本地求解器保证微网间的功率交互由ADMM迭代调节。这也是ADMM能工作的关键每个微网内部是一个独立可行的优化问题只是边界变量需要协商。储能约束包括SOC上下限约束SOC_min ≤ SOC(t) ≤ SOC_max充放电功率界限约束SOC动态方程SOC(t1) SOC(t) η_c * P_ch(t) - P_dis(t)/η_d这里有一个容易出错的地方充放电效率。我之前在代码中曾经把η_c和η_d都当成常数放在SOC方程里后来发现这会引入数值误差——因为η_c通常接近0.95η_d也接近0.95如果乘以两次效率储能的实际吞吐能力会显著下降。更合理的做法是引入充放电状态变量或者采用“储能虚拟SOC”模型。燃气轮机约束包括出力上下限P_MT_min ≤ P_MT(t) ≤ P_MT_max爬坡约束|P_MT(t) - P_MT(t-1)| ≤ Ramp联络线功率约束各微网之间的交互功率不能超过联络线容量。这一条在多微网问题中至关重要——如果没有这条约束ADMM在迭代中可能出现较大的交换功率值实际中却根本传输不了。建议联络线容量设置得比峰值负荷略大一些比如1.2倍。碳排放约束全周期碳排放量 ≤ 碳排放配额。这是一个跨时段约束用一个总排放下限加总到24小时即可但要注意在ADMM分解后这个约束必须留在子问题内部求解不能拆分到全局协调器否则子问题之间会失去独立性。3. ADMM算法设计从数学推导到代码拆解理论模型搭好了接下来就是把ADMM套上去。这一部分我准备详细讲讲数学推导和代码框架的对应关系因为很多人在这里迷失——看论文推导很顺但一到写代码就不知道哪个变量是更新的哪个是固定的。3.1 ADMM标准形式的转化ADMM的标准形式是求解如下问题$$\min f(x) g(z) \quad \text{s.t.} \quad Ax Bz c$$在多微网场景中x表示各微网的本地决策变量出力、储能、交互功率z表示全局协调变量各微网交互功率的一致解。约束条件AxBzc说的是微网间交互功率在本地视角和全局视角必须一致。我最初看这个转化也觉得抽象后来用一个具体例子就懂了微网1和微网2之间的交互功率微网1的模型里记为P_12售出为正微网2的模型里记为P_21购入为正两者符号相反但绝对值相等。ADMM引入全局变量z_12后要求P_12 z_12且P_21 -z_12这就是AxBzc的具体形态。在这个转化中增广拉格朗日函数为$$L_ρ(x, z, λ) f(x) g(z) λ^T(Ax Bz - c) (ρ/2) |Ax Bz - c|^2$$ρ是惩罚参数λ是拉格朗日乘子。ADMM的迭代更新分为三步x更新固定z和λ最小化L_ρ关于x的目标z更新固定x和λ最小化L_ρ关于z的目标λ更新λ_{k1} λ_k ρ(Ax_{k1} Bz_{k1} - c)在这个迭代过程中x更新是各微网并行求解自己的子问题z更新通常会有一个解析解λ更新则直接按公式计算。这三步是ADMM的灵魂代码框架就是围绕这三步搭建的。3.2 Matlab代码框架与核心函数我整个代码分成四个文件主程序、微网子问题求解器、全局变量更新器、数据准备脚本。下面用伪代码描述核心逻辑% 主程序ADMM迭代求解 clear; clc; %% 加载系统数据 load_system_data(); % 加载负荷、光伏、风电、电价等 %% 初始化 P_net zeros(3, 24); % 微网与大电网交互功率 P_exchange zeros(3, 3, 24); % 微网间交互功率 z zeros(3, 3, 24); % 全局变量 lambda zeros(3, 3, 24); % 拉格朗日乘子 rho 0.1; % 惩罚参数 max_iter 100; tol 1e-4; %% ADMM迭代 for k 1:max_iter % 第一步各微网并行求解本地子问题 for i 1:3 [P_exchange(i,:,:), P_net(i,:), P_mt(i,:), P_ess(i,:),...] solve_microgrid_subproblem(i, z, lambda, rho, system_data); end % 第二步更新全局变量z for i 1:3 for j i1:3 z(i,j,:) (P_exchange(i,j,:) - P_exchange(j,i,:)) / 2; z(j,i,:) -z(i,j,:); end end % 第三步更新拉格朗日乘子 for i 1:3 for j i1:3 lambda(i,j,:) lambda(i,j,:) rho * (P_exchange(i,j,:) - z(i,j,:)); lambda(j,i,:) lambda(j,i,:) rho * (P_exchange(j,i,:) - z(j,i,:)); end end % 计算原始残差和对偶残差 r_prim compute_primal_residual(P_exchange, z); r_dual compute_dual_residual(z, z_prev); if r_prim tol r_dual tol break; end end这段代码看起来简单但实际开发中最容易出错的地方是索引混乱。P_exchange是一个三维数组第一维是送端微网第二维是受端微网第三维是时段。在全局变量更新时z(i,j)和z(j,i)是负相关关系这个符号问题一旦搞错整个迭代就会发散。我在调试时采用了一个非常有效的技巧把迭代过程中每个微网的P_exchange单独保存到一个矩阵里每轮迭代后打印出来看数值变化。如果出现正负交替震荡多半是符号问题如果数值缓慢漂移多半是惩罚参数ρ设置不合理。3.3 子问题求解器的内部实现子问题求解器是整个代码中计算量最大的部分。每个微网的子问题是一个带有功率平衡、储能、燃气轮机、碳排放约束的线性/二次规划问题。我选择用Matlab的quadprog函数求解子问题。之所以用quadprog而不是linprog是因为目标函数中包含燃气轮机的二次发电成本项用linprog需要分段线性化会引入额外误差。function [P_exchange, P_net, P_mt, P_ess, status] ... solve_microgrid_subproblem(i, z, lambda, rho, data) % 构建决策变量向量 % 决策变量: [P_mt(1:24), P_dis(1:24), P_ch(1:24), SOC(1:24), ... % P_net(1:24), P_ex_to_others(1:24)] % 目标函数系数 H zeros(120, 120); % 二次项系数矩阵 f zeros(120, 1); % 一次项系数向量 % 发电成本 H(1:24, 1:24) 2 * 0.02 * eye(24); f(1:24) 0.35 * ones(24, 1); % 大电网购电成本分时电价 for t 1:24 f(24*4 t) data.electricity_price(t); end % 碳排放成本 % 这里通过罚函数方式处理将碳排放超配额部分加入目标 % ADMM交互项 % 关键是这一项把z和lambda引入目标函数 for t 1:24 % 交互功率与全局变量偏差的惩罚项 f(24*5 t) f(24*5 t) - rho * z(i, :, t) - lambda(i, :, t); end % 约束条件 Aeq []; beq []; A []; b []; % 功率平衡约束 % ... 构造Aeq % 储能约束 % ... 构造A和b % 调用quadprog options optimoptions(quadprog, Display, off); [x, fval, exitflag] quadprog(H, f, A, b, Aeq, beq, lb, ub, x0, options); end这里有两个细节需要特别注意。第一个是ADMM交互项的符号。在子问题目标函数中交互功率的系数中要包含 -rho*z - lambda 这一项其中z是全局变量lambda是拉格朗日乘子。如果符号搞反迭代一定会发散。第二个是quadprog的数值稳定性。多微网问题中每个变量数量级差异很大——功率是MW级别SOC是0到1之间的小数电价和成本是元/kWh级别。如果不做归一化quadprog的求解精度会受到影响。我在实际代码中对所有变量做了归一化处理把功率基值设为100kW成本基值设为1元SOC保持原值这样求解器的数值稳定性明显提升。4. 碳排放核算与惩罚机制的建模细节碳排放部分是很多论文和代码中一笔带过、但实际做起来非常繁琐的地方。如果只是简单地在目标函数中加一个碳价格乘以总排放量那跟没加几乎没区别——因为碳价格只是改变了边际成本并不会真正限制排放总量。我采用的配额超排惩罚机制效果要明显得多。4.1 排放源的分类与计算方法在多微网系统中碳排放来源于两个渠道第一个是燃气轮机发电的直接排放。这个计算相对直接燃气轮机的燃料消耗量乘以排放因子。在我的模型中用单位发电量的碳排放系数来表示——典型天然气分布式能源的碳排放强度约为0.2 kg CO2/kWh。在代码中我设置了一个向量carbon_coef_mt长度为24每个元素都是0.2。第二个是大电网购电的间接排放。这个很多人容易忽略——从大电网购电电力的生产端有碳排放这部分应按大电网平均碳排放强度分摊到用户侧。由于不同地区电网的碳排放强度差异很大我参考了国内公开数据设置为0.7 kg CO2/kWh。需要说明的是这个系数会直接影响微网之间的交互策略——如果本地燃气轮机碳排强度低于大电网购电碳排强度微网会更倾向于自发电而不是从大网购电。4.2 配额与惩罚机制的设计碳排放配额机制的设计如下每个微网在调度周期24小时内有固定的碳排放配额E_quota。实际排放量E_actual如果超过配额则需要按碳价购买碳排放权这一部分计入成本如果在配额以内则可以按一定的价格出售盈余配额。在数学表达上这个机制可以通过如下方式建模$$C_{carbon} P_{carbon} \cdot \max(0, E_{actual} - E_{quota})$$这里的max运算符让目标函数变成了分段函数。如果用quadprog直接求解max运算符会引入非光滑性这在Matlab优化工具箱中不好直接处理。我的做法是引入一个辅助变量E_penalty并加入约束E_penalty ≥ E_actual - E_quota和E_penalty ≥ 0然后把碳成本改写为P_carbon * E_penalty。这是线性规划中处理分段惩罚的标准技巧。得益于这个改造碳排放成本项仍然是线性函数不会破坏整个问题的凸性和可解性。在调试过程中可以验证如果没有这个改造直接用max函数quadprog会报错或收敛异常。4.3 碳排放约束对交互策略的影响分析从仿真结果看碳排放约束的引入显著改变了微网间的交互行为。我设计了三组对比场景场景一无碳排放约束目标函数只包含经济成本。此时微网之间的交互完全由电价的供需关系决定储能主要做峰谷套利。场景二碳排放配额宽松配额定为无约束排放的1.2倍。这种情况下碳排放约束不起作用求解结果与场景一基本一致。场景三碳排放配额严格配额定为无约束排放的0.8倍。此时微网之间的交互行为发生明显变化——高排放的微网会主动增加从清洁微网购电的比例即使在电价上没有优势但碳排放成本的节省会弥补电价的损失。这个结果的工程启示是如果要在政策层面推动微网间的清洁能源共享单纯靠电价信号可能效果有限必须配合碳排放约束这一“硬约束”。这也是我这篇文章标题中“计及碳排放”的核心价值所在。不过这里要提醒一句碳排放配额设得太紧子问题可能不可行。比如某微网的本地负荷很大、光伏出力很小自身发电必须依赖燃气轮机此时如果配额过低子问题会在功率平衡和碳排放约束之间产生冲突。我的处理办法是允许微网从大网购电的部分不承担碳配额责任因为这部分排放由大电网承担否则模型会无解。5. 仿真结果分析与参数调优实战仿真结果是检验模型和算法正确性的试金石。这一节我分享实际跑出来的代表性结果以及我在调参过程中总结出来的一些可操作经验。5.1 收敛性验证与迭代过程分析ADMM能否收敛第一眼看的是残差曲线。在我的三微网系统中初始ρ设为0.1时原始残差大约在40轮迭代后降到1e-4以下对偶残差收敛稍慢大约需要60轮。一个值得关注的现象是ρ的值直接决定了收敛速度和最终精度之间的权衡。ρ收敛轮数目标函数值说明0.01120偏差较大对偶残差收敛很慢0.1约60最优解的99.2%收敛速度和精度平衡0.5约30最优解的98.5%收敛快但精度略差1.0约20最优解的97%精度损失明显这个现象在ADMM理论中有一个解释ρ是增广拉格朗日惩罚项的权重ρ越大迭代越倾向于满足一致性约束但本地目标函数的优化程度就降低导致最终目标值偏差变大。实际使用时我建议用自适应ρ调整策略如果残差比超过10倍就把ρ加倍如果残差比小于0.1就把ρ减半。5.2 碳排放配额对系统运行结果的影响对比严格的碳配额与无配额两种场景最明显的差异在微网间的功率交互曲线。无配额时MG1光伏装机大在午间12点到14点的余电外送功率约为80kW主要卖给电价峰值期的MG3负荷高峰型微网。有严格碳配额时MG1的午间外送功率上升到110kW而且外送对象发生了变化——原本从MG2购电的时段现在改从MG1购电因为MG2的燃气轮机占比高、碳排强度大在碳配额约束下它的“清洁度”不足。同时储能系统的调度策略也发生变化无配额时储能倾向于在谷时段充电、峰时段放电做纯套利有配额时储能会在光伏大发时段多充电然后在晚间减少大网购电因为大网购电的间接碳排放强度较高。这些结果在工程上的启示是碳排放约束能有效促进微网间的清洁能源共享但也会增加系统整体的运行成本。在实际项目中需要根据政策导向在碳排放总量和系统经济性之间寻找平衡。5.3 基于实际调试经验的参数调整建议调参是ADMM落地过程中避不开的环节。我把自己踩过的坑和调试经验整理成几条基本可以覆盖大多数多微网场景第一从一个较小的ρ开始。我习惯从0.05或0.1开始先观察原始残差和对偶残差的比例。如果原始残差收敛太慢说明ρ太小需要增大如果对偶残差震荡说明ρ太大需要减小。第二迭代初期不要过早判断发散。ADMM在迭代前10轮可能出现目标函数值上下波动这属于正常现象。我曾经在迭代第8轮看到目标值突然升高就停了调试后来发现第15轮就恢复正常收敛白白浪费了调试时间。第三端到端验证时把三微网简化为单微网。具体做法是把其他微网的交互功率设为零只求解单个微网的优化问题看结果是否符合物理直觉。如果单微网结果正确再逐步开放微网间交互这样能快速定位是本地问题还是交互问题。第四注意数值尺度。如果系统的功率基准是MW级而成本基准是元/MWh级两者相差很大quadprog会产生数值问题。我建议把所有物理量归一化到同一数量级或者使用Matlab中的“Problem”结构体配合prob2struct进行更稳健的建模。6. 代码扩展与二次开发的思考跑通基础版本之后很多读者可能会问这套框架能不能扩展我的回答是可以而且扩展方向很明确。6.1 从三微网扩展到更多微网我的代码框架中子问题求解器是以微网索引i为参数的函数。要扩展到N个微网只需要改两部分一是数据准备脚本中增加微网数量N和相应的负荷/光伏/储能数据二是全局变量更新器中把双重循环的边界从3改成N。这里的计算复杂度增量是线性的——每个微网的子问题独立求解理论上可以并行计算在Matlab中可以用parfor替代for实现多核并行。6.2 从确定性模型扩展到不确定性模型目前模型假设光伏和负荷预测值是准确的这在日前调度中过于理想。扩展方向有两种一种是鲁棒优化把光伏出力和负荷分别建模为区间不确定集子问题变成鲁棒优化问题。ADMM框架本身不需要改动只需要替换子问题求解器——但要注意鲁棒优化通常会让问题变成非凸ADMM的收敛性需要重新验证。另一种是随机优化用场景法生成多个光伏/负荷场景子问题变成两阶段随机规划。这种做法与ADMM的兼容性较好因为场景只是在子问题内部增加约束和变量不改变全局一致性约束的结构。6.3 与深度强化学习的结合方向如果微网数量非常多比如50个以上ADMM每轮迭代需要求解50个子问题即使并行计算计算时间也可能无法满足实时调度需求。近年来有一些研究尝试用深度强化学习学习ADMM的迭代更新规律或者用图神经网络直接预测最优交互功率。不过我的建议是不要在没有充分掌握ADMM之前直接跳进DRL。ADMM的框架能够让你清晰地理解多主体协调的本质即使后续改用DRL这个理解也能帮助你设计奖励函数和状态空间。7. 完整运行流程与常见错误排查最后给一份可以直接照做的运行指南。这里我不讲理论纯粹说操作步骤以及我实际运行中遇到的典型报错。7.1 从零开始运行的完整步骤准备好Matlab R2020b以上版本确保安装了Optimization Toolbox。quadprog函数需要这个工具箱如果没有安装程序会在调用quadprog那行报“Undefined function quadprog”。创建项目目录结构项目根目录下放主程序main.m子文件夹data存放系统数据子文件夹solver存放子问题求解函数。数据准备创建负荷、光伏、风电的24小时序列数据。建议先用公开数据集如OpenEI的微网数据做测试跑通后替换成自己的数据。运行main.m观察ADMM迭代曲线。如果未收敛先调ρ再调max_iter和tol。结果可视化绘制各微网的功率平衡图、储能SOC曲线、微网间交互功率曲线、碳排放配额使用情况。7.2 五个高频报错及应对我把调试过程中遇到频率最高的五个问题列成一张表方便大家对照排查错误现象根因解决方案quadprog报“The problem is infeasible”约束过紧常见是碳排放配额设太低或联络线容量太小检查并放宽相关约束可先跑单微网验证可行性ADMM迭代不收敛目标值发散交互项符号错误或ρ设置不当检查子问题目标函数中交互项的符号调小ρ重新运行储能SOC出现负值SOC动态方程中放电效率处理错误检查η_d是否放在分母位置结果在某个时段出现跳变分时电价边界处连续性差在分时电价切换点增加虚拟时段或平滑处理运行时间过长子问题数量过多且串行求解使用parfor并行或减少调度间隔数7.3 从“能跑”到“可信”的验证思路很多同学跑通了程序但不知道结果是否合理就急着写论文。我建议做一个系统性的验证第一步把微网间交互功能关掉只运行单个微网的优化检查燃气轮机出力、储能充放电是否满足物理约束各时段功率平衡是否严格为零。第二步打开微网交互功能设置相同的电价和碳价看微网间交互功率的方向是否合理。比如负荷大致相同的微网之间不应该有大规模交互负荷时段互补的微网之间应该出现明显的交互峰谷。第三步与集中式优化的结果对比。用同样的模型和参数将所有微网的约束和目标合并成一个全局优化问题求解如果ADMM的结果与集中式结果偏差在2%以内说明算法实现正确。这个验证步骤非常关键能同时验证模型的正确性和ADMM收敛的质量。我在做第三步对比时发现ADMM的收敛目标值比集中式最优值略高原因是ADMM在迭代过程中对一致性约束加强制惩罚导致可行域略微收紧。这个偏差通常在1%到3%之间属于正常现象如果偏差超过5%就要检查代码了。整个项目从建模到代码实现再到结果分析我前后花了大约两周时间。最花时间的部分不是ADMM本身而是把碳排放约束、储能动态、分时电价这些现实因素嵌入到优化框架中。希望这份实践分享能帮你少走一些弯路。
返回列表