ARTICLE DETAIL

资讯详情

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

电动汽车充电负荷蒙特卡洛建模:从概率分布到电网规划决策

电动汽车充电负荷蒙特卡洛建模:从概率分布到电网规划决策 干电网规划这些年我最怕客户问的问题就是小区配电变压器到底要不要给电动汽车充电预留容量留多了造价难看留少了冬天晚高峰可能直接过载。更难的是这个问题没有一个确定性答案——几百位车主的充电行为完全是随机的有的人下班到家立刻插枪有的人习惯半夜才充有的人一周只补一两次电还有人周末跑完长途回来电池已经见底。一开始我也试图用传统的平均负荷法估算结果发现估出来的曲线除了平滑基本没有参考价值。后来我把研究思路改成蒙特卡洛模拟专门分析电动汽车充电负荷特性才真正把“最坏情况”和“峰值时刻”这类问题算明白。下面我把从问题拆解、参数体系、仿真流程到结果判读的完整过程写出来给做电网规划、充电设施布局和新能源研究的同学参考。1. 为什么充电负荷建模绕不开“随机”两个字1.1 “平均用户”模型为什么会失真“把一辆车充满电需要多少度电”是有确定答案的但“一群车在同一时刻插上枪的总功率是多少”没有确定答案。普通居民负荷还有比较稳定的作息规律——工作日白天办公楼高、晚上居民楼高电动汽车充电负荷却叠加了出行需求、补能习惯、电价刺激甚至当天天气。我见过不少早期分析报告喜欢取“单台车日均充电功率”乘以车辆总数得到一条平滑的负荷曲线。这个结果除了好看没有太多规划价值。真正的电网风险往往来自“随机叠加”的极端场景。举个例子一个100户的小区变压器容量按630kVA配置如果其中50辆车在同一时段用7kW慢充光是充电功率就有350kW。即便考虑同时率只有0.4也是140kW加上原本的居民生活负荷非常容易逼近变压器上限。这种“巧合叠加”不可能靠平均法算出来但蒙特卡洛模拟可以。平均法最大的问题在于它把随机性当成了误差恨不得把它磨平。但对充电负荷来说随机性不是误差而是负荷特性的核心组成部分。规划人员真正要回答的问题是“峰值可能冲到多高”而不是“平均负荷有多高”。这就决定了建模思路必须反过来——从用户行为的概率分布出发大量抽样逐台计算再叠加成聚合负荷。1.2 三个随机源出行、充电、车辆本身我在搭模型时把随机性拆成三层后面的参数化完全按这个框架来做出行行为。一天跑多少公里、几点到家、周末是否用车这些全是随机变量。日行驶里程的分布通常右偏大部分人每天三四十公里少数人跑上百公里到家时间则集中在傍晚但也有夜班、加班、应酬等各种偏移。充电行为。几点开始充、用快充还是慢充、充到多少电量取决于用户习惯和充电桩条件。家里有桩的人习惯下班插上依赖公共桩的人则要等车位、排队充电时刻更加分散。车辆自身。电池容量、能耗水平、充电功率上限在不同车型之间差异很大。同一支充电桩出租车和私家车的电池容量完全不同快充曲线也不一样。三层叠加之后任何“典型用户”的假设都会失真。你不能说“平均每辆车每天充30度电”因为有些人根本不充有些人跑一趟长途要充两回。要正确描述群体就得让每一辆车都从各自的分布里抽样然后把结果放回同一条时间轴上。1.3 单次抽样只是故事大量抽样才是规律蒙特卡洛的核心思想听起来很简单如果你不知道一个随机过程的结果就反复抽样本把结果统计出来。抽一次样本对应的可能只是一个虚构车主的“一天”看起来毫无意义但几千辆车、几千次模拟之后样本的频率分布就会逼近真实的概率规律。我常用一个比喻来解释你没法提前知道明天傍晚小区里会有多少辆车同时充电但你能知道“傍晚六点到九点之间车主要充电”这件事发生的概率。蒙特卡洛就是把这个概率“翻译”成功率值——比如“95%的模拟场景下傍晚峰值不会超过某个值”。有了这个值规划人员才能做容量决策。2. 蒙特卡洛在这里到底做了什么从概率描述到负荷曲线的“翻译官”2.1 一次完整的蒙特卡洛流程长什么样流程不复杂就三步抽样、计算、统计。对充电负荷来说“抽样”是给每台车抽取电池容量、日行驶里程、到家时间、充电方式等参数“计算”是把这些参数代入车辆模型生成一条时间轴上的充电功率序列“统计”是把所有车辆、所有模拟轮次的功率序列叠起来计算每个时刻的均值、标准差和分位数。初始状态只能描述“某一辆车某一天”的行为这本身没有预测意义。但如果车辆数足够多、模拟轮次足够多叠加出来的曲线就能反映群体规律。这正是蒙特卡洛在充电负荷研究中的位置——它不是一个物理模型而是一个把用户行为概率分布“翻译”成电网侧负荷数据的方法。2.2 为什么解析法在这里不好使从数学上看充电负荷可以写成一个积分把所有可能出现的用户状态代入车辆模型再按照状态概率加权求和。这个积分看起来优雅实际根本算不动。原因至少有三个第一充电功率时间序列不是简单函数。车辆在某个时刻充电与否取决于它之前跑了多远、几点到家、电池容量多大是一连串条件判断的结果没法用解析式表达。第二跨时段状态耦合。晚上十点是否还在充电取决于下午六点插枪时的起始SOC。解析法处理这类强耦合非常吃力但蒙特卡洛抽样时可以很自然地按时间轴一步步推演。第三我们想要的不只是期望值。解析积分能用也最多给出一条平均曲线但规划需要的是分位数、极端场景。蒙特卡洛可以存下每轮模拟的完整曲线事后想算哪个统计量都行。我不反对在简化场景下用解析法做快速估算但涉及具体小区、具体车型构成、具体充电桩配比时蒙特卡洛的可扩展性要好得多。2.3 输出不是一条曲线而是一个分布这是蒙特卡洛建模和确定性建模最本质的区别。确定性模型跑完只给你一条曲线蒙特卡洛跑完得到的是每个时间点上一组完整的统计量均值、中位数、标准差、95%分位数、最大值。想象你有一条时间轴横轴是24小时纵轴是功率。蒙特卡洛会在每个“小时刻度”上铺开一个分布有些模拟轮次里这一小时没什么车充电有些轮次里挤了十几辆车。所有轮次结果放在一起你就知道这一小时功率的不确定性有多大。对规划和调度来说这个“不确定性”恰恰是最值钱的信息。变压器选型怕的是“95%场景下会出现的峰值”停电风险评估关心的是“极端场景下的最大负荷”储能配置看的是“峰谷差可能波动到什么程度”。一条均值曲线承载不了这么多决策需求。3. 先搭参数骨架一次仿真需要哪些输入数据3.1 车辆侧参数车辆参数是基础。电池容量决定“家底”能耗决定“消耗”充电功率决定“补充速度”。下面是我常用的一组参数模板参数分布/取值说明电池容量正态分布 N(60, 10)截断到20~100 kWh覆盖微型车到长续航SUV每公里能耗0.15~0.20 kWh/km按季节调整冬季开暖风取上限充电效率0.90~0.95交流慢充略低直流快充略高慢充功率7 kW家用交流桩主流规格公共快充功率50 kW城市公共快充桩常见规格超充功率120 kW部分场景使用但不是所有车都支持电池容量用正态分布描述是因为当前市场上的车型分布大致以60kWh为中心向两端扩散但存在明显的截断——既没有无限大的电池也没有小到不能跑的电池。每公里能耗我一般取0.15~0.20 kWh/km夏天取低值冬天取高值因为温度对电池可用容量和空调能耗影响很大。严格来说真实电池的充电过程包含恒流和恒压两个阶段充电功率不是恒定值。但在宏观负荷特性研究中用平均功率近似已经足够如果你要研究的是快充桩台区电压等问题那才需要做更精细的充电曲线模型。3.2 出行与充电行为参数这一块是整个模拟的灵魂直接决定负荷曲线的形状。参数选择必须基于实际出行调查数据或充电运营平台数据不能拍脑袋。参数分布/取值说明日行驶里程对数正态分布μ3.6σ0.8截断到1~300 km中位数约36 km右偏到家时间正态分布 N(18, 1.2)截断到8~24时通勤场景加班用户拖后起始SOC由行驶里程与能耗反向计算不能独立抽样充电方式概率家充0.6公共快充0.3单位慢充0.1按场景调整目标SOC大部分用户取1.0部分取0.8与用户习惯有关日行驶里程用对数正态分布最核心的原因是它只取正值而且天然右偏——大部分人每天开三五十公里少数人跑长途。到家时间用正态分布截断到白天描述的是“下班回家顺手插枪”这一典型行为但要注意晚班和社交活动会让它在尾部变长。这个分布如果拟合得不好晚高峰的负荷曲线就会失真。起始SOC这个参数非常关键很多新手在这里犯错误直接给它套一个均匀分布。正确的做法是让SOC与日行驶里程联动车跑得越远到家时电量越低需要充的电就越多。这两个参数天然强相关不能割裂开抽样。3.3 时间分辨率与边界条件参数定完了还要定“画布”。我一般先把时间轴定成1440分钟每1分钟一个点。为什么不用15分钟因为快充只需二三十分钟如果用15分钟粒度充电事件会被“抹”得很平峰值被严重低估。早期我用15分钟粒度跑慢充为主的场景误差还不明显一旦加入快充峰值差距立刻暴露出来。模拟窗口至少要24小时但直接“从零点开始模拟”会有边界问题零点时车辆可能已经在充电、SOC可能已经很低需要从一天前开始推算。我的做法是先跑一个24小时的预热循环把初始状态“转起来”再统计第二个24小时的数据。这样起始SOC和充电队列都是稳定状态下的自然结果而不是人为给定的。4. 仿真主流程从单辆车行为到全网负荷曲线4.1 单辆车的一天怎么“演”出来我在代码里对每辆车的处理逻辑是这样抽取电池容量、每公里能耗抽取日行驶里程计算这一天消耗的电量计算到家时的SOC 初始SOC - 消耗电量 / 电池容量抽取到家时间决定什么时刻开始考虑充电按概率抽取充电方式家用慢充、公共快充、单位慢充判断这辆车今天是否需要充电——如果只跑了三五公里SOC还很高可能不充计算充电需求量 (目标SOC - 到家SOC) × 电池容量计算充电时长 充电需求量 / (充电功率 × 充电效率)把一段功率序列放到时间轴上充电结束时间可以跨过零点。完整计算可以写成这样的伪代码mileage rng.lognormal(mean3.6, sigma0.8, sizeN) mileage clip(mileage, 1, 300) capacity clip(rng.normal(60, 10, sizeN), 20, 100) energy_consumption rng.uniform(0.15, 0.20, sizeN) # kWh/km # 到家SOC由行驶里程和能耗联动决定 soc_arrive clip(1 - mileage * energy_consumption / (capacity * 0.8), 0.1, 1.0) arrive_hour clip(rng.normal(18, 1.2, sizeN), 8, 24) # 充电功率按场景概率选择 power choose_with_probability([7, 50, 7], [0.6, 0.3, 0.1], sizeN) energy_needed (1.0 - soc_arrive) * capacity # SOC剩余很多的车今天不充 energy_needed where(soc_arrive 0.95, 0, energy_needed) duration energy_needed / (power * 0.92) # 小时对每一辆车这组参数只描述“它的一天”。它可能今天不充电也可能充到一半就满了可能晚六点准时插入慢充枪也可能半夜十二点才开到快充站。这些差异正是群体负荷曲线“长毛刺”的原因。4.2 批量聚合把所有功率序列叠到同一条时间轴算完单车行为之后下一步是把所有车辆产生的功率序列“叠”起来。如果一辆车在t1时刻开始充电、持续T小时、功率为P那就在时间轴上t1到t1T这个区间内把P累加进总功率序列。所有车都处理完之后得到的就是这组样本下全网的充电负荷曲线。这段聚合逻辑在代码里通常就是一个数组累加问题total_curve np.zeros(1440) for each vehicle: start_min int(arrive_hour * 60) end_min int((arrive_hour duration) * 60) for t in range(start_min, end_min): total_curve[t % 1440] power注意跨零点的情况。如果一辆车从23:00充电到次日03:00对应时间轴上的分钟索引是1380到1620求余后落到0到180分钟区间。如果代码里直接让索引越界数据就会悄悄丢掉第二天凌晨的负荷被低估。4.3 多轮模拟从一组样本到统计规律单组样本只代表一种可能的“世界”——比如某个随机场景下500辆车同时充电。但这不足以回答规划问题。我们要知道的是换了另一批车辆结果会不会差很多所以蒙特卡洛要跑很多轮。每一轮都重新抽取全部参数生成一条负荷曲线跑完200轮、500轮甚至1000轮后把所有轮次的曲线按时间点统计。每个时间点上你有200个“功率观测值”可以算出均值、标准差和95%分位数。理论上模拟轮次越多统计结果越稳定。但计算量也在涨。以500辆车、1分钟分辨率、500轮模拟为例单车循环加上聚合循环的计算量是上亿次操作。虽然现代电脑能扛住但设计实验时还是要控制轮次不要无脑拉满。5. 结果读法从曲线里挖出关键指标和边界场景5.1 曲线形态峰、平台与毛刺无管理充电的典型场景下负荷曲线通常会有一个明显的“晚高峰”从傍晚开始爬坡持续到深夜甚至凌晨。原因不难理解通勤用户下班到家、插上慢充枪充电功率同时启动形成叠加。如果快充比例高曲线会长出一些“白天小毛刺”——那是网约车、出租车在白天临时补电形成的。读曲线时别只盯着均值。均值曲线往往比实际场景“温和”得多因为它在几百轮模拟中把高峰和低谷互相抵消了。我建议同时画出三条曲线均值、95%分位数、最大值。95%分位数才是容量规划该看的曲线——它告诉你“大概率不会超过这个水平”而最大值则代表风险上限。5.2 关键指标不能只靠眼睛看曲线是给人看的但决策需要指标。下面是我每次仿真后必算的指标表指标定义用途充电峰值功率充电负荷曲线的最大值判断对变压器容量的冲击峰谷差峰值功率 - 谷值功率储能容量配置同时率峰值功率 / (充电车辆数 × 平均功率)设备利用效率评估95%分位数峰值95%模拟轮次不超过的峰值容量裕度决策总充电电量曲线对时间积分能耗总量、电费测算峰值时刻峰值出现的具体时间错峰策略设计同时率这个指标特别有意思。慢充为主的住宅场景里同时率可能在0.4~0.6之间因为不是所有人都同一时刻插枪但快充站场景里同时率可能很高因为车辆集中到达、集中充电。规划公共快充站时如果套用住宅同时率变压器容量必然不够。5.3 情景对比把参数变成决策依据蒙特卡洛不是为了算一条曲线而是为了对比不同情景。我最常用的三个对比维度渗透率。把电动汽车占全部车辆的比例从10%逐步拉到30%、50%看充电峰值怎么变。渗透率越高晚高峰负荷叠加越严重而且峰现时刻会往后推因为大量慢充车辆从傍晚一直充到凌晨还没有全部完成。快充/慢充结构。快充比例提高后充电事件时间上更分散但单台功率高曲线从“平滑平台”变成“尖锐尖峰”。对电网来说尖峰比平台更危险因为更容易冲击局部设备。工作日/周末。工作日曲线有明显的通勤特征傍晚高峰集中周末出行量和目的地不确定性大充电行为更分散峰值通常低于工作日但白天也可能出现充电小高峰。我不推荐只跑一个“基准场景”就下结论。蒙特卡洛的价值就在于低成本试错同一套代码改一个概率参数就能观察结果变化。这比真实世界做实验高效得多也安全得多。6. 实操里真正难的地方相关变量、收敛性与复现性6.1 变量之间的相关性才是最大的坑这是我最想强调的一条经验。很多第一次做蒙特卡洛的人习惯把每个参数独立抽样然后扔进模型。问题在于现实中的变量不是独立的。最典型的例子是日行驶里程和起始SOC。跑得越远到家时电量就越低这是物理关系决定的。如果你把里程和SOC分别独立抽样会出现“跑了100公里到家还有90%电”这种荒谬的组合直接导致充电需求被严重低估。正确的做法是在抽里程时就把SOC算出来SOC 1 - 里程 × 能耗 / 电池容量。也就是说SOC不是一个独立抽样变量而是其他变量的“结果”。同样的问题也存在于电池容量和每公里能耗之间电池大的车往往能耗也高但这一层耦合可以用车型分类来近似处理。更复杂的相关性比如节假日出行、电价高峰、温度变化可以用联合分布或Copula方法建模。但对普通项目来说把明显物理相关的参数绑定生成已经能解决80%的问题。6.2 收敛性判断什么时候可以停止加样本蒙特卡洛的误差大致按样本量的平方根下降也就是说想让误差缩小一倍样本量要翻四倍。很多人一上来就跑几万辆车其实大部分轮次是浪费的。我的收敛性测试分两步。第一步固定车辆数把模拟总轮次从100加到1000观察峰值均值的变化如果相对变化小于1%就说明轮次够了。第二步固定轮次把车辆数从500逐步加到5000看负荷曲线形状是否稳定。两步都收敛后再采信结果。如果你关心的是95%分位数单轮内部的车辆数要足够大否则分位数曲线会抖动得非常厉害。这个抖动的来源不是算法问题而是样本量不够的统计噪声。此时不要无限增加轮次更合理的做法是增加单轮车辆规模同时保持轮次在200~500之间。6.3 可复现性随机种子和实验记录蒙特卡洛天然依赖随机数但“可复现”对调试和审核非常重要。我在项目里强制做三件事第一固定随机种子。每个实验场景用不同的种子但同一场景在不同调试过程中用同一个种子这样代码改动后能对比结果差异来源。正式跑报告时把每个关键种子的结果都存成文件。第二记录完整参数表。蒙特卡洛结果的每一步都依赖于参数。只记录“跑了一次模拟”没有任何意义必须把车辆数、轮次、分布参数、时间分辨率、充电概率全部写进实验记录才能让结果可追溯。第三输出原始轨迹。别只保存均值曲线保存每一轮的总曲线。虽然占硬盘空间但发现异常时可以回放定位——哪一轮出现了极端峰值这一轮里的哪辆车贡献了大部分功率。6.4 时间分辨率、跨零点和其他边界效应除相关性外最容易出问题的就是时间处理。我用1分钟分辨率但每分钟都累加功率会让循环很慢。如果场景全是慢充15分钟分辨率也许够用但只要包含快充至少要用5分钟以下的分辨率。快充事件往往只有二三十分钟粗粒度会把峰值削掉两成以上。跨零点的问题前面提过这里再强调一遍所有充电事件的结束时间必须做一天周期的取模处理否则第二天的凌晨负荷曲线会出现“断崖”。我见过有代码把结束时间大于1440的功率直接忽略结果夜间负荷被低估得离谱。还有一个细节是“充满不拔枪”。真实用户经常在前一天晚上充满电后继续把枪插着充电桩和车处于连接状态但功率为零。对电力负荷来说这不影响功率曲线但如果你的模型要输出“充电桩占用时间”这类指标就必须区分“充电时长”和“连接时长”否则充电桩利用率会算错。7. 从负荷曲线到规划决策模型还能往哪走7.1 用蒙特卡洛做有序充电策略评估基础的蒙特卡洛结果描述的是“无管理充电”场景也就是所有用户想充就充。现实中电网可以通过电价、调度信号引导用户错峰充电。评估有序充电时我的做法是先把无管理场景跑出来作为基准再在单车逻辑里加入一条约束如果当前时刻是晚高峰就延迟充电开始时间或者限制充电功率。这样做的价值在于你可以量化“错峰”到底把峰值压下去多少、谷电利用率提升多少同时还能看到策略的副作用——比如把晚高峰的充电需求全部挤到凌晨可能让凌晨的低谷变成新的小高峰。蒙特卡洛本身不是优化工具它真正擅长的是给优化算法提供“场景输入”。你跑出几万条可能的负荷曲线再让调度策略在这几万条曲线上做仿真验证这比用单条典型曲线做决策可靠得多。7.2 与电网潮流计算和容量规划衔接把蒙特卡洛生成的充电负荷曲线叠加到基础负荷上就可以得到净负荷曲线再往下就是变压器负载率、馈线电流、电压偏差校验。一个常被忽略的问题是配电节点的不均匀性。蒙特卡洛模拟的是“某区域整体”的充电行为但实际充电桩分布在具体台区。如果你在做大范围规划最好按空间单元拆开建模每个小区、每个停车场各自跑一套参数再把负荷曲线作为各节点的注入功率输入潮流计算。否则全区域平均结果会掩盖局部过载风险。这也是蒙特卡洛建模最舒服的地方——它天然适合“一个单元一个参数集”的做法。每个小区的人口结构不同车辆构成不同充电桩密度不同分而治之能得到比“全区域一把抓”准确得多的结果。最后分享一点我自己的体会。蒙特卡洛本身并不复杂复杂的是你到底想模拟清楚什么现实问题。参数分布必须来自真实数据极端抽样结果必须能解释它为什么会出现。建议从你最熟悉的小场景开始——一个停车场、一个小区、一段实际线路——把参数定到与运行数据基本吻合再考虑大规模推广。先把单点做准再谈全网覆盖。
返回列表