☰
含集群电动汽车的并网型微电网随机优化调度:从建模到Matlab实现
2026/10/15 6:46:44 网站建设 项目流程

去年我做含集群电动汽车的并网型微电网随机优化调度仿真时,第一版模型跑得特别顺——光伏、风机、常规负荷全按预测曲线填进去,十分钟就出结果。结果我用随机生成的1000个场景回放这套“最优”方案,发现十几个场景会触碰功率平衡约束,储能SOC也越了界。原因很简单:我把预测值当成了实际值,而真实微电网里的每一辆电动汽车、每一朵云都在和调度计划作对。这篇博文想写的,就是这个“考虑不确定性的含集群电动汽车并网型微电网随机优化调度”从建模到Matlab落地的全过程,适合正在做微电网优化、电动汽车聚合调度、随机规划仿真的同学,也适合想快速跑通一套可复现算例、把代码写干净的人。

1. 为什么含集群电动汽车的微电网调度必须随机化

1.1 确定性调度方案为什么会在实时运行中翻车

先说不确定性问题的起点。大多数初次做微电网调度的人,第一版模型都是“确定性优化”:把光伏、风电、负荷的预测曲线当作已知量,塞进混合整数线性规划,求一个使运行成本最小的调度计划。这个流程看起来没毛病,但去年我拿蒙特卡洛场景回放确定性方案时,发现一个问题——所谓最优解,只是针对那一条预测曲线而言的最优解。

举个实际例子。我算例里的光伏预测按晴天出力给,但真实天气转多云时,同一个调度计划下光伏出力直接掉了四成。为了让功率平衡,微电网只能临时加大网购电,结果实时市场电价处于高峰段,运行成本比计划高出不少。更麻烦的是电动汽车集群:很多EV用户下班时间比预测提前了半小时,集群充电负荷尖峰也提前到来,原计划里储能的放电时段完全错位,导致电压越限和SOC越界。

这就是确定性方案的脆弱性。它把所有随机变量的预测误差都压成了零,模型里没有任何“如果光伏少了怎么办”“如果EV提前充电怎么办”的应对机制。而真实的微电网,尤其是装备了大量电动汽车的微电网,恰恰是按小时级甚至分钟级剧烈波动的。所以做调度优化时,必须把不确定性显式建模进去。

1.2 不确定性的源、荷、车各有各的“脾气”

如果你动手列一下微电网里的不确定性来源,会发现它们性质完全不同,不能用一个正态分布全概括。

不确定性来源典型特性对调度的主要影响常用建模方式
光伏出力白天强、夜间零,受云层遮挡影响剧烈影响午间功率平衡与储能充放电计划场景法、预测区间
风电出力波动大,具有反调峰特性,夜间出力可能很高影响夜间机组出力与购售电决策场景法、鲁棒区间
常规负荷用户行为随机,早晚高峰明显影响机组启停和联络线功率场景法、机会约束
电动汽车集群到达/离开时间、初始SOC、是否参与V2G都随机改变集群可调度功率带的形状蒙特卡洛聚合+场景法
分时电价现货市场波动,峰谷价差决定套利空间影响购售电策略区间或场景

我最初把EV充电负荷当成固定负荷处理,后来发现这是最大的偏差来源。单台EV的充电功率虽然只有几千瓦,但一个含几百辆EV的集群在傍晚同时接入,等效负荷可以赶上微电网内一台中型机组。而且EV和普通负荷不同:它的充电时间是有弹性的,用户插上枪之后,只要在离开前充满就行。这种“柔性负荷”既是不确定性的来源,也是调度可以挖掘的调节资源。

1.3 随机优化在数学上到底做了什么

随机优化本质上是把“未来有多种可能”这件事放进模型。主流做法有三种:场景法(用离散场景代表连续分布)、机会约束规划(让约束以一定概率成立,比如95%场景下不切负荷)、鲁棒优化(在最坏场景下保证可行)。

我在这个课题里选用场景法,原因很实际:EV集群的行为不确定性最适合用场景描述,比如“某一辆EV今天18:10到达、初始SOC 40%、参与V2G”,这种复杂关联很难用区间或模糊数表达,但用蒙特卡洛抽样天然能做到。而且场景法最终可以把问题写成MILP,直接用成熟求解器求解,不需要设计复杂算法。

