☰
光储充微网容量配置仿真:从拍脑袋到算清每度电的优化方法
2026/10/11 23:18:09 网站建设 项目流程

简介:这份资源面向从事新能源微电网研究的学生与工程人员,聚焦光储充微网系统的建模、仿真与容量优化配置问题。包内共7个文件,以4个MATLAB脚本(.m)、2个数据矩阵(.mat)和1个Simulink模型(.slx)为主,压缩包约56KB,体积轻便但结构完整。脚本部分覆盖系统总成本计算、敏感性分析、容量优化求解及电池开路电压计算,数据文件则记录24小时充电与光伏出力曲线,Simulink模型用于模拟光伏阵列输出特性。借助这些文件,读者可复现光伏容量、储能容量与充电功率的配置流程,评估不同参数对系统经济性与稳定性的影响,并据此寻找更优的容量组合。目前已有1361人学习下载,适合需要搭建微网仿真框架、开展容量优化实验或为实际工程规划提供参考的读者。

1. 光储充微网容量配置仿真:从"拍脑袋定容量"到"算清楚每一度电"

做光储充微网项目的人,几乎都经历过同一个场景:业主问"光伏装多大、储能配多少、充电桩上几台",你心里没底,只能按经验拍一个数。拍完心里发虚——配大了投资回收不了,配小了峰谷套利吃不满,充电高峰还得拉闸限电。光储充微网系统配置仿真要解决的就是这件事:用容量配置和容量优化的方法,把光伏、储能、充电负荷三者的匹配关系算清楚,让每一个 kW 和 kWh 都有依据。

这套方法适合三类人:做分布式能源方案设计的工程师、负责微网项目投资测算的技术负责人、以及想用仿真手段验证光储充优化配置方案的研究生。核心逻辑不复杂——建负荷模型、建光伏出力模型、建储能充放电模型,然后跑全年 8760 小时仿真,用优化算法搜索最优容量组合。但真正落地时,负荷预测偏差、储能衰减、充电行为随机性这三个变量会让仿真结果和实际运行差出 20% 以上。下面把我自己跑过的一套完整流程拆开讲。

2. 容量配置的建模底座:负荷、光伏、储能三条曲线怎么建

2.1 充电负荷曲线:别用一条典型日曲线糊弄全年

光储充微网和普通光储系统最大的区别在于充电负荷。普通光储的负荷曲线相对平滑,但充电桩的负荷是脉冲式的——一辆车 60kW 快充插上去,持续 40 分钟,功率直接从 0 跳到 60kW。如果你用一条"典型日充电曲线"去代表全年,容量优化结果会严重偏小。

我一般用蒙特卡洛方法生成全年充电负荷。核心思路是:根据场站类型(公交场站、物流园区、公共快充站)确定车辆到达时间分布、充电时长分布、充电功率等级,然后随机抽样生成每一天的充电事件序列。

import numpy as np import pandas as pd def generate_charging_load(n_days=365, n_chargers=10, seed=42): """ 蒙特卡洛生成全年充电负荷曲线 n_days: 仿真天数 n_chargers: 充电桩数量 seed: 随机种子,保证可复现 """ np.random.seed(seed) load_15min = np.zeros(n_days * 96) # 15分钟分辨率,一天96个点 for day in range(n_days): # 工作日和周末的到达率不同 is_weekend = (day % 7) >= 5 n_events = np.random.poisson(25 if not is_weekend else 15) for _ in range(n_events): # 到达时间:早高峰7-9点,午间11-14点,晚高峰17-20点 hour = np.random.choice( [7, 8, 9, 11, 12, 13, 17, 18, 19, 20], p=[0.12, 0.15, 0.10, 0.08, 0.10, 0.07, 0.13, 0.12, 0.08, 0.05] ) minute = np.random.randint(0, 60) # 充电时长:快充30-60分钟,慢充2-4小时 duration = np.random.choice([0.5, 1.0, 2.0, 3.0], p=[0.3, 0.3, 0.25, 0.15]) # 充电功率等级 power = np.random.choice([60, 120, 7], p=[0.5, 0.2, 0.3]) start_idx = day * 96 + hour * 4 + minute // 15 n_slots = int(duration * 4) for s in range(n_slots): idx = start_idx + s if idx < len(load_15min): load_15min[idx] += power # 限制不超过充电桩总容量 max_load = n_chargers * 120 # 假设最大120kW桩 load_15min = np.minimum(load_15min, max_load) return load_15min load = generate_charging_load() print(f"峰值负荷: {load.max():.0f} kW, 日均充电量: {load.sum()*0.25:.0f} kWh")

