
简介这份资源面向电力系统研究、储能技术开发方向的工程师与研究人员聚焦可再生能源高占比下的一次调频难题复现并优化了基于自适应SOC的电池-飞轮混合储能控制策略。内容将正/负虚拟惯性控制与虚拟下垂控制相结合通过SOC自适应调整控制参数权重在限制SOC波动、防止电池过充过放的同时把系统频率波动控制在±0.2Hz以内。资源包共1个PDF文件约736KB内含完整可运行的Python代码及逐段解释覆盖类初始化、电力系统频率响应模型、自适应控制策略、SOC更新机制与仿真主流程并借助Matplotlib完成结果可视化。读者可据此理解权重分配、SOC自适应调节、混合控制模式切换与安全保护机制等关键环节评估不同策略下的频率响应与SOC变化进而优化调频性能、延长储能设备寿命。目前已有155人学习。1. 为什么一次调频里电池和飞轮不能各干各的电网频率跌到 49.8 Hz 以下时一次调频要求在秒级把有功顶上去。锂电池能量密度高、持续出力稳但频繁充放会让循环寿命掉得很快飞轮功率密度大、响应在百毫秒级可它储的能量少撑不了几秒。把两者直接并联、按同一个功率指令分配结果通常是飞轮先被抽空、电池被迫补上全部缺口调频效果和寿命两头不讨好。真正要解决的是两件事一是频率跌落瞬间谁先出力、出多少二是 SOC 偏离安全区时怎么把出力责任平滑地转给另一个单元。标题里的“自适应 SOC”指的就是让分配系数跟着电池 SOC 实时变化而不是写死一个比例。这套策略适合做微电网、新能源场站配套储能、以及电力系统调频方向的研究生和工程师复现门槛不高一台能跑 Python 的机器加一个仿真环境就够。2. 自适应SOC分配策略的建模与参数整定2.1 电池-飞轮混合储能的功率分配逻辑一次调频的核心是下垂控制频率偏差 Δf 乘以调频系数得到总的有功缺额 P_ref。混合储能要做的就是把 P_ref 拆成电池功率 P_bat 和飞轮功率 P_fly。常见做法是让飞轮承担高频分量、电池承担低频分量用一阶低通滤波把 P_ref 分解P_fly P_ref * (sT / (1 sT)) P_bat P_ref - P_flyT 是滤波时间常数T 越小飞轮承担的高频越多。但纯滤波不关心 SOC飞轮 SOC 掉到下限还在放电就会失稳。所以要在滤波基础上叠加一个 SOC 自适应修正项让分配系数随电池 SOC 偏移。2.2 自适应SOC系数的数学表达设电池 SOC 为 SOC_bat安全区间为 [SOC_min, SOC_max]定义归一化偏移量k_soc (SOC_bat - SOC_ref) / (SOC_max - SOC_min)SOC_ref 取 0.5。k_soc 为正说明电池电量偏高应该多放电为负说明电量偏低应该少放电、让飞轮多顶。把 k_soc 映射成电池出力权重w_bat 0.5 - K * k_socK 是自适应增益典型取 0.3~0.8。w_bat 被限幅在 [0.2, 0.8]避免某一单元被完全关掉。最终P_bat w_bat * P_ref P_fly (1 - w_bat) * P_ref这样电池 SOC 高时多出力、低时少出力飞轮自动补位。下面用 Python 把这个分配器写出来。2.3 用 Python 实现分配器并跑一组工况import numpy as np def adaptive_soc_split(P_ref, soc_bat, soc_min0.2, soc_max0.9, soc_ref0.5, K0.5, w_lo0.2, w_hi0.8): # 归一化SOC偏移范围约[-1,1] k_soc (soc_bat - soc_ref) / (soc_max - soc_min) # 电池权重SOC高则权重高 w_bat 0.5 - K * k_soc # 限幅防止单单元被完全切除 w_bat np.clip(w_bat, w_lo, w_hi) P_bat w_bat * P_ref P_fly (1.0 - w_bat) * P_ref return P_bat, P_fly, w_bat # 工况频率跌落总缺额200kW电池SOC从0.7降到0.3 P_ref 200.0 for soc in [0.7, 0.5, 0.3]: pb, pf, w adaptive_soc_split(P_ref, soc) print(fSOC{soc:.1f} w_bat{w:.2f} P_bat{pb:.1f}kW P_fly{pf:.1f}kW)逻辑说明k_soc把 SOC 映射到对称区间w_bat用负斜率保证 SOC 越高电池出力越大。np.clip是关键保护没有它 SOC 极端时权重会越界导致飞轮或电池被要求出超过额定值的功率。参数说明K 越大 SOC 调节越激进但太大会引起功率分配振荡建议从 0.5 起调w_lo/w_hi 根据两单元额定功率比设定飞轮额定功率小就把 w_hi 压低。2.4 关键参数对调频效果的影响参数含义典型值调大后果调小后果KSOC自适应增益0.3~0.8分配振荡、飞轮频繁满出力SOC均衡变慢T滤波时间常数0.5~5 s电池承担高频、寿命下降飞轮能量快速耗尽w_lo/w_hi权重限幅0.2/0.8单单元过载另一单元闲置SOC_min/max安全区间0.2/0.9过充过放风险可用容量浪费注意K 和 T 要联合整定。T 大时飞轮出力少K 可以适当放大来加快 SOC 回中T 小时飞轮已经承担高频K 再大容易让飞轮 SOC 触底。3. 频率稳定与储能保护的联合仿真验证3.1 搭建含一次调频的简化频率响应模型验证策略不能只看分配器输出要把它放进频率动态里。常用简化模型是系统惯性方程加调频死区2H * dΔf/dt ΔP_m - ΔP_L - P_essH 是系统惯性时间常数P_ess 是混合储能总出力。频率跌出死区后才启动调频死区一般设 ±0.033 Hz。下面用欧拉法迭代仿真。import numpy as np def simulate_freq(P_ref_series, H5.0, D1.0, dt0.01, deadband0.033): # 简化频率响应仅考虑储能一次调频支撑 f np.zeros(len(P_ref_series)) df 0.0 for i in range(1, len(P_ref_series)): # 频率偏差超过死区才计入调频出力 p_ess P_ref_series[i] if abs(df) deadband else 0.0 # 惯性方程离散化 ddf (-D * df - p_ess) / (2 * H) df ddf * dt f[i] df return f # 构造一段持续缺额模拟负荷突增 t np.arange(0, 10, 0.01) P_ref np.where(t 1.0, 150.0, 0.0) # 1秒后缺额150kW freq_dev simulate_freq(P_ref) print(f最大频率偏差 {freq_dev.min():.4f} Hz) print(f稳态偏差 {freq_dev[-1]:.4f} Hz)逻辑说明p_ess只在频率偏差超过死区时投入模拟真实调频死区逻辑。ddf里-D*df是阻尼项-p_ess是储能支撑项。参数说明H 越大频率跌落越慢但最低点更低D 是负荷阻尼系数典型 1~2。这段代码用来快速验证策略能否把频率拉回死区附近不追求电力系统全阶模型精度。3.2 把SOC自适应分配器接入仿真闭环把第 2 章的分配器和第 3 章的频率模型串起来每步更新 SOCsoc_bat 0.6 soc_fly 0.5 E_bat 500.0 # 电池容量 kWh E_fly 20.0 # 飞轮容量 kWh dt 0.01 soc_log [] for i in range(len(P_ref)): if abs(freq_dev[i]) 0.033: pb, pf, w adaptive_soc_split(P_ref[i], soc_bat) # 放电SOC下降充电上升符号由功率方向决定 soc_bat - pb * dt / (3600 * E_bat) soc_fly - pf * dt / (3600 * E_fly) # SOC保护越限时强制回中 soc_bat np.clip(soc_bat, 0.2, 0.9) soc_fly np.clip(soc_fly, 0.2, 0.9) soc_log.append((soc_bat, soc_fly))逻辑说明SOC 变化量等于功率乘时间除以容量单位统一到 kWh 和小时。np.clip是储能设备保护的最后一道防线防止仿真中 SOC 越界。参数说明E_bat 和 E_fly 的比值决定了同样功率下谁 SOC 掉得快飞轮容量小所以 SOC 波动剧烈这正是需要自适应分配的原因。3.3 仿真结果怎么看频率最低点与SOC轨迹跑完仿真重点看三个量频率最低点、恢复时间、两单元 SOC 是否都在安全区。如果频率最低点低于 49.5 Hz说明总调频容量不够或死区设太大如果电池 SOC 快速跌到 0.2说明 w_bat 初始权重太高或 K 太小如果飞轮 SOC 反复触底说明 T 太小、飞轮承担了过多低频能量。观察量健康范围异常含义调整方向频率最低点49.5 Hz调频容量不足增大 P_ref 或减小死区恢复时间5 s响应太慢减小 T让飞轮多出力电池SOC末值0.3~0.7均衡失效增大 K飞轮SOC波动0.3飞轮过载增大 T 或降低 w_hi注意仿真步长 dt 要小于滤波时间常数 T 的十分之一否则离散化误差会让分配结果失真。T0.5 s 时 dt 取 0.01 s 比较稳妥。4. 工程落地时的三个进阶技巧4.1 用SOC恢复死区避免频繁切换实际运行中电池 SOC 在 0.5 附近微动时自适应系数会跟着抖导致功率分配频繁切换。常见做法是加一个 SOC 恢复死区SOC 在 0.45~0.55 之间时 w_bat 固定为 0.5出了这个区间才启动自适应。这样既保证均衡又减少执行机构动作次数。def split_with_deadband(P_ref, soc_bat, band0.05): if abs(soc_bat - 0.5) band: w_bat 0.5 # 死区内不调节 else: w_bat np.clip(0.5 - 0.5 * (soc_bat - 0.5) / 0.35, 0.2, 0.8) return w_bat * P_ref, (1 - w_bat) * P_ref4.2 飞轮能量约束下的功率限幅飞轮储能量少必须加能量约束当飞轮 SOC 低于 0.25 时即使分配器要求它出力也要把 P_fly 限到额定值的一半同时把差额转给电池。这一步是储能设备保护的关键很多复现失败就是漏了它。4.3 从仿真到硬件的参数迁移检查清单上硬件前逐项核对采样周期是否匹配 dtSOC 估算误差是否小于 5%功率指令是否有斜率限制防止冲击死区阈值是否和实际频率测量精度匹配。把仿真里整定好的 K、T、w_lo、w_hi 先按 0.8 倍保守值下发现场再逐步放量比直接照搬仿真值稳得多。本文还有配套的精品资源点击获取