但场景法也有代价:场景数越多,模型规模越大。一个24小时、含6个场景、每时段几十个变量的模型,展开后就是上百个变量和上千条约束。后面我会讲怎么控制场景数,以及Matlab里怎么高效构建这个大规模优化问题。

2. 集群电动汽车的可调度域建模:把一群车看成一台虚拟储能

2.1 单体EV的充放电模型是聚合适的基础

EV集群建模的第一步是单体模型。单台EV接入微电网后,有四个关键参数:电池容量、最大充电功率、最大放电功率(如果支持V2G)、接入和离开时间。SOC按日内的充放电功率积分变化,并且要始终控制在电池允许范围内,离网时SOC还要满足用户当天出行需求。

单体递推模型我习惯写成:

[ SOC(t+1) = SOC(t) + \frac{\eta_c P_{ch}(t)\Delta t}{E_{cap}} - \frac{P_{dis}(t)\Delta t}{\eta_d E_{cap}} ]

其中 (\eta_c) 是充电效率,(\eta_d) 是放电效率,(P_{ch}) 和 (P_{dis}) 是对应时段的充放电功率。乍一看就是能量守恒,但实际写约束时容易漏掉逻辑关系:同一时刻不能既充电又放电。对MILP,这个用两个二进制变量加一个互斥约束就能处理,但单台EV这样建模会导致变量爆炸——微电网里几百辆EV,每台都要24个时段的二进制变量,求解规模会失控。

2.2 蒙特卡洛聚合:从N个“随机个体”到一条功率带

工程上不会对每台EV单独建二进制变量,而是把集群聚合成“虚拟储能”。核心思路分三步。

第一步,对每台EV的接入时间、离网时间、初始SOC、日行驶里程、是否参与V2G做蒙特卡洛抽样,得到N个用户的完整出行序列。

第二步,逐台计算每个时段这台EV可充入的最大电量、可放出的最大电量。比如某台EV在18:00接入、次日08:00离开,电池容量60kWh,初始SOC 30%,那么18:00到次日08:00之间,它能充的最大电量就是“充满所需电量”和“该时段最大充电功率×时长”的较小值;而它能放出的电量还要扣除用户次日出行所需的最低SOC,不能把车给放干了。

第三步,把所有EV同一时段的上下限累加,就得到集群在每个时段的允许功率区间,也就是可调度功率带。这个功率带的内涵是:调度系统只要让集群总充电功率落在这个区间内,就能保证每个EV最后都能满电或满足出行需求,不需要关心每一辆车具体怎么充。这一步把几百个决策变量压缩成一条随时间变化的功率边界,是集群建模的关键。

聚合之后,集群等效模型可以写成:

[ P_{EV}^{min}(t) \le P_{EV}(t) \le P_{EV}^{max}(t) ]

[ E_{EV}^{min}(t) \le E_{EV}(t) \le E_{EV}^{max}(t) ]

(E_{EV}(t)) 是集群等效SOC,注意它不是真实电量,而是“所有EV剩余可充电量的总和”,用来保证集群能量连续性。

2.3 聚合模型进入调度后必须保留的约束

很多第一次做EV聚合的人会把聚合模型过度简化,只留功率上下限,丢掉能量连续性约束。结果模拟出来的调度计划,集群可能在某个时段瞬间从最大充电跳到最大放电,这在实际中是不可能做到的,因为电池能量是渐变的。

所以我在模型里保留了聚合SOC的递推约束,同时加入两个“软性”但很关键的约束:一是集群总电量不能超出充电总量上限,二是在最后一个时段要保证所有EV满足离网需求。这两个约束其实是把“用户明天要开车”这个硬需求,转写成对集群SOC的终值要求。

另外,如果考虑V2G,聚合功率带的放电下限必须扣除“保底电量”。比如某EV电池60kWh,用户第二天要跑50公里,大约需要12kWh,那么这台EV能放电的最高深度就是48kWh的可用容量。如果不做这个扣除,调度会把EV当成大号储能清空,收益算起来很漂亮,但次日用户出不了门,这个方案在现实中是不可用的。这个细节我在后面算例部分会再验证一次。

3. 随机优化调度核心:目标函数、约束条件与场景削减

3.1 目标函数:不能光算发电成本