这段代码的关键参数有三个:n_events控制每天充电车辆数,用泊松分布是因为车辆到达近似独立随机事件;duration和power的联合分布决定了单次充电电量;max_load是充电桩总功率上限,防止仿真出现物理上不可能的负荷。实际项目中,如果你有场站的历史充电记录,直接用历史数据拟合分布参数,比用经验值靠谱得多。

2.2 光伏出力模型:用典型气象年数据,别用标准晴天曲线

光伏出力建模的常见错误是只用一条标准晴天曲线。实际全年有阴天、雨天、多云,光伏出力波动很大。我一般用 PVWatts 或类似模型,输入典型气象年(TMY)数据,逐时计算光伏出力。

def pv_output(tmy_irradiance, pv_capacity, efficiency=0.18, pr=0.8): """ 光伏逐时出力计算 tmy_irradiance: 逐时太阳辐照度 W/m2 pv_capacity: 装机容量 kW efficiency: 组件效率 pr: 系统性能比(含逆变器损耗、线损、灰尘等) """ # 标准测试条件 1000 W/m2 output = pv_capacity * (tmy_irradiance / 1000) * pr return np.maximum(output, 0) # 假设已有8760小时辐照度数据 # irradiance = pd.read_csv('tmy_irradiance.csv')['ghi'].values # pv = pv_output(irradiance, pv_capacity=500)

pr取 0.8 是行业常见值,但如果你在灰尘大的工业园区,建议取 0.75;在沿海干净地区可以取 0.82。这个参数直接影响光伏年发电量,进而影响最优储能容量——PR 每降低 0.05,储能容量通常要增加 8%~12% 才能维持同样的自消纳率。

2.3 储能模型:SOC 约束和循环效率是底线

储能模型的核心是 SOC(荷电状态)递推。很多人仿真时只写SOC[t+1] = SOC[t] + P_charge * dt,忘了乘充放电效率,结果算出来的储能容量偏小 10% 以上。

def simulate_storage(pv, load, storage_capacity, storage_power, eta_ch=0.95, eta_dis=0.95, soc_min=0.1, soc_max=0.9): """ 储能全年运行仿真 storage_capacity: 储能容量 kWh storage_power: 储能额定功率 kW eta_ch/eta_dis: 充放电效率 soc_min/soc_max: SOC上下限 """ n = len(pv) soc = np.zeros(n) soc[0] = 0.5 # 初始SOC 50% grid_exchange = np.zeros(n) curtailed = np.zeros(n) for t in range(1, n): net = pv[t] - load[t] # 净功率,正为盈余,负为缺额 if net > 0: # 光伏盈余,先给储能充电 charge_power = min(net, storage_power, (soc_max - soc[t-1]) * storage_capacity / eta_ch) soc[t] = soc[t-1] + charge_power * eta_ch / storage_capacity curtailed[t] = net - charge_power # 弃光 grid_exchange[t] = -curtailed[t] # 余电上网 else: # 光伏不足,储能放电补缺 deficit = -net discharge_power = min(deficit, storage_power, (soc[t-1] - soc_min) * storage_capacity * eta_dis) soc[t] = soc[t-1] - discharge_power / (storage_capacity * eta_dis) grid_exchange[t] = deficit - discharge_power # 从电网买电 return soc, grid_exchange, curtailed

这段代码里eta_ch和eta_dis各取 0.95 是磷酸铁锂的典型值,但如果你用液流电池,效率会低一些(0.75~0.85),仿真时必须改。soc_min=0.1和soc_max=0.9是保护电池寿命的保守设置,如果项目追求短期收益可以放宽到 0.05/0.95,但循环寿命会明显下降。

3. 容量优化算法选型:穷举、遗传算法还是线性规划

3.1 三种优化方法的适用边界

