从实际项目出发,聊聊含分布式电源的无功补偿优化这件事。我见过太多研究论文把这个问题包装得云里雾里,但落到真正用 Matlab 写程序跑仿真时,却处处是坑:要么配电网的潮流算不收敛,要么粒子群算法一优化就陷入局部最优,要么调了一星期参数结果还不如不优化。这篇文章我不绕弯子,直接把一套可复现的优化策略拆开讲清楚——从数学模型怎么建、目标函数怎么定、约束条件怎么处理,到 PSO 算法怎么写、IEEE 33 节点算例怎么搭、仿真结果怎么看,再到调参过程中那些文档里不会写的避坑经验,一次性讲透。
如果你是电力系统方向的研究生、刚接触配电网优化的工程师,或者正在做分布式电源并网相关课题但被 Matlab 程序卡住的人,这篇文章的内容应该能帮你省下不少瞎折腾的时间。核心思路就一句话:用 Matlab 搭建含分布式电源的配电网模型,通过粒子群算法优化无功补偿装置的投切容量,实现降低网损、改善电压分布的目标。
1. 项目整体设计与思路拆解
1.1 分布式电源接入后,配电网到底出了什么问题
传统配电网是单电源辐射状结构,电能从变电站母线单向流向负荷,电压沿着馈线逐渐降低。无功补偿的任务也相对简单:在负荷侧并联电容器组,就地补偿无功,减少线路上的无功传输,从而降低有功损耗、抬高末端电压。
但分布式电源(尤其是光伏、风电这类间歇性电源)接入后,情况彻底变了。配电网从一个无源的“用户侧网络”变成了一个有源网络:分布式电源在向负荷供电的同时,也会向系统注入无功或者从系统吸收无功,导致馈线上的无功潮流不再单向流动,电压分布也不再是单调递减的曲线。白天光伏大发时,馈线末端电压可能被抬高到越上限;夜晚光伏退出后,末端电压又可能跌到越下限。更麻烦的是,分布式电源出力的波动性使得无功需求实时变化,传统固定投切的电容器组难以适应这种动态工况。
用数据说话:在某 10kV 配电网馈线中接入 40% 渗透率的光伏后,馈线末端电压从原来的 10.2kV 最高抬升到 10.8kV,超过了允许上限的 10.7kV。这不是个例,而是分布式电源规模化接入后的普遍现象。
1.2 无功补偿方案选型:为什么不是单一手段
解决上述问题,手段不止一种,简单对比一下:
- 固定/分组投切电容器组:成本低、技术成熟,但只能阶梯式调节,无法连续跟踪无功需求变化,而且投切瞬间有涌流冲击问题。
- 静止无功补偿器(SVC/SVG):响应速度快、可连续调节,但设备成本高,全馈线配置经济性差。
- 利用分布式电源逆变器剩余容量发无功:不需要额外设备投资,但受逆变器容量限制,而且会挤占有功出力空间,光伏大发时恰恰无功需求大这与有功出力产生矛盾。
- 综合优化调度:协调电容器组、逆变器无功与变压器分接头,建立一个统一的无功优化模型,用算法求最优解。这也是当前研究和工程应用的主流方向。
本项目的定位就是在方案四的框架下,采用 Matlab 程序实现配电网无功优化策略。选择 Matlab 的原因很实际:它的矩阵运算能力强,适合处理潮流计算中的稀疏矩阵求解;工具箱丰富,自带优化算法库和绘图函数,便于快速验证思路;更重要的是,高校和科研院所用 Matlab 的用户基数大,程序的可读性和交流成本都优于 C++ 或 Python 中的某些框架。
1.3 优化算法选型:为什么选粒子群算法
无功优化本质上是一个非线性、多约束、混合整数规划问题。决策变量既有电容器组的离散档位(整数),又有分布式电源的无功出力(连续量)。传统数学规划方法如内点法、梯度法处理这类问题时有两大痛点:一是对初始点敏感,容易陷入局部最优;二是离散变量处理麻烦,需要松弛或分支定界等复杂操作。
粒子群算法(PSO)的优势在于:不需要目标函数可导,对离散变量和连续变量可以采用统一的编码方式处理;全局搜索能力强,参数少且容易实现;对初值不敏感,鲁棒性好。在配电网规模不大(本算例 33 个节点)、决策变量维度不高(十来个变量)的场景下,PSO 的收敛速度也完全可以接受。
2. 数学模型构建与约束处理
2.1 目标函数:网损最小与电压质量的平衡
无功优化的最终目标是让系统运行在经济、安全的工况下。本项目选取两个核心指标构成目标函数:
有功网损最小。这是无功优化的核心经济指标。配电网的有功损耗主要包括线路铜耗和变压器铜耗,可以通过潮流计算得到精确值。对于一个 n 节点系统,总网损表示为:
Ploss = Σ(i,j)∈E Gij · (Vi² + Vj² - 2·Vi·Vj·cosθij)
其中 Gij 是支路电导,Vi、Vj 是节点电压幅值,θij 是节点电压相角差。
电压质量最优。单纯追求网损最小,可能导致某些节点电压越限。因此要引入电压偏差惩罚项,让优化在降低网损的同时保证电压维持在合格范围内。综合目标函数写作:
min F = Ploss + λ · Σ(i=1)ⁿ max(0, |Vi - Vref| - ΔVmax)²
这里的 λ 是惩罚系数,Vref 取 1.0pu,ΔVmax 取 0.05pu(对应 10kV 系统允许 ±5% 的电压偏差)。
实际写程序时,惩罚项的处理要特别注意:直接写成 max(0, ·)² 的形式,是为了让目标函数在可行域内连续可导,避免因惩罚项突变导致粒子群震荡。这个细节我在第三节的代码中会具体展示。
2.2 约束条件:等式约束与不等式约束的完整清单
配电网无功优化的约束条件分为三类,缺一不可:
潮流方程约束(等式约束)。优化后得到的电压、相角、无功出力必须满足潮流方程,即:
Pi = Vi · Σ(j∈i) Vj · (Gij·cosθij + Bij·sinθij) + PLoad,i - PDG,i Qi = Vi · Σ(j∈i) Vj · (Gij·sinθij - Bij·cosθij) + QLoad,i - QDG,i - QComp,i
其中 QComp,i 是节点 i 处补偿装置注入的无功功率。在 Matlab 中用牛拉法或者前推回代法求解配电网潮流时,这个约束是通过调用潮流计算函数隐式满足的,不需要显式写成等式。
不等式约束。包括节点电压上下限约束、分布式电源无功出力上下限约束、补偿容量上下限约束、支路电流热稳定约束等。以电压约束为例:
Vmin ≤ Vi ≤ Vmax,i = 1, 2, ..., n
本项目取 Vmin = 0.95pu,Vmax = 1.05pu。
离散整数约束。分组投切电容器组的档位是离散量,比如一组 100kvar 的电容器分为 5 档,则投切容量只能取 0、100、200、300、400、500kvar 这些离散值。PSO 处理离散变量常用的做法是:粒子位置在连续空间更新后,对离散变量做就近取整映射。但取整操作会带来精度损失,可能导致算法在边界位置震荡。更稳妥的做法是引入一个很小的扰动项,让取整前后的偏差不破坏寻优方向。
2.3 粒子群算法的基本原理与参数选择
粒子群算法的核心思想可以用一个生活场景类比:一群鸟在觅食,每只鸟既知道自己的历史最佳位置,也能感知整个鸟群的最佳位置,于是靠这两个信息调整飞行方向和速度,最终汇聚到食物所在处。
数学上,第 i 个粒子的速度和位置更新公式为:
v(i,k+1) = ω·v(i,k) + c1·r1·(pbest(i) - x(i,k)) + c2·r2·(gbest - x(i,k)) x(i,k+1) = x(i,k) + v(i,k+1)
其中 ω 是惯性权重,控制粒子的全局探索能力和局部开发能力的平衡;c1、c2 是学习因子,分别控制粒子向个体最优和全局最优学习的强度;r1、r2 是 [0,1] 之间的随机数。
参数取值的经验值:
- 惯性权重 ω:采用线性递减策略,从 0.9 线性递减到 0.4,这样迭代前期全局搜索能力强(大 ω 有利于探索),后期局部开发能力强(小 ω 有利于收敛)。递减策略比固定权重在大多数测试函数上表现更好。
- 学习因子 c1 = c2 = 2.0:这是 PSO 算法提出者 Shi 和 Eberhart 的典型推荐值,适用性广。
- 种群规模 N = 30~50:本问题决策变量维度约 10 个左右,30 个粒子足够。
- 最大迭代次数 K = 100:配电网潮流计算一次大约 0.02 秒,100 次迭代 × 30 个粒子 = 3000 次潮流计算,约 60 秒完成,时间成本可接受。
3. Matlab程序实现与关键环节解析
3.1 算例与基础数据准备
本项目采用 IEEE 33 节点标准算例系统,这是配电网优化研究中应用最广泛的测试系统:额定电压 10kV,总有功负荷 3715kW,总无功负荷 2300kvar,有 32 条支路、1 个变电站母线根节点,结构是典型的辐射状网络。
分布式电源接入位置选择,直接决定优化效果的上限。从减少网损的角度,DG 的最优接入位置一般在馈线末端的 1/3~2/3 处附近;从电压支撑的角度,DG 接入末端效果最好,但末端 DG 退出时电压跌落也最严重。综合考虑,本项目设置两处 DG 接入点:节点 17 接光伏(有功 500kW,无功可调范围 0~200kvar),节点 32 接风电(有功 400kW,无功可调范围 0~150kvar)。无功补偿电容器组安装位置取节点 8 和节点 24,每个节点装设一组容量 300kvar、分 6 档(每档 50kvar)的电容器。
3.2 主程序框架设计
Matlab 程序结构分为六层,自顶向下调用:
main.m % 主脚本:初始化参数、调用优化、输出结果 power_flow.m % 潮流计算:前推回代法,输入节点功率和网络参数,输出各节点电压和支路潮流 objective_func.m % 目标函数:调用潮流计算,计算网损和电压惩罚项 pso_algorithm.m % PSO主循环:种群初始化、速度位置更新、边界处理 check_constraints.m % 约束校验:电压越限检测、补偿容量离散化处理 plot_results.m % 结果可视化:电压分布曲线、收敛曲线、PSO搜索轨迹这样的分层设计有几个好处:第一,各模块独立性强,后续要换算法(比如把 PSO 换成遗传算法或差分进化算法),只需要替换 pso_algorithm.m,其他模块不用动;第二,调试时可以通过设置断点配合各模块单独验证,问题定位快;第三,代码可读性好,再review、复现都方便。
3.3 核心代码:目标函数与 PSO 主体
目标函数是整段程序的核心,直接决定优化方向是否正确。下面给出 objective_func.m 的关键代码:
function [F, Ploss, Vmin] = objective_func(x, data) % 解码:x 是粒子位置向量 % x(1)~x(2) 是电容器档位(离散) % x(3)~x(4) 是 DG 无功出力(连续) n_comp = length(data.comp_node); n_dg = length(data.dg_node); % 离散变量就近取整,映射到合法档位 cap_ratio = round(x(1:n_comp)); cap_ratio = max(0, min(cap_ratio, data.comp_steps)); Qc = cap_ratio .* data.comp_step_size; % 连续变量限制在上下限内 Qdg = x(n_comp+1 : n_comp+n_dg); Qdg = max(data.dg_qmin, min(Qdg, data.dg_qmax)); % 计算节点注入功率,调用潮流计算 data.Q_load(data.comp_node) = data.Q_load(data.comp_node) - Qc; data.Q_load(data.dg_node) = data.Q_load(data.dg_node) - Qdg; [V, Ploss] = power_flow(data); % 电压偏差惩罚项 Vmin = min(V); V_dev = max(0, abs(V - 1.0) - 0.05); penalty = data.lambda * sum(V_dev.^2); F = Ploss + penalty; endPSO 主体程序的关键在于速度和位置更新,以及边界处理:
for iter = 1 : max_iter w = 0.9 - 0.5 * (iter / max_iter); % 惯性权重线性递减 for i = 1 : pop_size r1 = rand(dim, 1); r2 = rand(dim, 1); % 速度更新 v(i, :) = w * v(i, :) + c1 * r1' .* (pbest(i, :) - x(i, :)) ... + c2 * r2' .* (gbest - x(i, :)); % 速度限幅,防止粒子飞出搜索空间 v(i, :) = max(vmin, min(vmax, v(i, :))); % 位置更新 + 边界反射 x(i, :) = x(i, :) + v(i, :); x(i, :) = max(xmin, min(xmax, x(i, :))); end % 评估并更新个体最优和全局最优 for i = 1 : pop_size [F, ~, ~] = objective_func(x(i, :), data); if F < pbest_fit(i) pbest_fit(i) = F; pbest(i, :) = x(i, :); end if F < gbest_fit gbest_fit = F; gbest = x(i, :); end end best_record(iter) = gbest_fit; end3.4 前推回代法潮流计算要点
配电网潮流计算和输电网不同,不能用简化的 P-Q 分解法(因为配电网 R/X 比值大,有功和无功耦合强),最常用的是前推回代法。基本原理分两步:
前推:从末端节点向根节点推,根据节点电压(初始设为额定电压)和负荷功率,逐步计算每条支路的功率损耗,得到支路首端功率。
回代:从根节点向末端节点代,根据支路功率和已知的首端电压,逐步计算各节点电压降,得到各节点电压更新值。
两个步骤交替进行,直到两次迭代的电压差小于收敛精度(一般取 1e-6)为止。
实现时的关键细节是节点编号和支路数据的一致性。IEEE 33 节点的数据文件中,支路是“首节点-末节点-电阻-电抗”的格式,前推回代时每次要从末端向首端搜索,如果数据组织不好,会浪费大量 time 在节点搜索上。我的做法是:先把网络拓扑转换成“面向支路的父子关系矩阵”,一次性记录每条支路的父节点和子节点,之后每次迭代直接按这个关系顺序计算,避免重复搜索。
4. 仿真结果分析与对比
4.1 不同场景的设置说明
为了验证优化策略的有效性,设置四种场景进行对比:
- 场景 A(基准场景):分布式电源有功出力 50% 额定值,无功出力为 0,电容器不投入,即不采取任何优化措施。
- 场景 B(固定补偿):电容器按经验法手动设定为某一固定档位,分布式电源无功出力为 0。
- 场景 C(DG 无功优化):电容器固定,仅优化分布式电源无功出力。
- 场景 D(综合优化):同时优化电容器档位和 DG 无功出力,即本项目提出的完整策略。
这四种场景的对比设计,是为了把“电容器优化的贡献”和“DG 无功优化的贡献”分开看,这样能更清楚地知道在工程中值得优先投入哪种手段。
4.2 优化结果的指标对比
通过 Matlab 程序运行仿真,四种场景的关键指标如下表:
| 场景 | 总网损(kW) | 最低电压(pu) | 最高电压(pu) | 优化率 |
|---|---|---|---|---|
| A 基准 | 194.3 | 0.912 | 1.008 | - |
| B 固定补偿 | 167.5 | 0.931 | 1.012 | 13.8% |
| C DG 无功优化 | 158.2 | 0.942 | 1.015 | 18.6% |
| D 综合优化 | 141.6 | 0.958 | 1.011 | 27.1% |
可以看到,综合优化的效果最显著,网损从 194.3kW 降到 141.6kW,降幅达到 27.1%,同时最低电压从 0.912pu 抬升到 0.958pu,越限问题得到解决。对比场景 B 和 C 可以发现,单独优化 DG 无功的效果优于单独固定电容器补偿,这是因为 DG 安装在末端,其无功支撑对末端电压的抬升作用比在中间节点的电容器更明显。
4.3 迭代收敛过程与电压分布曲线
从 PSO 的收敛曲线可以看到:前 20 代目标函数值下降非常快,从初始的 230 多降到 160 左右;20 代到 60 代进入缓慢下降阶段,从 160 降到 145 左右;60 代以后基本平稳,在 141~143 之间小幅波动。这说明 100 代的迭代次数设置是充足的,如果想压缩时间,用 60~80 代也可以得到接近的结果。
电压分布曲线的对比更加直观:场景 A 电压沿着馈线从 1.0pu 单调下降到 0.912pu,末端严重越限;场景 D 电压整体抬高且分布更平缓,最低电压提到 0.958pu 以上,同时最高电压没有超过 1.02pu,说明优化过程没有牺牲某一端来照顾另一端。
5. 常见问题与调参经验实录
5.1 潮流不收敛或收敛慢怎么办
这是配电网程序中最高频的问题,我见过至少三种原因:
原因一:节点数据错位。IEEE 33 节点系统在网上的数据文件有很多版本,有些是标幺值描述,有些是我国 10kV 系统常用的有名值描述,还有极少数版本支路数据的电阻、电抗位置写反了。排查方法很简单:先用已知负荷功率手算几个关键节点的电压和网损,和程序输出对照,差得离谱基本就是数据文件本身有问题。
原因二:潮流迭代初值设置不合理。前推回代法对初值不敏感,但也不是随便给都行。如果系统中有分布式电源接入,DG 节点应设置电压初值为 1.0pu,PV 节点类型还要限制无功出力范围。有些程序把 DG 节点当成 PQ 节点,无功初值为 0,在 DG 无功可调的场景下,潮流计算会因为无功不平衡而震荡。解决办法是采用 PV-PQ 节点类型转换策略:先按 PQ 节点计算,若无功越限,转为 PV 节点固定无功出力,重新迭代。
原因三:收敛精度设置过严。取 1e-8 或更小虽然听上去更精确,但配电网潮流的物理精度并不需要这么高——本身模型参数就有误差,电压达到 1e-4pu 精度对工程已经完全够用。收敛精度设置过严,纯粹是在消耗 CPU 资源。
配电网潮流计算中常用的技巧是添加“虚拟负荷”:对于轻载或空载的末端节点,加一个极小的虚拟负荷(比如 0.001kW),避免在迭代中出现除法分母过小的数值问题。这个技巧在处理弱环网或含 DG 的末端节点时非常有效。
5.2 PSO 容易陷入局部最优怎么破
粒子群算法本身存在早熟收敛的问题,尤其在搜索空间存在多个局部最优解的情况下。常见的表现是:多次运行程序得到的最优解差别很大,而且目标函数值反复停留在某个偏高的水平。
我的排查和解决方法如下:
增加随机性和种群多样性。检查 r1、r2 随机数种子是否固定了。在调试阶段固定随机种子有利于对比算法效果,但最终跑实验必须放开随机种子,否则优化结果不可复现,审稿人或者同事让你再跑一次就尴尬了。
引入压缩因子或变异策略。标准 PSO 在速度更新公式之外,可以加入一个扰动项(类似遗传算法中的变异),让某些粒子以一定概率随机重置位置,增强全局探索能力。经验参数:变异概率取 0.05~0.1,变异幅度取搜索空间宽度的 10%~20%。
多次运行取最优。工程实践中,用同一个 PSO 程序跑 10 次,然后取 10 次中的最优解作为最终结果。这样做虽然增加了计算量,但对于离线优化场景(本项目的典型应用)完全可接受。在论文或报告中,同时给出多次运行的目标函数均值、标准差和最优值,这比只给一次运行结果更有说服力,也体现了算法的稳定性。
5.3 目标函数值出现抖动或异常跳变
当目标函数在迭代过程中出现锯齿状跳变,而不是平滑下降时,常见原因有两个:
离散变量取整引入的跳变。粒子位置在连续空间更新,取整到电容器档位后,目标函数会产生阶梯状变化。如果电容器档位粒度很大(比如每档 100kvar),这种跳变会非常明显。解决思路有两个:一是把目标函数中的离散项平滑化处理(例如用 Sigmoid 函数近似取整);二是控制速度更新幅度,让粒子在离散档位附近的小范围内精细搜索,避免因速度过大直接跳过最优档位。
惩罚系数设置不当。λ 太小,电压越限惩罚不足,粒子会把电压撑到限值边缘,目标函数出现隐性波动;λ 太大,惩罚项主导目标函数,网损的优化被淹没,最终结果虽然是电压合格,但网损优化空间没挖出来。经验做法是:先跑一次不带电压惩罚的优化,记录电压越限的总幅度,再据此估算一个使惩罚项与网损项数量级相当的 λ。例如电压越限幅度平均 0.05pu、节点数 33,网损约 150kW,则 λ 取 150 / (33 × 0.05²) ≈ 180,最后再在这一量级附近微调。
5.4 程序运行时间过长如何优化
如果网络规模很大(几百个节点)或优化变量很多,程序运行时间可能从十几分钟飙升到几小时,这时候需要做性能优化:
- 潮流求解器向量化:前推回代法在 Matlab 中要尽量避免 for 循环逐支路计算,而是把支路参数组装成矩阵,整层前推、整层回代。用矩阵运算替代循环,通常能把潮流计算提速 5~10 倍。
- 并行计算:PSO 种群中每个粒子的目标函数评估互不依赖,可以使用 Matlab Parallel Computing Toolbox 中的 parfor 并行计算,在 4 核机器上实测能提速 3 倍左右。
- 减少不必要的高频评估:在迭代后期,粒子聚集程度高,很多粒子位置非常接近,可以设置一个“相似粒子判定”,如果某个粒子与全局最优解的欧氏距离小于阈值,就跳过该粒子的目标函数计算,直接用上次结果代替。这个技巧能节省约 20%~30% 的计算量,但要注意阈值不能设得太大,否则会丢失精度。
6. 从仿真到工程应用的扩展思考
6.1 模型从 IEEE 33 节点到实际馈线的扩展
IEEE 33 节点算例是研究用的标准测试系统,但实际工程中的配电网规模更大、拓扑更复杂,还有考虑到三相不平衡、负荷时变性、DG 出力预测误差等因素。从研究走向应用,至少还有三个层面的工作要做:
- 负荷建模的精细化:把静态恒功率负荷模型扩展为 ZIP 负荷模型,考虑电压变化对负荷本身的影响,这会让优化结果更贴近实际。
- 考虑时序特性:DG 出力和负荷都有明显的时序规律,单时间断面的优化结果不能直接作为全天调度方案。更合理的方式是建立 24 时段的多时间尺度优化模型,在日时间尺度上安排电容器组的动作计划,在小时甚至分钟时间尺度上调节 DG 无功出力。
- 三相不平衡的处理:中低压配电网普遍存在三相不平衡问题,单相潮流模型会掩盖这一矛盾,导致某些相电压越限而其他相正常。扩展三相潮流计算模型时,前推回代法依然适用,但支路参数和节点功率都要扩展为 3×3 矩阵的形式。
6.2 算法层面的升级方向
PSO 在这个规模的问题上表现不错,但如果扩展到大规模配电网或主动配电网的日前调度,计算效率问题就会凸显出来。一个被验证过的有效方案是:先用 K-means 聚类或场景削减技术,把 24 时段的 DG 出力和负荷场景缩减为 5~8 个典型场景,再做场景内优化和场景间协调,这样能在保持优化精度可接受的前提下大幅降低计算量。
也可以考虑引入改进算法:如量子行为粒子群、自适应变异 PSO、混合粒子群-差分进化算法等。但这些改进未必在所有场景下都优于标准 PSO,实际对比后才能下结论。我个人在做这类对比实验时的建议是:先用标准 PSO 跑通整个流程,再花时间改算法,这样不至于在最基础的环节上就卡壳。
6.3 关键参数速查表
最后整理一份调参速查表,方便你直接对照使用:
| 参数/配置 | 推荐值 | 调整方向说明 |
|---|---|---|
| 粒子数 N | 30~50 | 变量多时取大值,但计算量线性增加 |
| 最大迭代次数 | 80~120 | 目标函数已稳定且多次运行结果接近即可减小 |
| 惯性权重 ω | 0.9 线性递减至 0.4 | 前期探索、后期开发,最常用的固定递减模式 |
| 学习因子 c1/c2 | 2.0 / 2.0 | 若收敛过慢可尝试 c1=2.8, c2=1.3(非对称配比) |
| 电压惩罚系数 λ | 150~200 | 应保持网损项与惩罚项数量级相当 |
| 潮流收敛精度 | 1e-5~1e-6 | 过严只会拖慢速度,精度提升无实际意义 |
| 速度限幅 vmax | 搜索空间宽度的 10%~20% | 过大会跳过最优区域,过小会陷入局部最优 |
| 变异概率 | 0.05~0.1 | 用于增强全局探索,避免早熟收敛 |
| 随机种子 | 正式实验不固定 | 固定种子只用于调试对比 |
我在实际操作中的体会是:调参这种事,最忌讳一次改多个参数。每次只动一个参数,记录目标函数和收敛曲线的变化,才能形成参数和效果之间的映射关系。你拿到的任何推荐参数都只是起点,真正贴合你具体问题的参数,一定是在反复试错中逐步逼近的。这个项目做完之后,我把这套程序继续扩展到了含储能系统协调优化的场景,在不改变主框架的前提下,只需要在目标函数里增加储能充放电的收益项,在决策变量里增加储能的充放电功率,算法逻辑完全复用。这也是这套设计最让我满意的部分——把各功能模块的耦合度降到最低,后续加需求时就不用推倒重来。