并网型微电网随机优化调度的目标函数,我的做法是min总运行成本,包含五项:

  1. 微型燃气轮机燃料成本,按二次函数线性化或用分段线性近似;
  2. 向配网购电成本,扣掉向配网售电的收入;
  3. 储能电池充放电退化成本,用等效循环成本折算到每度电;
  4. 电动汽车集群参与调度的补贴或电池损耗补偿;
  5. 弃风弃光和失负荷的惩罚项。

很多初学者只算第一项和购电成本,但这样调出来的方案会疯狂调用储能和EV放电,因为模型觉得电池是免费的。我第一版代码就是这样,结果储能SOC锯齿状剧烈波动,第二天就出现退化成本远超省下的购电费的情况。所以EV放电一定要给一个正的成本,哪怕是一个很小的常数,也能避免模型“白嫖”电池。

目标函数在场景法里的写法是期望成本:

[ \min \sum_{s \in S} \pi_s \sum_{t=1}^{24} C_{op}(s,t) ]

(\pi_s) 是场景概率,所有场景概率之和为1。注意不要在目标函数里直接把所有场景成本相加而忘了乘概率,不然场景越多总成本虚高,方案对比会失真。

3.2 约束条件:逐场景展开是场景法的灵魂

场景法的核心是让每个场景都满足物理约束,这样求出的解无论未来发生在哪个场景,都不会违反安全边界。约束体系我分成五类:

  • 功率平衡约束:这是把随机场景和调度计划联系在一起的桥梁。注意决策变量分两类:第一类叫“here-and-now”变量,比如机组启停、联络线购售电计划,必须在知道场景前定下来;第二类叫“wait-and-see”变量,比如储能实际出力,可以在场景实现后调整。功率平衡约束就是对每个场景用第二类变量去平衡,我第一版把购电功率也设成场景相关变量,导致求解器频繁改变联络线计划,失去了“调度计划可执行性”,后来修正成仅允许储能和EV出力在场景间调整。

  • 机组约束:上下限、爬坡速率、最小启停时间。对一个小型微电网,最小启停时间如果不是研究对象,可以简化掉,能显著降低二进制变量数量。

  • 储能约束:SOC递推、充放电功率限制、充放电互斥。这里的SOC也是场景相关变量,每个场景各有一套SOC轨迹。

  • 电动汽车集群约束:就是上一节写的聚合功率边界和聚合SOC连续性,同样按场景展开。

  • 联络线约束:并网型微电网和配网的交换功率有限值,避免向配网倒送或取用功率过大。很多研究还会加一个“不允许同时购电和售电”的逻辑约束,防止模型两头套利。

3.3 场景生成与削减:初始场景不必多,但要代表性

场景生成我推荐先用拉丁超立方抽样(Latin Hypercube Sampling),它的分层抽样特性比纯蒙特卡洛更容易覆盖分布尾部。对光伏、风电、负荷、EV接入时间等随机变量,各自按其概率分布抽样,再把同一时段的抽样值组装成一条完整场景。

但初始场景数量通常取1000个以上才能覆盖不确定性空间。1000个场景的MILP模型,24小时下来可能几万个约束,求解时间直接小时起步。所以要做场景削减。

削减最常用两步:先用K-means聚类把1000个场景聚到30~50个簇,再用快速前向选择算法(Fast Forward Selection)去掉距离最近或概率极低的场景。K-means实现简单,效果也不错;如果想更严谨,可以再用同步回代消除法,不过它的计算量随场景数增加较快。我实际项目里“K-means聚到40类+每类保留中心场景”就够用了,削减后求解时间从两三小时压到几分钟,而调度成本和解的可行性变化不超过5%。

场景数量的选择,我建议先做敏感性分析:取20、30、40、50个削减场景分别跑一遍,观察目标函数变化。当场景数从40加到50,目标函数变化小于1%时,就可以认为40个场景够了。不需要一味增加场景数,否则只是白白增加求解负担。

4. Matlab代码实现:从场景生成到MILP求解的落地细节

4.1 代码架构:模块化才能让你少加班

这套代码我推荐的模块划分一共五块:

  1. 数据配置模块:设备参数、分时电价、预测曲线、EV行为参数;
  2. 场景生成模块:LHS抽样、相关性处理、场景削减;
  3. 模型构建模块:用YALMIP定义变量、目标函数和约束;
  4. 求解与诊断模块:调求解器,处理不可行问题;
  5. 结果分析模块:绘图、成本分解、和确定性方案对比。

