
做配电网规划的朋友应该都有体会光伏渗透率一上来原来按最大负荷设计的线路就开始出问题中午光伏出力猛的时候电压往上顶傍晚负荷上来光伏又没了功率缺额全压在上游电网。储能是眼下解决这个矛盾最直接的手段但储能设备不便宜装在哪、装多大直接决定这笔投资能不能收得回来也决定能不能真正改善电网运行。我最近在14节点配网系统上做了一套含光伏的储能选址定容模型求解用改进粒子群算法把节点配网里的储能安装位置和容量一次性优化出来。这篇文章把建模思路、算法改动、程序实现细节和踩过的坑完整梳理一遍适合正在做配电网规划、储能优化配置相关课题的研究生和工程师参考。1. 14节点系统上的储能选址定容问题本质是什么1.1 为什么选14节点配网系统而不是更大规模算例很多刚接触这个方向的人会问为什么不用33节点、69节点甚至123节点系统来做那样不是更贴近实际配网吗我的看法是初版模型和算法验证阶段14节点是一个性价比极高的选择。首先是计算代价可控。储能选址定容如果走粒子群这类群智能算法每评估一个粒子都要反复调用潮流计算节点数越少潮流一次的计算时间越短。14节点系统的潮流计算在纯Python环境里一次也就几毫秒整个优化跑下来节奏很舒服。33节点虽然也不算大但迭代次数一多、粒子数一上去调试周期明显拉长。其次14节点足够体现出空间分布差异。配电网优化最核心的点在于不同节点的电气位置不同对储能配置的敏感度也不同。14个节点分布在几条馈线上有的靠近根部、有的在末端有的负荷重、有的光伏接入集中这样选址结果才会呈现出明显的空间差异性方便验证算法的有效性。如果只有三五个节点那基本不存在选址问题变成纯定容了如果节点太多分析结果和电气原因的对应关系又会变得复杂。还有一个很实际的原因14节点系统的数据相对容易获取和改造。常见的IEEE 14节点算例可以直接从公开文献中拿来改造成配网参数负荷数据、线路阻抗、光伏接入位置都可以灵活设置对验证模型假设非常方便。1.2 选址定容是一个典型的混合整数非线性规划问题从数学模型上讲储能选址定容属于混合整数非线性规划MINLP。为什么这么说因为决策变量里既有离散量又有连续量。选址变量是离散的。你要决定储能装在哪几个节点每个节点装还是不装这是0/1决策变量。如果允许14个节点都纳入候选理论上就有2的14次方种组合每种组合下还要再优化容量配置问题规模很快就不小了。定容变量是连续的。确定安装节点后还要优化每处储能的额定功率和额定容量它们可以在连续范围内取值比如功率从100kW到2MW容量按2小时、4小时等不同倍率配置。这部分的可行域是非凸的。再加上目标函数和约束条件的非线性潮流方程本身就是一组非线性方程网损、电压都和功率分布之间是非线性关系整个问题就变成了一个规模不大但结构复杂的非凸优化问题。对这个问题的求解传统方法比如枚举法加非线性规划只能在小规模下勉强工作节点一多枚举行不通。智能优化算法比如粒子群、遗传算法、差分进化因为不依赖梯度信息对处理这种带离散变量的非线性问题反而有天然优势。1.3 改进粒子群算法为什么适合这个场景粒子群算法PSO我是比较偏爱的原因很朴素实现简单参数少用起来直接。标准PSO里每个粒子只有位置、速度和三个基础参数核心公式就两行迭代逻辑清晰不像遗传算法要考虑编码、交叉、变异好几个环节。对一个十几维的优化问题PSO的收敛速度非常快往往几十次迭代就能逼近一个不错的解。但标准PSO有个老毛病——容易早熟。储能选址定容这个问题的目标函数多峰性较强不同安装位置组合可能对应着差异不大的目标值标准PSO经常在迭代中期就聚集到某个局部极值附近种群的多样性快速下降后面再怎么迭代也很难跳出来。所以我在这个项目里对标准PSO做了针对性改进。改进不是为改而改而是针对这个问题本身的三个特征含离散变量、约束多、多峰严重。具体怎么改后面第3章展开讲。2. 含光伏场景下的储能选址定容模型怎么建2.1 目标函数年综合费用怎么算模型的目标函数我采用的是最小化年综合费用把投资、运维、购电和网损都折算到一年来比较。目标函数的基本形式如下min F C_inv C_om C_grid C_lossC_inv储能设备的等年值投资成本C_om储能年运行维护费用C_grid系统向上级电网购电的费用C_loss网络损耗费用C_inv 的计算要先对储能投资额做等年值折算。储能设备的投资主要包括功率成本对应变流器和容量成本对应电池本体两部分可以用下面的式子表示C_inv beta × Σ (k_p × P_i k_e × E_i)其中P_i 和 E_i 分别是第i个候选节点配置的储能额定功率和额定容量k_p 是单位功率成本元/kWk_e 是单位容量成本元/kWh。beta 是资金回收系数beta r × (1r)^Y / ((1r)^Y - 1)r 是折现率Y 是储能设备的使用年限。这个系数的作用是把一次性投入分摊到寿命期内的每一年否则投资成本跟每年的运行成本之间没有可比性。C_grid 的计算需要把典型日内每个时段的购电功率乘以对应时段的电价再累加。这里要注意分时电价的作用非常关键峰谷电价差越大储能通过低充高放套利的空间就越大优化结果中储能配置容量也会相应增大。C_loss 由潮流计算得到每个时段的网络损耗乘以损耗折算电价再累加全年。不同类型典型日根据其在全年中的天数进行加权最终得到全年的网损费用。2.2 潮流约束、电压约束、SOC约束这些等式与不等式怎么写模型约束条件我分成了三组。首先是潮流等式约束。每个节点在每个时段的注入功率必须等于流出功率这是配电网分析的基本要求。在含光伏的场景下节点注入功率要同时考虑常规负荷、光伏出力和储能充放电。节点i在t时段的功率平衡方程可以抽象为P_i(t) P_load_i(t) - P_pv_i(t) P_ch_i(t) - P_dis_i(t)其中 P_ch 和 P_dis 分别是储能充电和放电功率。对于没有安装储能的节点后两项为0。对于没有光伏接入的节点光伏出力为0。其次是节点电压和线路传输功率约束。电压上下限我一般取0.95到1.05标幺值正常范围如果光伏渗透率高要考虑电压上限的问题所以优化时电压越限处罚要明确。线路功率或电流需要小于线路的长期允许载流量。第三组是储能自身的运行约束。储能额定功率、容量有上下限约束不能无限大。储能荷电状态SOC满足时序递推关系SOC(t1) SOC(t) (η_ch × P_ch(t) - P_dis(t) / η_dis) × Δt / E这个式子表示SOC在两个相邻时段之间按充放电功率和效率变化。SOC的上下限通常取0.1到0.9避免深度充放电损害电池寿命。2.3 光伏出力与负荷时序数据怎么进模型储能的经济性说到底取决于充放电运行曲线而充放电曲线又取决于光伏出力和负荷在时间上的匹配关系。所以时序数据是模型的核心输入。我采用的是典型日加权法。不直接跑一整年8760个小时的时序仿真那样计算量太大而是选取春、夏、秋、冬四个典型日每个典型日取24个时点分别对应典型的光伏出力曲线和负荷曲线最后按不同季节在全年中的天数比重加权汇总到年费用中。光伏出力曲线大致呈现中午高、早晚低的倒U型夏天中午光照最强出力最高但夏季空调负荷也是高峰期两者叠加后净负荷曲线怎么走需要看具体情况。冬季光照弱、傍晚负荷重容易出现光伏归零后负荷仍然很高的情况。负荷曲线我采用配网典型日负荷曲线形状上白天和傍晚各有一个高峰。在数据生成时不同节点还要设置不同的负荷水平末端或工业聚集区节点的峰值负荷更高这样才能体现空间差异。光伏出力和负荷数据在模型中都要转换成标幺值或有名值并统一基准。这一点特别容易出错如果光伏出力单位是kW负荷单位是kVA基准容量又不统一潮流计算出来的结果会完全变形。项目一开始我在这个上面吃过亏后面会在数据检查部分细说。2.4 储能运行策略如何简化又不失真规划阶段的储能运行策略和调度阶段的实时优化是两码事。做选址定容时如果每个粒子的评估都要跑一个实时优化计算量会失控。所以需要一套简单但符合实际运行逻辑的规则策略。我采用光伏高发时充电、负荷高峰时放电的固定规则。具体逻辑是当光伏出力大于负荷需求时优先由光伏供电多余功率给储能充电当负荷大于光伏出力时储能放电补充缺额。同时结合峰谷电价设置低电价时段充电、高电价时段放电的基本逻辑。这样做的好处是规划阶段不需要求解每个时段的运行优化问题只需要顺着时序曲线走一遍规则就能得到全天24个时段的充放电状态和SOC变化。计算结果对储能投资边界判断是足够的因为规划关注的是储能的合理投资规模而不是电池具体的充放电指令。当然这种策略会略偏保守。实际运行中如果结合实时电价和预测数据做优化调度储能收益会比规则策略略高。规划件阶段用规则策略做出来的容量配置偏保守但工程上更可靠。3. 改进粒子群算法改在哪、为什么这么改3.1 粒子编码建址、功率、容量如何表达成粒子的位置粒子编码是整个算法设计里第一个要考虑清楚的问题。编码方式直接决定了搜索空间的形状和算法能不能找到合理解。我采用的是候选节点全覆盖编码方式。粒子的维度等于候选安装节点的两倍。假设14个节点全部纳入候选粒子长度为28维。前14维表示每个候选节点的储能额定功率后14维表示每个候选节点的储能额定容量。具体来说粒子的位置向量 X [x1, x2, ..., x14, x15, ..., x28]。前14维中 xi 对应第i个节点的储能功率如果 xi 小于设定阈值就认为该节点不装储能。后14维中的 xi14 对应第i个节点的储能容量。比如某个粒子解码后是节点3的功率维度取值为0.8MW容量维度取值为3.2MWh表示在节点3安装一套0.8MW/3.2MWh的储能。如果功率维度取值接近0则该节点不参与实际运行计算。这种编码方式的优势在于算法可以在连续空间里搜索不需要额外的二进制变量对粒子群算法来说最自然。缺点是维度偏高但实际上14节点系统下28维对PSO来说并不算大搜索效率完全可以接受。解码时要注意功率为零但容量不为零这种矛盾情况。我做了简单逻辑校正如果功率低于阈值0.05MW就把该节点的功率和容量都清零避免出现有容量没功率的不合理配置。3.2 自适应惯性权重与异步学习因子标准PSO的速度和位置更新公式我就不赘述了关键改进点在惯性权重和学习因子的动态调整。惯性权重 w 控制粒子的全局搜索和局部开发平衡。w 大粒子倾向于大范围探索w 小粒子倾向于在当前位置附近精细搜索。经典做法是线性递减w w_max - (w_max - w_min) × t / T_max我取 w_max 0.9w_min 0.4。迭代前期全局探索后期局部收敛这个思路本身没问题但纯粹的线性递减在储能选址定容这种多峰问题上还是偏机械。我在线性递减基础上叠加了一个基于种群收敛状态的判断如果连续若干代全局最优值没有变化说明种群可能收敛到局部极值此时主动增大惯性权重让粒子获得一次挣脱的能力。实现起来很简单增加一个计数器超过停滞代数后把 w 临时调大再缓慢回落。学习因子 c1 和 c2 也做了异步处理。前期让 c1 大一些鼓励粒子向自身历史最优学习保持独立性后期让 c2 大一些增强粒子向全局最优靠拢的动力。具体取值可以从 c12.5、c20.5 线性过渡到 c10.5、c22.5。3.3 混沌初始化与后期变异提升种群多样性标准PSO的初始种群一般用均匀随机数生成。随机初始化的问题在于粒子分布容易出现扎堆有些搜索区域从一开始就没人探索。这个项目里我改用Logistic混沌映射生成初始种群。混沌序列的核心特点是确定性生成、统计上均匀。用 x_{n1} 4 × x_n × (1 - x_n) 这个迭代式生成一组在0到1之间分布的序列再映射到粒子的搜索范围。与随机生成相比混沌初始化能让粒子在解空间里分布得更均匀尤其是高维空间里这个优势更明显。迭代后期我加入了一个变异操作。具体做法是每次迭代结束后对全局最优粒子之外的粒子以0.05到0.1的概率随机挑选一个维度把该维度重新初始化到搜索空间的一个随机位置。这个操作相当于给粒子群打了一针多样性疫苗防止整个种群被一个局部最优解吸附住。3.4 算法主流程的迭代细节完整流程如下读取配网参数、负荷曲线、光伏曲线、储能成本参数用混沌序列初始化粒子群种群规模取30对每个粒子解码得到储能安装位置和配置方案调用潮流计算评估该方案下的年综合费用适应度值更新每个粒子的个体最优 pbest 和全局最优 gbest更新惯性权重和两个学习因子更新粒子速度与位置检查越界并处理按概率执行变异操作判断是否满足终止条件达到最大迭代次数200或全局最优连续30代不变不满足则返回第3步满足则输出结果速度更新中还需要设置速度上限 v_max。经验上取搜索空间范围的20%左右比较合适太大粒子容易飞出搜索区域太小又会导致收敛缓慢。4. 程序实现时最容易踩的坑4.1 潮流计算与适应度函数之间的耦合程序的正循环是粒子解码 → 生成某时段的各节点注入功率 → 潮流计算 → 计算网损和节点电压 → 算适应度。这里面最容易出问题的是潮流计算与光伏、储能之间的接口。光伏节点我处理成PQ节点按恒功率因数0.95运行。储能节点也处理成PQ节点充电时注入功率为负放电时为正。需要注意的是同一节点如果既有光伏又有储能两者要合并成一个等效注入功率再参与潮流计算不能分开建模否则节点功率平衡会出问题。潮流计算我用的是极坐标牛顿-拉夫逊法对14节点这种规模收敛速度很快一般4到6次迭代就能收敛。在每次迭代时要检查雅可比矩阵是否奇异以及迭代次数是否超过上限。我遇到过一次支路数据抄错导致潮流不收敛结果某个粒子的适应度变成了一个很大但不合理的值整个种群被这个异常值带偏。4.2 罚函数系数怎么定处理约束越限我的做法是外点罚函数法。当电压越限、线路功率越限、SOC越限时在目标函数上加上惩罚项。惩罚项的基本形式F_pen λ1 × Σ (V_i - V_max)^2 λ2 × Σ (S_l - S_max)^2 λ3 × Σ (SOC越限量的平方)关键问题在于罚系数 λ 怎么选。我一开始把罚系数设得很大结果可行域内的粒子适应度被罚项压制算法极度保守搜索效率低下。后来调小罚系数又出现约束被大规模违反但目标值看起来不错的情况。调了大概几十轮之后我总结出的经验是λ 在1000到10000这个量级比较合适具体数值跟目标函数数量级有关一般要让约束违反量在目标函数中的占比处于5%到20%之间。可以先跑一次不约束的优化看看目标值量级再反推罚系数。更稳的做法是初始化时就保证有一部分粒子是可行解。我在初始化种群后对每个粒子做一次快速连通性检查确保初始方案至少不出现明显的电压越限相当于给种群一个合理的起点后续优化在罚函数引导下不会跑太偏。4.3 计算量爆炸的优化办法粒子数30、迭代200次、每个粒子要评估4个典型日24个时段一个粒子一次评估要跑96次潮流计算。整个优化过程就是30 × 200 × 96 576000次潮流计算。14节点系统下大概需要几十分钟到一小时这个时间在调试阶段非常难受。我做了几件事把时间压下来。第一对典型日做简化合并。不是所有典型日都需要完整24时段比如冬季光伏出力很小可以把冬季场景简化为早晚两个关键时段加中午时段减少潮流计算的次数。第二对重复状态做缓存。粒子更新后如果某几个节点配置没有变化该节点的注入功率就不重新计算只需要更新有变化的节点。第三把纯Python潮流计算改为使用NumPy数组操作避免在循环里逐元素操作。这一项优化对计算时间的节省非常明显从几十分钟降到了十几分钟。4.4 调试过程中几个典型的异常现象迭代后期适应度震荡是一个比较常见的现象。检查方向通常是罚函数系数是否太大、变异概率是否太高。我遇到过一次震荡定位到原因是SOC越限惩罚计算时符号写反了充电时SOC上升越了上限但没有被惩罚反而正常运行的粒子被惩罚导致种群行为完全混乱。后来重新整理了SOC递推式的符号才恢复正常。全局最优长时间不动的情况我遇到过多次。很多时候不是算法的问题而是编码解空间里存在大量等值方案。比如储能装在这个节点还是那个节点网络损耗差异只有几千块钱在整体成本里的占比极小算法很难区分优劣。这种情况下我建议直接加入一个选址数量惩罚项让算法倾向于用更少的储能安装点实现相近的效果。还有一个容易踩的坑是粒子位置更新后小数的安装功率变成了负数。越界处理我采用的策略是反射法超出上限就折回到上限减去超出部分。反射之后粒子还能保留爬坡的方向信息比直接夹在边界上要好很多。5. 仿真结果怎么看以一套实际计算为例5.1 储能选址结果与电气解释下面说的是一套有代表性的运行结果。算例设置是光伏接入节点4、9、11总渗透率约30%候选安装节点为全部14个节点。优化后的储能安装位置集中在节点5和节点14。节点5位于馈线中部是一个负荷比较重的节点而且距离光伏接入点4不远能够就地消纳光伏出力减少向末端输送功率带来的网损。节点14位于馈线末端末端电压支撑能力弱储能放电能够显著抬升末端电压改善电压分布。这个选址结果反映出的规律是普遍性的储能要么靠近重负荷节点要么靠近馈线末端两者都能最大程度发挥储能的调节作用。光伏接入点本身反而不是最优的安装位置因为光伏出力就地注入系统后储能如果装在同一个节点调节范围只限于本地对全网电压和潮流的改善效果不如装在关键传输路径上。5.2 定容结果与成本结构定容结果上节点5配置的储能额定功率为1.2MW额定容量为4.8MWh是典型的4小时时长配置。节点14的配置略小额定功率为0.8MW额定容量为3.2MWh。总储能容量8MWh在14节点系统的负荷规模下占到了约15%的日峰值负荷电量这个比例在工程上属于偏大的配置主要原因是算例里峰谷电价差设置较高套利收益空间大。成本结构方面年综合费用中储能投资成本占比约40%购电费用占比约45%网损费用和运维费用各占不到10%。和未配置储能的基准方案相比年综合费用下降了约11%主要贡献来自购电费用的降低和网损的减少。请注意这里的数值都依赖具体的电价参数。峰谷电价差只有0.3元/kWh时储能的套利收益会大幅下降最优容量也会跟着缩水。做敏感性分析时电价差是最值得先扫一遍的参数。5.3 改进PSO相对标准PSO的收敛性提升我做了对比实验同样参数配置下分别用标准PSO和改进PSO跑20次统计指标。标准PSO平均收敛迭代次数约60代但多次跑的最终结果方差较大最好的解和最差的解之间差距有8%。改进PSO前期收敛速度略慢约90代才趋于稳定但20次运行中几乎都落到同一个最优值附近最终目标值比标准PSO平均低约5%到7%。这个差异在储能选址定容问题上是合理的。标准PSO容易在中早期锁定一个看起来不错的局部方案比如只差一点点但不够优化的配置组合。改进PSO通过混沌初始化、自适应惯性权重和后期变异相当于多给了几次跳出局部极值的机会换来的是更稳定的全局优化能力。5.4 光伏渗透率变化对配置结果的影响我还做了光伏渗透率的敏感性验证。把渗透率从30%提高到50%后最优储能容量增加了约40%而且出现了新的储能安装候选节点靠近原光伏接入点的一个中压节点被选为新的安装位置。原因不难理解渗透率越高光伏午间出力对系统电压的提升越明显需要通过储能吸纳的过剩光伏电量也越多。同时高渗透率下电压越限问题更突出储能需要更靠近光伏接入点或者电压薄弱点来提供就地支撑。这里有一个对实际规划很重要的启示储能配置不是一次算完就固定的。未来光伏装机继续增长时原来配置的储能规模可能不够用选址方案也可能要跟着调整。规划阶段就应该留出扩建接口至少容量配置上考虑一定的裕度。6. 项目做完之后的一些实在建议6.1 数据和算例参数从哪获取做这类项目数据获取往往是卡脖子的地方。公共算例方面IEEE 14节点系统的线路和负荷数据可以公开获取但要注意原始是输电网算例电压等级和参数范围跟配网不完全一致通常需要做一些修改比如调低基准电压、调整线路阻抗数量级、重新设置负荷分布。光伏出力数据如果没有实测来源我建议先按典型的理论曲线形态生成夏季中午出力峰值接近额定功率冬季出力约在额定功率的30%到50%在此基础上叠加一定的随机波动模拟云层遮挡的不确定性。负荷曲线也可以按配网典型形状手动构造关键是保证曲线形态合理、峰值和谷值在恰当的位置。需要警惕的一个问题是参数来源不同单位也不同。光伏数据可能以kW给出电网数据里以MW为单位储能成本以元/kWh为单位混在一起计算必须有清晰的单位标注和换算逻辑。我的习惯是程序里统一使用标幺值外部数据输入后先做标幺值变换再进入优化和潮流计算。6.2 模型假设在工程落地时的调整点学术模型和工程落地之间存在一些需要调整的地方。储能效率方面程序里我设的是充放电效率0.95实际锂离子电池系统在考虑变流器损耗、辅助设备损耗后综合效率大约是0.85到0.9且会随温度和SOC变化。工程测算时建议采用更保守的效率值。电池寿命问题也要正视。模型中采用等年值折算相当于假设电池在寿命期内性能恒定。实际上电池的循环寿命是有限的频繁满充满放会加速老化。工程方案中最好给SOC运行范围设得更窄一些比如0.2到0.8并单独计算循环寿命对应的替换成本。场地和接入条件同样是不可忽略的约束。配电站房有没有空间放电池舱、消防要求能不能满足、变压器剩余容量够不够接储能变流器这些在做实际项目时会直接淘汰掉很多纸面上的候选节点。学术模型先不必过度纠结这些约束但作为工程师心里要有数。6.3 后续可以往哪些方向扩展这套模型做完之后扩展空间还是比较大的。一个方向是目标函数的多元化。目前是单目标优化把经济性放在第一位。实际工程中电压质量、供电可靠性、碳排放指标同样重要可以改成多目标优化用帕累托前沿来分析经济性和电压水平之间的权衡关系。另一个方向是和运行层级的联合优化。选址定容属于规划层储能投资确定之后实际运行中还涉及更精细的调度策略。两个层级如果分开决策投资可能不匹配可以尝试构建规划-运行联合优化的双层模型外层用粒子群搜索配置方案内层用线性规划求解典型日的运行策略。第三个方向是配网重构和无功优化结合它们同样是影响电压质量和网损分布的因素与储能选址之间存在耦合关系。把这几类手段放在一个统一优化框架下虽然模型复杂度上去了但结果会更贴近实际配网运行优化。从我个人的操作体会来说做这类项目最忌讳的是把精力全花在算法改进上而忽视了对配电网物理特性的理解。储能选址定容的结果好不好一半取决于模型和参数设置是否贴合实际另一半才取决于算法够不够聪明。先把14节点系统的潮流特性吃透再上手改算法效率会高很多。最后分享一个小技巧调试阶段可以把迭代次数和粒子数同时减小到原来的三分之一快速跑完看整体流程是否跑通再放大参数跑正式结果能节省不少时间。