容量优化的本质是一个带约束的非线性优化问题:目标函数通常是全生命周期净现值(NPV)最大或平准化度电成本(LCOE)最小,决策变量是光伏容量、储能容量、储能功率,约束包括 SOC 范围、充放电功率限制、电网交互功率限制等。

方法适用场景优点缺点
穷举搜索变量≤3个,精度要求高全局最优,实现简单计算量大,变量多时不可行
遗传算法变量3~6个,目标非线性能处理非凸问题结果随机,需多次运行
线性规划目标可线性化,变量多求解快,有成熟求解器需要线性化处理,精度损失

我的经验是:如果只优化光伏和储能两个容量变量,直接用穷举,步长取 10kW 和 20kWh,跑一遍也就几分钟。如果还要优化储能功率、充电桩数量、变压器容量,变量超过 4 个,上遗传算法。

3.2 用遗传算法跑容量优化的完整代码

import numpy as np from scipy.optimize import differential_evolution def objective(x, pv_profile, load_profile, price_buy, price_sell): """ 目标函数:全生命周期净现值最大(取负值用于最小化) x = [pv_capacity, storage_capacity, storage_power] """ pv_cap, st_cap, st_pow = x # 约束检查 if st_pow > st_cap * 0.5: # 储能功率不超过容量的一半(2小时系统) return 1e10 if st_pow < 10 or st_cap < 50: return 1e10 # 缩放光伏出力 pv = pv_profile * (pv_cap / pv_profile.max()) # 运行储能仿真 soc, grid_exchange, curtailed = simulate_storage( pv, load_profile, st_cap, st_pow ) # 计算年运行成本 buy_cost = np.sum(np.maximum(grid_exchange, 0) * price_buy) sell_revenue = np.sum(np.maximum(-grid_exchange, 0) * price_sell) annual_benefit = sell_revenue - buy_cost # 初始投资(简化估算) investment = pv_cap * 3500 + st_cap * 1500 + st_pow * 800 # 元 # 25年净现值 discount_rate = 0.06 npv = -investment for year in range(1, 26): # 考虑光伏衰减和储能容量衰减 degradation = 0.995 ** year npv += annual_benefit * degradation / (1 + discount_rate) ** year return -npv # 取负,最小化 # 优化变量边界 bounds = [(100, 2000), # 光伏容量 kW (100, 5000), # 储能容量 kWh (50, 1000)] # 储能功率 kW # 假设已有全年光伏和负荷数据 # result = differential_evolution( # objective, bounds, # args=(pv_profile, load_profile, 0.6, 0.35), # maxiter=200, popsize=20, seed=42 # ) # print(f"最优光伏: {result.x[0]:.0f} kW") # print(f"最优储能: {result.x[1]:.0f} kWh / {result.x[2]:.0f} kW")

这段代码有几个关键设计决策。differential_evolution是 scipy 提供的全局优化算法,比标准遗传算法更稳定,不需要手动调交叉变异概率。目标函数里加了两个硬约束:储能功率不超过容量的一半(对应 2 小时储能系统),以及最小容量限制。投资单价3500/1500/800元是 2024 年国内市场的粗略值,实际项目要按当地报价替换。折现率取 6% 是国企项目的常见值,民企项目通常取 8%~10%。

3.3 优化结果怎么验证:三个必看的指标

跑完优化不能直接信结果,我一般看三个指标:

自消纳率:光伏发电量中被本地负荷和储能消纳的比例。低于 60% 说明光伏配大了,余电上网比例太高,收益差。

储能等效循环次数:全年储能充放电量除以储能容量。低于 250 次说明储能利用率不足,投资回收困难;高于 500 次要检查电池寿命是否够用。

净负荷峰谷差:优化后从电网买电的峰谷差。如果峰谷差没降下来,说明储能功率配小了,削峰填谷效果不够。

4. 避坑与排查:仿真结果和实际运行差 20% 的五个原因

4.1 充电负荷用了平均值而不是峰值

现象:仿真显示变压器容量 630kVA 够用,实际运行三个月跳闸两次。

原因:仿真时把充电负荷按日均值平滑处理了,忽略了同时率。10 台 120kW 桩不会同时满功率,但 5 台同时充的概率不低,瞬时负荷能到 600kW。