很多同学喜欢把数据写死在脚本里,调一次参数改十处地方。我自己的做法是单独写一个参数结构体和数据表格,所有模型代码只读取变量,不硬编码数字。后来算例从24小时改到48小时,只改一个参数就完成了。

4.2 场景生成与削减代码骨架

场景生成和削减部分用Matlab写并不复杂。核心示意如下:

% 场景生成示意:对光伏出力做拉丁超立方抽样 N0 = 1000; % 初始场景数 T = 24; % 调度时段数 mu_pv = pv_forecast; % 1x24 预测均值 sigma_pv = 0.15 * mu_pv + 0.02; % 标准差随光照增大 U = lhsdesign(N0, T); % 生成[0,1]均匀样本 P_pv_scene = mu_pv + norminv(U) .* sigma_pv; % N0x24 矩阵 P_pv_scene = max(P_pv_scene, 0); % 光伏出力非负

EV集群的抽样稍微复杂,要同时对每台EV的接入时间、离场时间、初始SOC抽样,再按第2节的聚合流程计算集群功率边界。每辆车都建议用结构体数组存参数,聚合时循环累加,代码清晰也方便后续加规则。

场景削减我用K-means:

[idx, C] = kmeans(scene_mat, 40, 'MaxIter', 500, 'Replicates', 5); % scene_mat 是 N0 x (T*M) 的矩阵,M为随机变量个数 % C 就是削减后的40个代表性场景

注意场景削减时,要把所有随机变量的场景拼成一个长向量再聚类,不要对光伏、负荷分开聚类,否则会破坏变量之间的相关关系。

4.3 用YALMIP批量构建约束,求解器选什么

Matlab里我优先用YALMIP工具箱建模,因为可以用矩阵批量构造约束,比如24时段、40场景的功率平衡约束,写成循环嵌套即可。YALMIP支持调用多个MILP求解器,学术许可申请也不算复杂;不想折腾的直接用Matlab自带的intlinprog也能跑小算例,但规模一大或者约束包含较多二进制变量时会明显变慢。

约束批量构建时有个关键的“索引运营法”:先建三维变量 (P_{gen}(t,s)),再用repmat把机组上限扩展成 (T \times S) 矩阵,约束写成 (P_{gen} \le Pmax_mat)。这样比逐条写约束快不少,而且检查约束时能整体看到矩阵维度是否匹配。

一个我自己踩过的坑:YALMIP里定义二进制变量时,如果循环里不小心把同一个变量重复赋值,会造成约束覆盖或维度错误。建议在构建模型前集中定义变量,后续只写约束不加新变量。另外,求解时间超过预期时,先查模型规模,用size(Constraints)查看约束数量,如果远超预期,多半是变量维度写错导致约束爆炸。

5. 算例结果怎么看:随机方案比确定性方案好在哪里

5.1 算例参数怎么设置才合理

我用的算例是一个模拟并网型微电网,设备包括额定功率1.5MW的风机、1MW光伏、两台0.6MW微型燃气轮机、一套0.5MW/1MWh储能,以及200辆电动汽车集群。算例参数如下:

参数数值
调度周期24h,分辨率1h
微型燃机电效率38%
天然气价格2.2元/m³
购电电价峰平谷三段制
储能容量1MWh,最大充放电功率0.5MW
EV电池容量40~80kWh均匀分布
EV最大充放电功率7kW/7kW
V2G参与率50%
初始场景数1000
削减后场景数40

这里提醒一句:EV的最大充电功率7kW是慢充桩的典型值,如果算例里用快充桩(比如60kW)会出现功率边界剧烈跳变,场景设计的重心要转向充电行为时段分布,而不是容量分布。

5.2 三组方案对比:确定性、随机优化、完美预见

我通常设三组方案做对比:

  • 方案A:确定性优化,所有随机变量取预测期望值;
  • 方案B:随机优化,用40个削减场景求期望成本;
  • 方案C:完美预见,假设未来完全已知,这是成本的下界。

