拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

计及充电负荷空间可调度性的分布式电源与充电站联合配置Matlab实现

计及充电负荷空间可调度性的分布式电源与充电站联合配置Matlab实现 看到标题里那句考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法Matlab代码实现你可能第一反应是又是一篇配电网规划里模型堆约束、算法上优化的套路文。但真正动手做一遍会发现这个问题的关键不在算法多花哨而在空间可调度这四个字到底怎么进入模型以及怎么在Matlab里落地。分布式电源DG和电动汽车充电站EVCS联合配置是当前配电网规划里非常热的场景一边是光伏、风机这类出力波动大的分布式电源一边是充电需求时空分布极不均衡的充电站两者如果分开规划很容易出现DG建在资源好但负荷少的地方、充电站建在负荷重但网架弱的地方结果线损和投资双双超标。把充电负荷可以在空间上被调度纳入优化相当于多了一个自由度可以在规划阶段主动调整负荷落点。这篇文章我会把这个项目的建模逻辑、Matlab代码架构、算例设计以及调试过程中的坑完整梳理一遍适合正在写电力系统规划方向论文、准备电网项目答辩或者想用Matlab重写类似联合优化代码的同行参考。1. 项目整体设计与问题建模1.1 为什么必须把DG和充电站放在同一个优化框架里先看一个我在算例里反复遇到的现象。如果单独做DG选址定容DG会倾向选在光照资源、风电资源最好的节点这个位置往往不是负荷中心单独做充电站规划充电站会倾向选在车辆密度大、商业发达的区域这个区域又往往不是DG出力最猛的地方。两边各自最优叠加到同一个配电网里结果就是中午光伏大发时DG附近负荷不够大量功率要沿着馈线往远处送线路潮流越限末端电压被顶高到了晚间充电高峰DG出力几乎为零充电站附近又缺电源支撑电压跌得厉害。这种割裂规划等于让配电网两头受气。联合配置的核心逻辑是利用DG和EVCS在时间和空间上的互补性。时间上分布式光伏出力集中在白天EV充电负荷高峰一般在傍晚到夜间两者天然错位但如果充电负荷具备延迟充电或V2G放电能力就可以削峰填谷空间上充电负荷可以从负荷过重的节点转移到电压支撑较强的节点或者从距离DG远的节点转移到DG附近实现就地消纳。把这两个要素写进同一个优化模型就是联合配置的价值所在。有人会问那储能不是更直接吗储能当然能平抑波动但投资成本高且只能解决时间维度的问题。充电负荷的空间可调度性用几乎为零的边际成本提供了一种空间维度上的灵活性这在规划阶段就能帮电网省钱。我做的这个项目核心目标就是把这个空间自由度显式建模并和DG选址定容一起优化。1.2 目标函数与约束条件的数学化这个项目采用单目标最小化综合年费既好写代码也方便和传统方案对比。目标函数包含五个部分投资等年值成本DG的单位投资成本乘以容量加上充电站的土建、变压器、充电桩投资运行维护成本按年发电量、年充电量比例估算网络损耗成本把年网损电量按销售电价折算成钱用户不便成本充电负荷转移到其他站点用户绕行和等待时间产生的惩罚费用环境成本考虑DG替代部分传统火电带来的碳排放收益在目标函数里做成负项。把目标函数写成数学形式大致是这样min C_total C_ann_inv C_om C_loss C_conv C_ann_inv CRF * ( Σ c_DG * S_DG_i Σ c_ch * N_ch_j Σ c_station * x_j ) C_loss c_elec * Σ_t Σ_l P_loss_l,t * 365 C_conv β * Σ_t Σ_i,j T_ij,t * d_ij CRF r * (1r)^n / ((1r)^n - 1)其中 CRF 是等年值因子r 是贴现率n 是设备寿命T_ij,t 表示t时段从节点i转移到节点j的充电负荷d_ij是两节点之间的距离或电气距离β是不便成本折算系数。约束条件包括潮流约束各节点有功、无功平衡满足交流潮流方程节点电压约束U_min ≤ U_i ≤ U_max一般取额定电压的±5%到±7%支路容量约束流过支路的视在功率不超过线路热极限DG出力约束0 ≤ P_DG_i ≤ P_DG_i_max无功出力在无功容量上下限内充电站容量约束充电桩总功率不超过变压器容量桩数不超过该站场地允许值空间可调度守恒约束各节点原始充电需求中可转移部分必须等于其他节点转入部分总需求不增不减。这个模型是混合整数非线性规划因为DG和充电站的位置是整数变量容量是离散或连续变量潮流是非线性方程。直接丢给商业求解器通常要花大量时间做线性化而在Matlab里用粒子群或者遗传算法可以把潮流计算当成黑盒模块嵌入迭代起来非常直观。1.3 为什么不选YalmipCplex而选粒子群写代码之前我也纠结过这个问题。YalmipGurobi确实香尤其是把DistFlow二阶锥松弛后能求到全局最优解。但这个项目里有个现实问题充电负荷空间可调度特性天然带着分配和转移这种逻辑判断线性化之后约束数量会爆炸而且每次改动模型都要重新推导方程。相比之下粒子群算法的好处是通用性强适应度函数里可以直接做先分配负荷、再算潮流、最后算成本三步操作模型调整起来非常灵活。粒子群也不是没有代价。它属于元启发算法不能保证全局最优而且对参数敏感容易早熟。所以我在代码里做了两件事一是采用线性递减惯性权重让前期探索、后期收敛二是加入自适应罚函数防止粒子长时间停留在违反电压或容量约束的区域。后面章节会展开说。2. 充电负荷空间可调度特性的建模深度拆解2.1 什么是空间可调度性怎么理解它先讲一个生活场景。早上九点你开车到商业区上班发现公司楼下充电桩排队而导航显示距离1.8公里的另一个充电站空闲电价还便宜0.2元/度。你多半愿意多开1.8公里过去充。这种用户愿意在空间上更换充电位置的弹性就是充电负荷的空间可调度性。规划层面的意义在于一个区域的充电需求并不一定非得在这个区域就地满足。通过价格信号、预约制、调度平台引导一部分充电需求可以转移到邻近充电站。这个弹性在数学上可以定义为一个可调度系数θ表示每个节点充电需求中可以被引导转移的比例。θ0代表完全刚性用户不考虑换站θ0.3表示30%的需求在空间上具备转移条件。这个系数可以来自用户行为调查也可以来自充电App订单热力数据的统计。但要注意空间可调度不等于无限调度。转移距离太远、绕行时间太长、目的地充电站容量不足都会让用户放弃。所以模型里必须有不便成本用来平衡设备投资节省和用户体验损失。2.2 可调度的量化模型和守恒约束我采用的量化模型不搞复杂排队论而是用一个两阶段负荷分配过程放在每次适应度评价里执行。第一阶段根据各节点基础充电需求 D0(i) 和可调度系数 θ_i计算原地保留需求和可转移总量D_local (1 - theta) .* D0; T_total sum(theta .* D0);第二阶段把可转移总量 T_total 按照就近原则分配到其他充电站节点。分配权重由两个因素决定一是节点之间的电气距离距离越近权重越大二是接收节点候选充电站的容量余量容量越富余越容易被分配。分配完后各节点实际充电需求为D_actual D_local delta_in - delta_out;其中 delta_in 是从其他节点转入的量delta_out 是本地转出的量。最关键的是要保证sum(D_actual) sum(D0)总充电需求守恒。这个约束最容易出问题后面我会专门讲调试中的坑。这里还有个细节可调度系数不是每个节点都一样。商业中心区用户更愿意多走几步去找桩住宅区用户更希望楼下就有固定充电位所以我把 θ_i 设成了随节点类型变化的向量。这种差异化会让优化结果更贴近实际。2.3 空间可调度特性到底改变了什么不考虑可调度性规划结果是在每个负荷需求大的节点附近都要布充电站设备冗余高投资大考虑可调度性之后未布站区域的用户可以被引导到邻近的容量稍大的站点原本两个小站可以合并成一个大站充电桩利用率上升变压器台数减少。在我这个算例里可调度系数 θ 从0提到0.3综合年费用下降约8%网损下降约11%DG年利用小时数提升9%。但θ继续提到0.5费用下降变得非常有限因为用户绕行产生的不便成本开始抵消设备投资收益。这说明空间可调度性是个甜点值参数不是越大越好。规划结果还有一个有趣变化不考虑可调度特性时充电站会集中在负荷最重的节点附近加入可调度特性后一部分充电桩会从重负荷节点挪到DG节点附近。这样白天光伏出力高峰时充电站能就近吸收DG功率减少反向潮流电压越限风险也跟着降下来。这就是负荷跟着电源走带来的连锁收益。3. Matlab实现关键流程与代码架构3.1 代码模块怎么拆整套Matlab工程我拆成了6个核心文件main_optimize.m主程序控制整体流程load_case.m读取网络参数、候选节点、负荷数据pso_opt.m粒子群优化主循环fitness_func.m适应度函数把决策变量映射到目标函数值powerflow.m前推回代潮流计算plot_result.m结果可视化。如果你的算例涉及多场景建议再加一个 scenario_gen.m用来生成EV充电负荷的24小时时序场景。主程序的流程大致是这样初始化系统参数读取IEEE33节点数据生成典型日充电负荷场景和可调度系数向量初始化粒子群每个粒子编码一组DG位置、容量和充电站位置、桩数进入迭代对每个粒子执行负荷分配→潮流计算→目标函数评价→惩罚项修正更新个体最优和全局最优更新粒子速度和位置达到最大迭代次数后输出最优配置方案。这个流程非常通用如果之后把粒子群换成遗传算法只需要改pso_opt.m其他模块不用动。3.2 典型日负荷场景和EV充电需求生成EV充电负荷不是恒定值它受工作日、节假日、天气、电价影响。我的处理方法是用一个典型日24小时充电功率曲线再做归一化。P_total 6000; % 日充电总需求单位kWh w [0.8 1.2 0.6 1.5 1.0 0.9 1.3 1.1]; % 各节点充电需求权重 D0_base P_total * w / sum(w); % 基础需求 hourly_profile [0.3 0.2 ... 1.8 2.0 1.5 ...]; % 24h归一化曲线 D0 hourly_profile * D0_base; % 得到N*24矩阵这样做的优点是灵活如果不想用确定性场景可以把 hourly_profile 换成蒙特卡洛采样生成多个典型场景再在目标函数里求期望。如果嫌计算量大就取3个典型场景工作日、周六、节假日加权平均。我实际代码里用的是确定性典型日因为粒子群迭代次数多再叠加场景随机性耗时容易失控。3.3 潮流计算模块前推回代法的工程实现配电网基本上是辐射状结构我用前推回代法而不是牛顿法。原因很简单前推回代法不需要形成雅可比矩阵每次迭代复杂度低适合在优化循环里调用几百上千次。核心思路是先假定所有节点电压为额定值从末端节点向首端节点推算各支路功率然后从首端向末端更新节点电压重复迭代直到最大电压偏差小于收敛阈值。关键代码片段如下function [V, Ploss] powerflow(branch, bus, Sload, Sgen) n length(bus); V ones(n,1); % 初值 S Sload - Sgen; % 净负荷符号必须统一 iter 0; while iter 60 V_old V; % 前推从末端到首端计算支路功率 for k size(branch,1):-1:1 % 根据节点电压和注入功率推算支路功率 end % 回代从首端到末端更新节点电压 for k 1:size(branch,1) % 用首端电压和支路功率计算末端电压 end if max(abs(V - V_old)) 1e-6 break; end iter iter 1; end Ploss sum(branch(:,3) .* abs(I).^2); % 线路有功损耗 end这里最容易踩的坑是符号定义。我统一规定负荷取正值DG注入取负值充电站并入负荷侧取正值。如果符号乱了潮流结果会出现电压整体偏高或偏低而且很难排查。把规则注释写在代码第一行能救你一命。3.4 粒子群算法参数与约束处理粒子群的编码方式决定了算法的搜索效率。我用混合编码DG位置用整数节点编号DG容量用离散档位充电站位置用整数节点编号充电桩数量用整数。更新公式是标准的v w*v c1*rand.*(pbest - x) c2*rand.*(gbest - x); x round(x v); % 位置取整处理越界时不能简单截断因为如果两个粒子位置重复会导致多个DG建在同一个节点浪费决策空间。我的做法是对重复节点随机重置到其他候选节点并且保证充电站节点之间至少间隔一个电气距离。惯性权重w采用线性递减从0.95降到0.4学习因子c1c22.0种群规模60最大迭代次数100。这些参数不是拍脑袋定的我跑过几组对比种群小于40容易早熟大于120每代潮流计算次数太多算例时间明显变长。约束处理我用了自适应罚函数。每次评价完潮流后计算电压越限量和支路过载量乘以罚因子加到适应度里。如果连续10代全局最优没有改善就自动增大罚因子逼着粒子离开不可行区域。这个策略比固定罚因子稳健得多。4. 算例设置与典型结果分析4.1 测试系统与基础参数测试系统用IEEE 33节点配电网这是一张非常经典的辐射状配网常用于DG选址定容和充电站规划研究。基准电压12.66kV总基础负荷约3715kW加2300kvar。DG候选安装节点选了8个类型设定为光伏加储能组合容量离散为0、50、100、150、200、250kVA六个档位。充电站候选节点选了6个每个站点最多能建20个120kW直流快充桩并设置变压器容量上限。算例的基础参数汇总如下参数数值基准电压12.66kV总基础负荷3715kW 2300kvarDG候选节点8, 12, 16, 20, 25, 28, 30, 33DG容量档位(kVA)0, 50, 100, 150, 200, 250充电站候选节点7, 10, 15, 22, 26, 31单桩充电功率120kW站点最大桩数20日充电总需求6000kWh充电负荷峰值时段18:00-21:00可调度系数θ0 / 0.3 / 0.5网损电价0.6元/kWh贴现率8%设备寿命20年充电需求权重向量按节点类型差异化设定商业区和交通枢纽节点权重高住宅区权重低。可调度系数不是全局常数而是按节点类型取值比如商业区取0.4住宅区取0.2平均后整体约0.3。这种设定比全局常数更贴近真实情况。4.2 三组对比方案怎么设计为了把联合配置和空间可调度特性两个贡献拆开看我设计了三组方案方案1独立优化。先做DG选址定容把DG出力固定后再优化充电站两步之间不迭代方案2联合优化但充电负荷完全刚性可调度系数θ0所有充电需求必须就地满足方案3联合优化且考虑空间可调度特性θ按节点差异化取值平均约0.3。这个对比设计是整篇项目里最值得说一下的地方。很多论文只报一个最优结果很难说明我的改进到底贡献了多少。方案1对比方案2能看出联合配置的价值方案2对比方案3能单独看出空间可调度特性的收益。三个方案一摆评审老师也好答辩评委也好一眼就能抓住你的创新点在哪。4.3 结果与关键发现三种方案在综合年费用、网损、DG利用率和充电桩总数四个指标上的对比如下指标方案1方案2方案3综合年费用(万元)968.2908.3837.1网络损耗(MWh/年)314.5281.6250.8DG年利用小时数(h)286029503215充电桩总数量(台)181714最低节点电压(p.u.)0.9180.9420.954注意这里的数字是在我设定的参数下得到的换系统、换参数当然会有变化但趋势是稳定的。方案2比方案1综合年费用降低约6.2%说明联合配置能有效减少源荷不匹配引起的投资浪费。方案3再比方案2降低约7.8%同时DG利用小时数提升约9%充电桩总数反而减少了3台这说明可调度特性让充电站布点更精、容量利用率更高。电压剖面方面方案1最低节点电压在0.918p.u.已经低于±7%的常见要求属于不合格方案方案2提升到0.942p.u.勉强合格方案3提升到0.954p.u.留出了裕量。原因很直观方案3通过空间调度把一部分晚高峰充电负荷转移到了有光伏支撑的节点附近避开了重负荷长距离输电电压剖面自然更好。5. 调试过程中踩过的坑与排查实录5.1 前推回代潮流不收敛这个项目一开始卡在最基础的地方——潮流不稳定。明明把网络参数和负荷数据都填对了前推回代算法却怎么都迭代不到1e-6的收敛精度。排查之后发现两个原因一是充电站节点的负荷量很大无功功率被随意按0.8功率因数估算导致支路功率虚高二是DG节点不能简单当恒功率源处理光伏逆变器无功输出有上限如果越界就会引起电压振荡。解决办法有两个给所有充电站接入时设定功率因数约束无功按0.95滞后计算不要随手估在潮流迭代中间加一个阻尼系数α0.6把上一轮和新计算的电压做加权混合再进入下一轮。这样改完绝大多数情况下20次迭代内就能收敛。5.2 粒子群维度爆炸导致计算时间失控如果每个候选节点都用0-1二进制编码DG位置变量有8维充电站位置变量有6维再叠加容量档位和桩数粒子维度能到70以上。算法前几十代收敛很快后期几乎不动而且每个粒子都要跑一遍潮流总时间非常吓人。我的改进策略有三点第一把位置变量和容量变量分开编码位置直接用整数候选节点编号不搞0-1展开第二适应度函数里用向量化计算替代for循环特别是负荷分配和网损累加部分第三如果机器多核用parfor对粒子群并行评价适应度能缩短大概70%的运行时间。这样一次仿真从原来一个半小时压到20分钟左右已经能接受。5.3 可调度负荷分配导致总负荷不守恒这个问题最隐蔽也最危险。最初我把各节点充电负荷D(i)当成独立变量在上下限范围内浮动结果优化器为了压低综合费用不断把负荷往偏远节点塞导致总充电需求悄悄变大潮流计算结果凭空多出一部分功率差额。优化完成后方案在物理上根本落不了地。后来我强制在分配子函数里做了总需求守恒检查每次分配完成后断言 sum(D_actual) 与 sum(D0) 的相对误差小于1e-6不满足就重新修正转移量。还要注意分配时要考虑充电站容量上限如果一个接收节点容量余量不够不能硬塞要按容量比例重新分配。这个修正逻辑比在粒子群约束里写方程要可靠得多。5.4 Matlab代码性能优化技巧最后说几个纯Matlab层面的优化经验。第一配电网节点数不多但潮流迭代里会反复操作稀疏矩阵最好提前用sparse预分配别在循环里反复做全矩阵索引。第二不要在适应度函数里用全局变量传递系统参数用struct结构体传入否则后面改parfor并行时会因为全局变量冲突报错很头疼。第三粒子群每代都要算所有粒子的适应度如果一个粒子的位置和上一代一模一样使用记忆列表直接返回已算过的目标值省掉一次潮流计算。这个优化在迭代后期非常有效因为粒子会慢慢收敛到最优附近重复位置越来越多。还有个技巧是用Matlab Coder把powerflow函数编译成C扩展或者用mex编译调用速度能再提升一个档次。如果项目后期要跑大规模算例这一步值得投入时间。写到这里我不打算再做总结了。这轮项目做下来我最大的体会是算法本身没什么高深的关键是把空间可调度这个物理特性建模建扎实。你与其花时间调粒子群的惯性权重不如把每个节点的可调度系数、不便成本、充电需求守恒这些底层逻辑想清楚。如果你正好也在做类似的DG和充电站联合配置我的建议是不要一上来就上完整模型先把方案2的联合优化跑通再逐步加可调度模块。算例系统、节点、参数都可以按你的实际平台改但这个框架是通用的。后面如果想继续深入可以考虑换成多目标NSGA-II或者把充电负荷的随机性用鲁棒优化包进来都是很好的方向。
返回列表