解决:仿真时保留 15 分钟分辨率的负荷曲线,不要做日均值平滑。变压器容量按仿真峰值负荷的 1.2 倍选,同时率系数根据场站类型取 0.5~0.8。

4.2 储能 SOC 初始值设成了 0

现象:仿真第一天的储能放电量明显偏低,全年结果偏差 3%~5%。

原因:SOC 初始值设 0 意味着第一天储能没电可放,但实际运行中储能是循环的,第一天结束时 SOC 会回到合理区间。

解决:SOC 初始值设 0.5,或者跑两遍仿真——第一遍预热,第二遍用第一遍最后时刻的 SOC 作为初始值。

4.3 光伏出力用了标准晴天曲线

现象:仿真光伏年发电量比实际高 15%~25%。

原因:标准晴天曲线假设每天都是最佳辐照,忽略了阴雨天和多云天气。

解决:用 TMY 数据或至少用 12 个典型月各一条曲线。如果拿不到 TMY 数据,用当地气象站的历史辐照度数据,按月中位数生成。

4.4 优化目标只算了电费收益

现象:优化结果显示储能越大越好,但实际项目储能配到 2MWh 后收益不再增长。

原因:目标函数只算了峰谷套利收益,没算储能投资和衰减成本。储能越大,套利收益线性增长,但投资也线性增长,存在最优拐点。

解决:目标函数必须包含全生命周期成本——初始投资、运维费用、电池更换成本。电池更换通常在第 8~10 年,按初始投资的 40% 计入。

4.5 忽略了需量电费

现象:仿真说每年省 50 万电费,实际只省了 30 万。

原因:大工业电价包含需量电费(按最大需量计费),储能削峰后最大需量降了,但仿真没算这部分收益。

解决:在目标函数里加入需量电费项。需量电费通常 30~40 元/kVA/月,削峰 100kW 一年就是 3.6~4.8 万元。

5. 进阶技巧:用敏感性分析找到容量配置的"安全边界"

容量优化的结果是一个点,但实际项目需要的是一个区间。我一般会做敏感性分析,看关键参数变化时最优容量怎么漂移。

具体做法:把电价、光伏投资单价、储能投资单价、负荷增长率这四个参数各取 ±20% 的范围,重新跑优化,记录最优容量的变化。

import itertools def sensitivity_analysis(base_params, variations): """ 敏感性分析:关键参数变化时最优容量的漂移 """ results = [] keys = list(variations.keys()) for combo in itertools.product(*[variations[k] for k in keys]): params = base_params.copy() for k, v in zip(keys, combo): params[k] = base_params[k] * (1 + v) # 重新跑优化(这里用简化函数代替) opt_pv, opt_st = run_optimization(params) results.append({ **{f"{k}_变化": f"{v:+.0%}" for k, v in zip(keys, combo)}, "最优光伏_kW": opt_pv, "最优储能_kWh": opt_st }) return pd.DataFrame(results) # 示例:电价和储能投资各取-20%、0%、+20% # variations = {"电价": [-0.2, 0, 0.2], "储能投资": [-0.2, 0, 0.2]} # df = sensitivity_analysis(base_params, variations)

跑完敏感性分析,你会得到一张表。我的经验是:电价波动对最优储能容量的影响最大——电价上涨 20%,最优储能容量通常增加 15%~25%;储能投资下降 20%,最优储能容量增加 10%~18%。如果最优容量在参数波动范围内变化超过 30%,说明这个项目的容量配置方案不够鲁棒,建议取偏保守的值。

另一个实用技巧是画"容量-收益"等高线图。横轴光伏容量,纵轴储能容量,颜色表示 NPV。最优解是颜色最深的点,但实际选型时我会选最优解附近、NPV 下降不超过 5% 的区域中心——这样即使实际运行偏离仿真假设,收益也不会差太多。

最后说一个我踩过的坑:早期做容量优化时,我直接把优化结果写进方案,结果业主按这个容量招标,实际运行第一年就发现储能配小了。后来我养成了一个习惯——优化结果出来后,手动把储能容量上浮 10%~15%,作为设计冗余。这个冗余不是拍脑袋,而是用来对冲负荷预测偏差和电池衰减的。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询