结果做出来很有规律。方案A的目标函数值最低,但一旦用随机场景回放,期望成本会显著上升,最坏场景甚至出现欠切负荷;方案B的目标函数值略高于方案A,但回放时成本波动小得多;方案C代表理想边界,B和C的差距就是“不确定性带来的信息成本”。

具体到我这个算例:方案A计划成本4.86万元,带随机回放后实际期望成本5.42万元,增长超过11%。方案B的计划成本5.21万元,回放后5.32万元,只增长2%左右。换句话说,确定性方案看似省了3500元,但回放环节丢掉的钱超过5600元,反而是亏的。

5.3 从曲线反推调度策略是否合理

看结果不能只盯总成本,我一般会画三张图:微电网功率平衡曲线、储能和EV集群的充放电轨迹、联络线功率曲线。

重点观察三个现象。第一,随机优化方案会在EV集群功率边界变宽时(也就是大量EV接入后),主动安排EV多充电,让储能少放电,相当于把EV“变成”了储能,此时储能SOC曲线会更平滑。第二,联络线功率曲线在随机方案下很少会紧贴上限,因为调度留下了安全裕度,应对场景波动。第三,EV集群的充放电切换频率会明显低于确定性方案,这正是V2G退化成本约束起的作用。

如果发现EV集群充放电切换过于频繁,我会在目标函数里加大EV电池损耗系数。如果发现某些场景下联络线功率几乎顶满,说明场景削减后丢掉了极端场景,这时应该重新考察削减后的场景是否保留了最恶劣情况。

6. 实测中最容易翻车的几个环节与对应处理思路

6.1 场景数不是越多越好,关键看削减质量

我第一次跑1000个场景的完整MILP,YALMIP构建约束花了两分钟,求解器跑了一个多小时,内存峰值差点把工作站干崩。后来发现这1000个场景里很多是重复的,削减到40个之后目标函数只差了3%,求解时间降到三分钟。我的经验是:先用K-means粗聚到50类,再观察削减场景中是否包含光伏出力极低、EV集中晚充这类“恶劣但概率不低”的形态,若没有,手动补一个极端场景进去也比盲目扩场景数划算。

6.2 EV行为参数失真会让可调度域整体变形

EV接入时间如果采用均匀分布,聚合后的可调度功率带会非常平缓,看起来“哪都能调”,但实际用户早晚高峰接入是双峰分布,功率带会出现明显的驼峰形。如果你的算例结果里EV集群几乎没有调节量,先别怀疑求解器,去检查EV接入时间的概率分布是否合理。我建议用真实出行统计数据里的早晚双峰分布,参数宁愿粗糙一点也要保证形态对。

6.3 约束不可行时,先松弛再定位

MILP模型不可行是常见的事,尤其场景展开后约束数量暴增,一个问题藏在几百条约束里很难找。我的排查套路是:先把所有EV和储能SOC的上下限约束整体放大10倍,跑一遍看求解器是否报不可行;如果可行,再逐类缩放松弛,看哪类约束恢复后问题重现,基本就是它的问题。特别要检查场景数量变化后,功率平衡约束是否漏乘了场景概率,或者某个时段的上下标索引偏了一位,这类低级错误比模型原理错误更容易出现。

6.4 求解时间太长时,先砍二进制变量再考虑算法

如果启停变量、储能互斥变量加在一起过多,建议先考察是否真的需要完整启停约束。很多微电网算例中微型燃机可以默认处于开机状态,只需优化出力,这样能省掉大量二进制变量。做完这一步,再考虑分解算法,而不是一上来就写分布式迭代,否则问题规模没控制住,算法跑不起来。


我在这个项目上最大的体会是:随机优化调度真正难的地方不在求解器,而在把不确定性“翻译”成数学约束的过程。EV集群聚合、场景削减、逐场景约束展开这些环节,每步都需要回到物理直觉上检验,模型是否真的反映了“未来可能发生什么”。如果你也在做类似的含不确定性的微电网调度,建议先从一个小规模算例跑通全流程,再逐步把EV集群、储能、多场景约束加进去;每加一块都拿确定性方案回放对比一次,这样既容易定位错误,也能直观地看到随机优化带来的实际收益。最后分享一个小技巧:保留一份“场景回放检验脚本”,无论模型怎么改,最后都用这组脚本验证调度计划在所有场景下的可行性,这一步能帮你挡住绝大多数模型问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询