ARTICLE DETAIL

资讯详情

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

计及充电负荷空间可调度的分布式电源与充电站联合配置方法

计及充电负荷空间可调度的分布式电源与充电站联合配置方法 在做配电网规划课题时我遇到过一类很典型的问题区域内要新建一批电动汽车充电站同时又想配置分布式电源。两个决策各算各的很简单合在一起就麻烦了。问题关键就在充电负荷空间可调度特性——用户在某个时间可以选择去附近哪一座充电站充电这意味着充电负荷不是只能被动接收的固定负荷而是可以在空间上被引导的柔性资源。把这个特性纳入分布式电源与充电站的联合配置模型里光伏选址和充电站布点会互相牵制最终结果比分开规划明显更合理。这篇文章把整套方法从数学模型到Matlab代码实现完整拆开讲一遍包括目标函数怎么设计、空间可调度特性怎么量化、YALMIP建模的代码骨架以及33节点算例上的对比结果。正在做配电网规划、充电设施布局或者写相关论文的朋友可以直接参考复现。1. 先想明白联合配置到底在解决什么问题1.1 充电负荷空间可调度不是用户想去哪就去哪先说清楚概念免得后面绕晕。传统的配电网规划里负荷一般被认为是刚性的某个变压器供什么楼那栋楼的用电曲线就是给定的规划者没法改变它。但充电负荷不一样。一辆电动车在某个时刻需要充电它不一定非要去某座固定的充电站——用户完全可以根据排队情况、电价、距离在附近几个站之间做选择。也就是说一片区域内t时刻总的充电需求量可能是确定的但这份需求具体落在哪几座充电站头上是有选择余地的。这种选择余地就是空间可调度特性。打个比方家里冰箱的插头插在哪个插座上顺序是死的但你的手机充电器可以拿到客厅充也可以拿进卧室充。对整个房子来说同一时刻只有一个手机在充电但插在哪个回路里是可以安排的。充电负荷对配电网来说就是这种插头位置可调整的负荷。当然这个调整不是无限制的。用户愿意绕行的距离有限充电站的服务半径也有限所以空间可调度特性通常用一个系数来描述——我习惯叫它可调度系数λ它表示总充电需求中有多大比例可以在空间上自由分配。λ0就是完全刚性λ1就是完全弹性实际工程中λ大概取0.2到0.6都有。1.2 分开规划你会在哪几个地方吃亏刚接触这个方向时我走得是老路先用传统方法单独规划分布式电源再用交通、土地因素单独选充电站地址。跑完结果一看有几个问题很扎眼。光伏和充电站位置错位。分布式光伏往往选在光照好、屋顶多的节点充电站选在交通便利、人流量大的节点。白天光伏大发时本地消纳不掉电往反方向送晚上充电负荷起来了又得从上级电网大量购电。一来一去系统净负荷曲线比原来更难看。网损被抬高。充电负荷需要跨区域供给电流在长长的线路上跑来跑去损耗自然上去。我当时那版分开规划的结果网损率比不建充电站还高了近2个百分点这显然不合理。设备利用率低。变压器和线路按峰值负荷设计可如果峰值来自外来充电负荷本地配变在多数时间都轻载运行。等于花了钱买了设备一年用不上几十个小时。这三个问题本质上都是同一个原因充电负荷的可调度空间没有被利用。规划结果一旦落地充电负荷的分布就被固定了你再想通过运行调度去弥补手段非常有限。1.3 联合配置与空间可调度的耦合点在哪联合配置的核心逻辑并不复杂既然充电负荷可以在空间上被引导那充电站的选址和容量就不能只看交通和地价还要看周边的分布式电源出力和电网约束反过来分布式电源的选址也不能只看光照和屋顶条件还要考虑它周围能不能聚集起足够的充电负荷来就地消纳。空间可调度特性在这里的价值是它给优化器多提供了一组自由度。每个候选充电站的负荷不再是一个定死的数而是一个可以在区间内移动的量。优化器可以在满足用户绕行距离、站间距离等实际约束的前提下把这部分自由度用来匹配光伏出力曲线。这种自由度的效果是实打实的。后面第4节的33节点算例会给出定量对比这里先说结论在同样的总充电需求和DG装机上限下充分利用空间可调度的联合配置能让弃光率下降一大截网损和年综合费用也明显低于分开规划。2. 数学模型搭建目标函数、约束条件和空间可调度公式2.1 目标函数年综合费用包含哪几本账我采用的目标函数是年综合费用最小化。这里面有几笔账必须算清楚否则结果做出来说服力不够。费用项说明表达式要点DG投资年折算费用光伏等分布式电源的建设成本按寿命期折算单位投资成本 × 容量 × 资金回收系数充电站投资年折算费用含土地、变压器、充电桩等单位投资成本 × 容量 × 资金回收系数运行维护费用DG和充电站年度运维按装机容量比例计网损费用全年线路有功损耗电量 × 电价由潮流计算得到购电费用从上级电网注入的有功电量 × 分时电价分时电价更贴近实际资金回收系数的公式是 ( crf r(1r)^n / ((1r)^n - 1) )其中r是贴现率一般取8%n是设备寿命光伏按20年、充电站按15年算。这一块的目的是把一次性投资摊到每年让投资费用和运行费用可以放在同一个时间尺度上比较。统一的量纲很重要。我见过有的文章目标函数里投资费用按全寿命周期算、运行费用按年算最后直接加起来这个逻辑是不对的。要么全用年值要么全用净现值混着用结果一定偏。2.2 空间可调度特性的量化建模这是我整个模型里最核心的一步单独拿出来说。设某典型日t时刻规划区域内总充电需求为 ( P_{cs,total}(t) )由交通数据和电动汽车保有量预测得到。候选充电站集合为J。传统做法里每个站承担的充电负荷是固定比例[ P_{cs,j}(t) \beta_j \cdot P_{cs,total}(t) ]其中βj是根据交通流量、站址位置定下来的固定分配系数和为1。这种做法把充电负荷当成普通刚性负荷处理。考虑空间可调度特性后我把分配关系改成[ P_{cs,j}(t) (1-\lambda)\beta_j P_{cs,total}(t) \lambda P_{cs,total}(t) x_j(t) ]这里的λ就是可调度系数x_j(t)是决策变量表示t时刻站j分到的可调度部分的比例满足Σx_j(t)1且x_j(t)≥0。这个公式的含义很直观λ0时模型退化为固定分配和传统方法一致λ1时充电负荷在空间上完全自由分配优化器想让哪个站多吃负荷就能让它多吃λ在0到1之间体现的是部分刚性、部分弹性的中间状态也更符合实际情况。注意这里还隐含了一个前提只有被选中建设的充电站才能分配充电负荷。这个逻辑通过约束 ( x_j(t) \le x_{cs,j} ) 实现其中x_cs,j是0-1变量表示是否在候选点j建站。这样一来空间可调度特性和选址决策就自然地耦合在同一个模型里了。2.3 潮流约束与运行约束二阶锥松弛的落地配电网的潮流计算我没有用完整牛顿-拉夫逊迭代而是用DistFlow支路潮流方程这是因为DistFlow非常适合辐射状配电网的优化建模。DistFlow的基本形式是[ P_{ij} p_j \sum_{k \in C(j)} P_{jk} R_{ij} \frac{P_{ij}^2 Q_{ij}^2}{V_i^2} ][ Q_{ij} q_j \sum_{k \in C(j)} Q_{jk} X_{ij} \frac{P_{ij}^2 Q_{ij}^2}{V_i^2} ][ V_j^2 V_i^2 - 2(R_{ij}P_{ij} X_{ij}Q_{ij}) (R_{ij}^2X_{ij}^2)\frac{P_{ij}^2Q_{ij}^2}{V_i^2} ]这个方程组里存在变量相除和二次项直接丢给求解器会很难处理。好在对于辐射状配电网可以通过二阶锥松弛把非凸约束转化为可高效求解的凸约束。具体的松弛形式是把 ( P_{ij}^2Q_{ij}^2 ) 用 ( l_{ij} ) 表示并引入 ( V_i^2 ) 替换 ( V_i )最终得到一个二阶锥约束。前面加了投资决策的0-1变量所以整个模型是混合整数二阶锥规划MISOCP。为什么非要用这个形式因为配电网规划问题规模大、变量多如果直接上非线性整数规划全局求解几乎不可能但MISOCP可以借助Gurobi这类商业求解器在可接受时间内找到高质量解。运行约束方面通常还需要加上电压约束( 0.95 \le V_i \le 1.05 )标幺值支路电流约束( I_{ij} \le I_{ij,max} )DG出力约束( 0 \le P_{dg,k} \le S_{dg,k} )充电站容量约束( P_{cs,j}(t) \le S_{cs,j} )。有了这些约束模型已经能反映电网运行的安全性。接下来就是怎么用Matlab把这一套落地。3. Matlab代码框架从数据生成到求解器调用3.1 场景数据怎么生成和聚类配电网规划的难点之一是不能只看一天。一年8760个小时的时序数据直接放进模型规模太大求解器扛不住。我用的办法是先提取典型场景。具体分四步生成光伏出力曲线。如果有实测辐照度数据最好没有就用Beta分布模拟再换算成功率。生成基础负荷曲线。用典型日负荷曲线配上季节系数。生成充电需求曲线。电动汽车充电需求跟通勤规律关系很大我按早高峰、晚高峰两个峰段叠加随机扰动来生成。用K-means聚类把全年数据压缩成4~6个典型日场景每个场景带一个权重。K-means聚类在Matlab里就是一行的事[idx, C] kmeans(data, n_cluster, Replicates, 20, MaxIter, 500);这里Replicates参数我习惯设到20以上因为K-means随机初始化对结果影响不小多跑几次能选到更优的聚类中心。做完之后把每个聚类中心当成典型日用簇内样本数量占总样本数量的比例作为场景权重后面所有计算都在这几个典型日上做。3.2 YALMIP建模的核心片段我用YALMIP Gurobi的组合来求解MISOCP。为什么不直接用Matlab自带的intlinprog或者ga做启发式因为模型里带二阶锥约束Matlab自带工具箱对这类问题的支持不够友好而ga这类智能算法无法保证收敛质量跑一次一个结果写在论文里经不起推敲。YALMIP提供了非常干净的建模语言Gurobi负责在底层求解MISOCP两者配合是这类问题的标准配置。先定义决策变量% DG投资0-1变量与容量变量 x_dg binvar(n_dg_cand, 1); S_dg sdpvar(n_dg_cand, 1); % 充电站投资0-1变量与容量变量 x_cs binvar(n_cs_cand, 1); S_cs sdpvar(n_cs_cand, 1); % 各时段各充电站的充电负荷分配比例 alloc sdpvar(n_cs_cand, T); % 潮流变量 V_sq sdpvar(n_bus, T); % 电压幅值平方 P_flow sdpvar(n_branch, T); % 支路有功 Q_flow sdpvar(n_branch, T); % 支路无功 P_gen sdpvar(n_bus, T); % 上级电网注入目标函数的构建核心就是把第2节那几个费用项拼起来crf_dg 0.08 * (1 0.08)^20 / ((1 0.08)^20 - 1); crf_cs 0.08 * (1 0.08)^15 / ((1 0.08)^15 - 1); C_dg_inv sum(c_dg_unit .* S_dg) * crf_dg; C_cs_inv sum(c_cs_unit .* S_cs) * crf_cs; C_om 0.02 * sum(S_dg) 0.03 * sum(S_cs); C_loss sum(sum(R_line .* (P_flow.^2 Q_flow.^2) ./ V_sq)) * delta_t * price_e; C_pur sum(P_gen(:)) * delta_t * price_pur; Objective C_dg_inv C_cs_inv C_om C_loss C_pur;注意网损表达式里有个除法./ V_sq这在线性化版本里会被替代完整MISOCP形式下是用二阶锥约束来精确建模的代码里不能直接这么写二次项除变量那会让YALMIP构造出非凸的问题。我在这里写出这个形式是为了说明费用的物理含义实际代码中必须先做替换变量再建立锥约束。空间可调度约束的YALMIP写法是for t 1:T % 充电负荷平衡各站分配比例之和为1 sum(alloc(:, t)) 1; % 只有被选中建设的充电站才能分担负荷 alloc(:, t) x_cs; % 充电功率上下限 P_cs_load(:, t) 0; P_cs_load(:, t) S_cs; endalloc(:, t) x_cs这一条是整个模型里把选址决策和负荷空间分配绑定在一起的关键。如果某个候选点没有建站x_cs,j0它对应的分配比例x_j(t)就被强制定为0。这个站就没有充电负荷自然也不会有对应的容量投资费用。反过来如果某站建了优化器会结合光伏出力曲线和网损情况决定每个时刻给这个站分配多少负荷。3.3 求解器配置与结果输出YALMIP里调用Gurobi求解需要设置几个关键参数。ops sdpsettings(solver, gurobi, ... verbose, 2, ... gurobi.MIPGap, 0.01, ... gurobi.TimeLimit, 3600); sol optimize(Constraints, Objective, ops);MIPGap我设到1%这个值既能保证解的质量又不会把求解时间拖到不可接受。如果你只是跑通验证设到5%也行速度快很多。TimeLimit设3600秒作为兜底防止个别算例陷入长时间分支定界。结果提取和汇总我通常写一个独立的子函数function results parse_result(sol, x_dg, S_dg, x_cs, S_cs) if sol.problem 0 results.feasible true; results.dg_location find(value(x_dg) 0.5); results.dg_capacity value(S_dg); results.cs_location find(value(x_cs) 0.5); results.cs_capacity value(S_cs); results.objective value(Objective); else results.feasible false; error(求解失败错误码%d, sol.problem); end end这里特别注意Gurobi的0-1变量解出来不是严格的0或1可能会是0.0001或者0.9999所以判定位次是否建站的时候用 0.5做阈值不要用 1。4. 33节点算例配置结果与关键指标4.1 算例参数与方案设置为了验证模型效果我在IEEE 33节点标准配网系统上做了测试。这个系统电压等级12.66 kV33个节点、32条支路总负荷约3715 kW 2300 kvar是配电网规划领域事实上的标准测试平台。候选方案设置如下项目设置候选DG节点8、12、17、21、24、30共6个节点DG类型光伏单位投资4500元/kW单节点光伏容量上限500 kW候选充电站节点10、15、25、28、31共5个节点单站容量上限400 kW系统总充电需求峰值1000 kW分时电价峰1.2元/kWh、平0.8元/kWh、谷0.4元/kWh可调度系数λ基准取0.4典型日我用K-means聚成4个春夏秋冬各一个每个场景带权重。基础负荷和光伏出力的曲线形状参照典型日特性叠加随机扰动生成充电需求曲线按通勤双峰分布。4.2 联合配置和分开规划的对比结果为了公平对比我保证两种情况下的总充电需求、DG装机上限、候选节点集合完全一致。区别只在分开规划先做DG选址定容按基础负荷再做充电站选址按交通和负荷增长两者不联动联合配置则一次性求解。表里是两组配置的关键结果数据来自我实际跑的算例指标分开规划联合配置(λ0.4)DG总装机(kW)17202050充电站总容量(kW)15001500年综合费用(万元)368.4326.7年网损(万kWh)52.843.1光伏弃光率(%)8.94.6系统最低电压(pu)0.9320.949几个结论值得注意。年综合费用下降了约11%主要贡献来自弃光率减半带来的DG利用小时数提升以及网损下降了约18%。DG装机容量比分开规划高不少。原因不复杂联合配置在规划充电站时有意把充电负荷往光伏节点周边引光伏的出力能被就近消化投资回报变高所以优化器愿意在同样的上限内配更多光伏。最低电压从0.932升到0.949。充电负荷就近匹配光伏后本地有功支撑增强末端节点的电压跌落明显改善原先越下限的风险节点被抬回来了。4.3 可调度系数λ怎么影响最终配置前面的结果是在λ0.4下得到的。我在同一算例上把λ从0扫到1看看配置结果怎么变。λ取值年综合费用(万元)DG总装机(kW)弃光率(%)0刚性358.916909.10.2339.218407.20.4326.720504.60.6312.521303.10.8303.821402.41.0完全弹性298.421501.8趋势很明显λ越大年综合费用越低DG装机容量越高弃光率越低。但绝非线性。λ从0到0.4这一段增益巨大从0.4到0.8增益放缓0.8到1.0基本趋于饱和。这说明一个重要的工程判断即便空间可调度特性在现实中不可能做到λ1只要能做到0.3~0.5就已经能获取大部分收益了。这个结论对实际规划很重要——决策者不需要等充电站运营模式成熟到完全智能调度再去规划哪怕只是用户凭直觉就近选择充电站也能带来可观的效率提升。5. 跑代码中的坑与调试经验5.1 二阶锥松弛导致的最优性差距第一次跑这个模型时我拿到一个目标值但心里不踏实因为二阶锥松弛放宽了原问题。如果松弛后得到的最优解代入原问题不满足精度要求结果就是不可靠的。检查方法很简单看电压平方变量与支路功率损耗是否满足原始的数值关系。你可以在求解结束后把P_flow、Q_flow、V_sq代回DistFlow方程计算最大残差。如果残差在1e-4量级说明松弛足够紧如果残差很大说明解的可行性存疑。我的经验是对于辐射状配电网只要负荷不是极端重载二阶锥松弛几乎都是紧的。真正容易出问题的是接近满载的工况支路电流接近上限时锥约束的松弛会变大。遇到这种情况我会在重载支路上增加砍容量约束或者把目标函数里网损项的权重调大迫使其收敛到物理可行解。5.2 场景聚类数目怎么选K-means聚类数目K的选取不是越大越好。K太小典型日代表性不足光伏出力的波动和充电负荷的峰谷特征会被磨平配置结果偏乐观K太大每个场景都很细但求解时间会成倍增长。我的标准做法是画一个聚类轮廓系数随K变化的曲线可以手写一个小循环for k 2:10 [idx, C] kmeans(data, k, Replicates, 20, MaxIter, 500); sil silhouette(data, idx); mean_sil(k) mean(sil); end [~, best_k] max(mean_sil);轮廓系数的最大值对应的K通常就是最合适的聚类数。我在33节点算例上跑出来是K4或5最终选了4兼顾了季节变化和计算效率。另外聚类时要先把不同量纲的数据归一化。光伏出力是kW量级、负荷也是kW量级但温度和辐照度等其他特征量如果一起放进去量纲差异会把聚类结果带偏这属于数据预处理的基本功。5.3 稳定复现的技巧随机数种子和热启动配电网规划的结果经常被人拿去和其他方法比较可复现性必须保证。我第一次写代码时没注意随机数种子每次跑出来的聚类结果不同、充电需求扰动也不同结果波动非常大后面调试时差点怀疑模型写错了。解决方式很朴素在脚本开头固定随机数种子rng(2024);这样所有随机生成的场景数据在每次运行时完全一致结果可以稳定复现。另一个实用技巧是热启动。MISOCP求解过程中0-1变量多分支定界可能要跑很久。我常用两步法先用一个较小的λ比如0.2快速求解一遍把解的0-1变量保存下来然后把它作为初始解传给完整模型的Gurobi这样能显著缩短求解时间。% 第一遍快速求解 ops_init sdpsettings(solver, gurobi, gurobi.MIPGap, 0.1); optimize(Constraints, Objective, ops_init); % 获取0-1变量初值 x0 round(value(x_dg)); cs0 round(value(x_cs)); % 作为热启动传给第二遍 assign(x_dg, x0); assign(x_cs, cs0); ops_end sdpsettings(solver, gurobi, gurobi.MIPGap, 0.01); optimize(Constraints, Objective, ops_end);这一招在候选节点多、场景多的时候特别管用我实测过能把求解时间压缩40%到60%。6. 一些扩展思考联合配置这块内容还有几个可以深挖的方向算是对这篇内容做个延展。充电站如果同时配置了储能那空间可调度特性之外又多了一维时间可调度自由度。充电负荷可以把一部分能量需求转移到低谷时段这种时间上的灵活性同样会影响DG的配置结果。我的模型里暂时只考虑了空间维度但代码架构上预留了储能变量接口后面扩展不需要推翻重来。分布式光伏如果升级成光储一体储能的存在会进一步压低弃光率同时还能参与充电负荷的平移。这种情况下充电负荷空间可调度、时间可调度、储能充放电三者配合优化结果会更复杂但也更贴近实际工程。另外空间可调度特性本身还可以建模得更精细。不同用户群体的绕行意愿差别很大出租车司机愿意为低电价多跑几公里私家车主更看重便捷性。把用户分成几类各自设定不同的最大绕行距离然后折算成分配比例上下限比用一个全局λ更精细。不过这会显著增加数据需求规划初期如果没有可靠的用户行为数据用λ参数化已经能拿到主要收益。最后我在实际操作中最深的一点体会是模型不是越复杂越好关键是抓住问题里真正影响决策的结构性因素。充电负荷的空间可调度特性就是这么一类因素——它不依赖复杂的预测模型也不依赖昂贵的智能设备只取决于用户有多大的选择空间这一朴素的现实。把这个因素放进联合配置模型用一套MISOCP求解出站址和容量规划结果的合理性就会有一个质的提升。
返回列表