ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于蒙特卡洛模拟的电动汽车充电负荷预测方法及Matlab实现

基于蒙特卡洛模拟的电动汽车充电负荷预测方法及Matlab实现 1. 蒙特卡洛方法在充电负荷预测中的定位1.1 为什么充电负荷预测不能“拍脑袋”电动汽车充电负荷和传统居民负荷最大的区别在于它具有很强的随机性。家里开空调、看电视用电行为相对稳定历史负荷曲线能反映大致规律。但电动汽车用户什么时候插枪、插上之后充多久、用快充还是慢充、今天跑了多远才回来充电这些变量叠加在一起负荷曲线就会呈现明显的随机波动。如果直接用典型负荷曲线乘一个系数去估算结果往往会偏乐观或偏悲观到了实际运维阶段就会出问题。举个例子一个小区配变容量是630kVA物业想新增50个充电桩。如果按每台桩7kW同时满载计算新增负荷350kW配变肯定顶不住。但如果考虑实际使用情况很多车夜间才插枪、充电功率还会逐步下降同时率远达不到100%。到底该按多少容量报装这就需要通过负荷预测给出一个带概率区间的答案而不是简单粗暴地“全乘起来”。蒙特卡洛方法的价值正在于此它能把各种随机因素的分布特性考虑进去模拟出成千上万种可能的充电场景最终给出负荷的期望曲线、概率区间以及最恶劣情形下的峰值。1.2 蒙特卡洛到底解决了什么难题蒙特卡洛本质上是一种基于随机抽样的数值计算方法。面对充电负荷预测这种“输入变量随机、输出无解析解”的问题它不尝试推导一个复杂的数学公式而是通过大量重复模拟让随机变量的统计规律自然浮现出来。具体到充电负荷预测核心的随机变量包括电动汽车保有量、每辆车的起始荷电状态SOC、开始充电时刻、充电功率等级。这些变量各自服从一定的概率分布且相互之间存在耦合关系。比如起始SOC和日行驶里程强相关日行驶里程又和充电开始时间有一定关联。蒙特卡洛方法的长处在于它允许你在抽样时保留这些相关性不需要为了求解方便而强行假设所有变量独立这比传统的解析法更贴近实际情况。不过在开始写代码之前必须先建立清晰的物理模型而不是一上来就写循环。乱抽一通的结果就是程序跑完画出来的负荷曲线跟实际完全对不上最后还找不到原因。2. 充电负荷建模的完整思路拆解2.1 把充电过程拆成四个可量化的子模型一次完整的充电行为从电网角度看可以拆成四个环节车辆什么时候开始充电、充电时电池当前电量有多少、充电功率是多少、充多长时间能结束。这四个环节对应四个子模型每个子模型都需要从统计数据中提取概率分布参数。第一个是起始充电时刻模型。调研数据表明私家车用户绝大多数在下班回家后充电集中在18点到22点之间峰值通常在19点到20点。这个分布可以用正态分布或分段正态分布来拟合均值大概在19点左右标准差在2到4小时之间。如果研究对象包含营运车辆分布形态会完全不同网约车司机的充电行为更分散甚至会出现凌晨和午后的双峰特征。第二个是日行驶里程模型。用户每天开多少公里直接决定充电前电池剩余电量。统计上私家车日行驶里程近似服从对数正态分布均值约30到50公里标准差根据城市规模和出行习惯略有差异。也有文献采用伽马分布拟合效果差不多但要注意左端截断行驶里程不能为负。第三个是起始SOC模型。这里不能独立抽样而应该先抽日行驶里程再根据车辆续航里程换算得到起始SOC[ SOC_{start} \max\left(SOC_{min},\ 1 - \frac{D}{R}\right) ]其中D是日行驶里程R是车辆标称续航SOC_min是车主不会接受的极低电量阈值通常设为0.1到0.2。这个换算关系隐含了一个前提车主每天回家就会充电。如果考虑“每两天充一次”的行为习惯就需要额外引入充电频率变量模型复杂度会上升一个档次。第四个是充电功率模型。慢充桩功率通常为3.5kW或7kW快充桩为30kW到120kW不等。实际建模时可以按比例随机抽取比如住宅区慢充占90%、快充占10%商业区反过来。要注意的是实际充电过程中功率并不恒定电池SOC达到80%以后充电功率会明显下降。如果预测时间尺度是15分钟一个点可以在充电末段做功率降额处理不处理的话峰值估计会偏高。2.2 概率分布的选择不能照抄论文很多论文直接引用国外调研数据比如美国家庭出行调查NHTS里的充电起始时间分布套到国内场景就失真。国内城市通勤距离更长、上下班时间更集中、小区停车位紧张充电行为曲线整体会后移且更陡峭。建议有条件的话从当地充电运营平台拿脱敏数据重新拟合分布参数或者至少参考国内高校针对本地城市的调研结果。概率分布选定后需要用拟合优度检验验证一下常见的做法是卡方检验或K-S检验。不要以为把数据导入histfit函数画个图看着像正态分布就完事尾部偏差恰恰是影响负荷峰值预测精度的关键。尾部拟合不准模拟出来的极端峰值就不靠谱。2.3 蒙特卡洛模拟收敛的数学逻辑蒙特卡洛的精髓在于模拟次数N越大模拟结果的统计误差越小误差收敛速度与(\sqrt{N})成反比。这是一个很重要的工程直觉——想把误差降低一半模拟次数要增加到原来的4倍。如果每次模拟跑10000辆车重复5000次计算量就很可观了。实际做预测时我一般先跑一个粗略收敛测试分别用500、1000、2000、5000次模拟计算日峰值负荷的均值观察它是否趋于稳定。如果2000次和5000次的均值偏差在1%以内就说明收敛性可以接受没有必要盲目堆次数。另外可以画一下峰值负荷的频数直方图如果直方图形状稳定、没有明显的偏态摆动也说明模拟次数够了。注意收敛的是统计量均值、分位数不是单次模拟的负荷曲线。单次模拟结果永远是波动的千万别拿一次模拟的曲线去跟实际对比那样怎么对比都对不上。3. Matlab代码实现与核心环节落地3.1 程序整体框架设计Matlab实现蒙特卡洛充电负荷预测代码结构并不复杂但组织不好就会变成一团乱麻。我建议按以下模块划分参数初始化模块设置车辆数、模拟次数、时间分辨率、分布参数等随机场景生成模块抽取出每辆车的起始充电时间、起始SOC、充电功率单日负荷叠加模块把每辆车的充电功率曲线叠加到96个时间点15分钟间隔上统计后处理模块计算各时间点的均值、5%~95%分位数、峰值等可视化模块绘制负荷曲线、概率带和频数直方图。这种模块化结构的最大好处是方便调试和扩展。比如后续要加入快充桩功率曲线降额只需要修改第三个模块其他部分都不受影响。3.2 核心抽样逻辑与代码实现下面给出一个简化但完整可跑的核心代码框架。%% 参数设置 N_cars 5000; % 电动汽车数量 N_sim 2000; % 蒙特卡洛模拟次数 T 96; % 一天96个15分钟时段 result zeros(N_sim, T); % 分布参数示例值 t_start_mu 19; % 起始充电时刻均值小时 t_start_sigma 3; % 起始充电时刻标准差小时 D_mu 3.2; % 日行驶里程对数均值ln(km) D_sigma 0.8; % 日行驶里程对数标准差 R 400; % 平均续航里程km P_low 7; % 慢充功率kW P_fast 60; % 快充功率kW fast_ratio 0.1; % 快充占比 %% 蒙特卡洛主循环 for sim 1:N_sim load_curve zeros(1, T); for i 1:N_cars % 1. 抽样起始充电时间小时限制在0-24 t_start round(max(0, min(24, ... normrnd(t_start_mu, t_start_sigma))) / 0.25); if t_start 0 t_start 1; end % 2. 抽样日行驶里程换算起始SOC D lognrnd(D_mu, D_sigma); SOC_start max(0.1, 1 - D / R); % 3. 确定充电功率快充/慢充 if rand fast_ratio P P_fast; else P P_low; end % 4. 计算充电时长小时并累加负荷 E_need (1 - SOC_start) * 60; % 假设电池容量60kWh T_charge E_need / P; N_periods ceil(T_charge / 0.25); for j 0:N_periods-1 idx t_start j; if idx T load_curve(idx) load_curve(idx) P; end end end result(sim, :) load_curve; end %% 统计处理 mean_load mean(result, 1); % 各时段平均负荷 p5 prctile(result, 5, 1); % 5%分位线 p95 prctile(result, 95, 1); % 95%分位线 peak_mean max(mean_load); peak_p95 max(p95);这段代码有几个细节需要注意。时间段的索引处理是第一个容易踩坑的地方normrnd生成的是连续小时数比如19.7小时对应的时间段索引应该是(19.7/0.25 78.8)取整后落到第79个时段。如果车门在23:30开始充电充电时长跨过午夜超出部分需要截断或折算到次日简化的做法是直接忽略次日部分但这会导致日总电量偏低。更好的做法是把次日电量累加到第二天的负荷曲线上不过单日预测场景下可以接受截断。充电时长的计算也有讲究。(E_{need})是需要的电量除以充电功率得到充电小时数。但实际充电功率在SOC超过80%后会下降这意味着真实充电时间会拉长。严格做法是分段计算SOC从起始值充到80%用恒定功率80%到100%用降额功率常见降额系数取0.5左右。上面的简化代码没有处理降额用于教学演示没问题但如果要做容量配置决策建议加上。3.3 参数标定数据从哪来、怎么校准参数标定是整个流程里最决定预测精度的一环。以起始充电时间为例分布参数可以从问卷调研或者充电桩运营数据里提取。如果手头只有很少的数据可以做一个简单的核密度估计然后从经验分布里抽样Matlab里用datasample函数加权重就能实现。这种方式比强行套正态分布更稳妥。日行驶里程的分布参数可以结合城市统计年鉴里的私家车年均行驶里程来标定。比如某城市私家车年均行驶15000公里扣除节假日日均约40公里。把这个均值信息转化为对数正态分布的参数需要解一个简单的方程组。设定(E[D] \exp(\mu \sigma^2/2) 40)再根据文献取变异系数(CV \sigma / \mu)约0.6左右就能反推(\mu)和(\sigma)。充电功率的配比需要根据研究区域的实际桩型来定。小区以7kW交流慢充为主高速公路服务区以120kW直流快充为主如果研究对象是综合区域可以把快充比例设成变量做敏感性分析。3.4 结果收敛性判定技巧模拟跑完不能直接收工必须检查收敛性。我在工程实践中用双指标判断日均充电电量和峰值负荷。日均充电电量理论上应当近似等于(N_{cars} \times)日均行驶里程( \times )单位里程电耗如果模拟结果偏离这个理论值超过5%说明抽样逻辑或参数设置有误。另一个指标是峰值负荷随着模拟次数增加的变化轨迹。可以每500次记录一次当前累计平均峰值如果后500次与前500次的差值百分比小于2%就可以接受。如果迟迟不收敛有可能是起始SOC分布和充电时间分布之间的相关性没有建模导致极端场景频繁出现这时候可以考虑用拉丁超立方抽样替代纯随机抽样来降方差。提示Matlab里设置rng(2024)固定随机数种子可以保证每次运行结果一致。这在写报告和论文时非常重要审稿人或导师要求复现你直接再跑一遍就能得到完全相同的图省掉很多解释成本。4. 仿真结果分析与场景对比4.1 典型负荷曲线长什么样在参数取默认值时模拟得到的日负荷曲线通常呈现明显的“晚高峰单峰”形态。峰值出现在19:30到20:30之间与用户回家后插枪充电的行为高度吻合。峰值时刻附近15分钟的平均负荷可能是夜间谷时段的3到5倍这对配电网来说是一个不容忽视的冲击。5%到95%的概率带宽度能直观反映预测的不确定性。概率带越宽说明负荷波动越大决策时的安全裕度也要相应加大。如果概率带宽度超过均值的50%就要警惕模型输入参数的方差是否过大或者车辆数太少导致统计噪声太强。从频数直方图看单日峰值负荷通常呈现右偏分布。均值右偏意味着大多数情况下峰值低于均值但存在小概率出现极端高值。配电网容量规划更应该关注P95分位数或者P99分位数而不是均值否则极端天气叠加充电高峰时容易出问题。4.2 多场景对比渗透率、季节、充电策略把电动汽车数量和充电功率配比作为可变参数可以观察不同场景下的负荷变化规律。渗透率从10%提升到50%峰值负荷近似线性增长但峰现时刻基本不变因为充电行为的时间分布特性没有变。快充比例从10%提高到30%峰值会进一步抬升且峰现时刻有前移趋势因为快充用户更倾向于白天在商业区补电。季节因素的影响主要体现在空调电耗上。夏季和冬季电动汽车的单位里程电耗会上升同样日行驶里程下起始SOC更低充电需求电量更大。可以通过调整单位里程电耗系数来近似模拟结果一般是冬季峰值比春秋季高10%到15%。有序充电策略是另一个值得模拟的场景。如果设定一个简单的错峰策略——将20%的晚高峰充电转移到凌晨2点到5点模拟结果会显示晚高峰峰值明显削减但同时凌晨会出现一个新的负荷平台。这个平台能不能被电网接受需要结合当地负荷特性来判断蒙特卡洛模拟可以给出转移后的负荷曲线和峰值削减量为策略制定提供量化依据。4.3 结果如何应用到实际决策预测结果可以直接用于三个实际场景配变容量评估、充电桩布局优化和需求响应潜力分析。配变容量评估时用P95峰值负荷加一个安全裕度系数来决定变压器是否需要增容。比如某小区模拟得到P95峰值负荷380kW原有配变容量400kW看起来够用但考虑到同时还有基础生活负荷150kW总负荷530kW已经超过配变容量必须增容或加装有序充电控制装置。充电桩布局优化时可以把不同区域的充电需求负荷曲线叠加到路网和配电网模型上找出负荷密度高的热点区域优先布点。这也是蒙特卡洛方法相对传统经验法的一大优势它能给出空间维度和时间维度的双重负荷分布。5. 常见问题与排查技巧实录5.1 模拟结果不收敛、波动大表现不同次运行得到的峰值负荷差异超过10%或者画出的负荷曲线锯齿感非常强不像真实负荷曲线那样平滑。排查方向先检查车辆数是否太少。车辆数低于500时单车充电功率的离散性会直接体现在总负荷上曲线自然不会平滑。模拟次数不足也会导致统计量不稳定但可以通过观察峰值均值随次数增加的变化曲线来判断。另一个被忽视的原因是抽样样本的相关性。如果起始SOC和起始充电时间在建模时被设定为独立抽样实际上这两个变量存在关联——行驶里程高的车更可能在回家后立刻充电因为剩余电量已经不多了。忽略这种相关性会人为放大样本方差导致不收敛。解决办法是引入Copula函数或者简单的线性相关系数来耦合抽样。5.2 峰值异常偏高或偏低峰值异常偏高通常是充电起始时间分布的标准差设置太小。所有车都挤在同一个15分钟时段内开始充电叠加效果当然惊人。真实的充电行为分布更分散前后能拖两三个小时。峰值异常偏低则可能是起始SOC被高估。如果所有车回家都还有60%以上的电量实际充电功率需求就很小负荷自然上不去。建议打印一下充电需求电量E_need的分布如果均值小于10kWh明显偏小要检查日行驶里程分布参数和续航里程的匹配关系。5.3 和论文结果对不上很多人跑完自己的代码跟已发表论文的曲线一对比发现形态对不上就怀疑自己代码写错了。其实大概率是参数不同。论文里的曲线是在特定城市、特定渗透率、特定日期类型工作日/周末下得到的直接照搬没有意义。正确做法是记录自己的参数配置标注清楚模拟条件再与文献结果定性对比形态趋势。如果文献里是双峰曲线你模拟出的是单峰先检查研究对象是私家车还是网约车如果文献峰值在中午你的峰值在晚上检查是否混入了大量商业区快充桩。参数不同结论不同这很正常关键是每个参数都要有依据。5.4 运行时间过长车辆数10000、模拟次数5000的场景纯循环写法在普通PC上可能要跑几分钟到十几分钟。如果嫌慢有几个优化方向向量化代替for循环。把每辆车的充电时段和功率预先算成矩阵一次性叠加速度提升立竿见影并行计算。Matlab的parfor可以直接替代主循环里的for sim1:N_sim注意每次迭代之间不能有依赖关系抽稀。先用500次模拟定位参数问题跑通逻辑后再上大次数调试阶段不必每次都跑满。注意parfor并行池启动有额外开销模拟次数少于500时用并行可能反而更慢。另外并行循环内不要使用disp打印进度输出显示会成为瓶颈。6. 扩展方向与实践经验总结6.1 从单日预测到配电网协同潮流分析拿到负荷曲线之后下一步很自然的扩展是把负荷数据导入配电网潮流计算模型分析节点电压偏移、支路负载率、网损等指标。蒙特卡洛为潮流计算提供的不再是单一负荷值而是大量负荷场景样本这样就能得到节点电压的概率分布识别出最脆弱的节点和时段。具体做法是每次模拟生成一组负荷场景调用一次潮流计算程序记录关键节点的电压幅值。5000次模拟就得到5000组电压样本统计电压越限概率。这个思路在城市配电网规划和充电设施接入方案论证中非常实用。6.2 降方差技巧拉丁超立方抽样如果不想盲目增加模拟次数可以引入拉丁超立方抽样LHS。LHS的核心思想是把每个输入变量的分布均匀分层在每个层内随机取一个代表点保证采样点覆盖整个分布空间。相比纯随机抽样LHS在相同样本量下可以显著降低估计方差尤其适用于输入变量维数不高的情况。在Matlab中实现LHS可以直接用lhsdesign函数生成一个(N \times d)的矩阵每一列代表一个变量的均匀分层抽样值再通过正态分布或对数正态分布的逆CDF变换映射到目标分布。替换掉原来的简单随机抽样收敛速度会有明显改善。6.3 从学术研究到工程落地的最后一公里学术研究可以用假定的分布参数跑出漂亮的曲线工程落地则必须面对真实数据。我在实际项目里最深刻的体会是模型的复杂度不是越高越好关键是匹配数据可得性和决策需求。举个例子给一个新建小区做充电设施规划其实用不着精确模拟每一辆车的SOC变化傻瓜式地按“每辆车充电功率乘以同时率”估出来的容量配电网校验也完全够用。但如果是评估现有配电网对无序充电的承载能力需要判断哪个台区先越限、什么时段越限就必须用概率方法因为确定性方法给出的“最恶劣场景”过于保守会带来不必要的投资浪费。蒙特卡洛方法在这类问题上的优势就是灵活、直观、易于实现。它不像解析法那样需要高深的数学推导也不像深度学习方法那样需要海量历史数据。只要物理模型建得合理、分布参数标定可靠它就能给出可信度很高的概率性预测结果。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进