简介这份资源面向电力系统、新能源与自动化方向的学生及研究人员提供智能微电网调度算法的MATLAB实现代码帮助理解如何通过优化算法确定光伏、风机、储能与微型燃气轮机等分布式电源的最优出力在满足负荷需求的同时兼顾运行成本与环境影响。压缩包共20个文件以18个m脚本为核心涵盖粒子群优化、遗传算法、穷举法等调度求解程序并配有光伏阵列、风机、电池等设备建模文件另含1个xls数据表用于负荷与参数输入整体约19KB结构紧凑便于直接运行与二次开发。目前已有530人学习下载。读者可据此搭建微电网仿真模型对比不同优化策略在功率平衡、储能充放电约束下的表现并借助数据表与绘图脚本快速验证调度结果适合作为课程设计、毕业设计或科研入门的参考代码。1. 智能微电网调度算法从一堆曲线到一套能跑的决策逻辑光伏板中午满发、傍晚归零风机后半夜猛转、白天摸鱼储能电池夹在中间既要平抑波动又要留够备用容量——这就是智能微电网调度算法每天要面对的烂摊子。它本质上是一套在源、荷、储之间做功率分配和时间平移的优化逻辑目标通常是最小化运行成本、最大化新能源消纳率或者两者加权。适合谁看做园区微网、光储充一体化、分布式能源聚合的工程师以及手头有历史功率数据、想先跑通一个离线调度仿真再上控制器的开发者。标题里那个 .zip 大概率装的是仿真脚本加数据但真正值钱的是调度模型怎么建、约束怎么设、求解器怎么调。2. 调度模型怎么建从物理拓扑到数学表达2.1 先画功率流图再写目标函数拿到一个微电网调度问题我一般不会先打开代码编辑器而是先在纸上画三样东西母线结构、可控单元清单、预测信息的时间尺度。母线结构决定功率平衡方程怎么写可控单元清单决定决策变量有哪些预测信息的时间尺度决定优化窗口是 15 分钟还是 1 小时。一个典型的并网型微电网功率平衡约束长这样# 功率平衡约束每个时段 t源储网 荷储 # P_pv[t] P_wt[t] P_dis[t] - P_ch[t] P_grid_buy[t] - P_grid_sell[t] P_load[t] for t in range(T): prob (P_pv[t] P_wt[t] P_dis[t] - P_ch[t] P_grid_buy[t] - P_grid_sell[t] P_load[t])这里 P_dis 和 P_ch 不能同时为正否则求解器会给出物理上无意义的解。常见做法是引入一个 0-1 变量做互斥或者用互补约束。如果用的是线性规划求解器互斥约束会让问题变成混合整数规划求解时间会上去但物理正确性必须保证。目标函数通常写成运行成本最小化# 目标函数购电成本 储能折旧 弃光惩罚 prob lpSum( price_buy[t] * P_grid_buy[t] * dt - price_sell[t] * P_grid_sell[t] * dt c_deg * (P_dis[t] P_ch[t]) * dt c_curtail * P_curtail[t] * dt for t in range(T) )参数说明price_buy 和 price_sell 是分时电价c_deg 是储能度电折旧成本c_curtail 是弃光惩罚系数。c_curtail 设得太小求解器会倾向于弃光来省储能循环设得太大又会逼着储能过度充放。我一般先设成购电均价的 1.5 到 2 倍跑几轮再调。2.2 储能约束是最容易翻车的地方储能模型的精度直接决定调度结果能不能落地。三个关键约束SOC 上下限、充放电功率上限、SOC 时段耦合。# SOC 递推考虑充放电效率和自放电 for t in range(1, T): prob SOC[t] SOC[t-1] (eta_ch * P_ch[t] - P_dis[t] / eta_dis) * dt / E_cap # SOC 边界 for t in range(T): prob SOC_min SOC[t] prob SOC[t] SOC_max # 首末 SOC 约束保证调度周期可循环 prob SOC[0] SOC_init prob SOC[T-1] SOC_end_mineta_ch 和 eta_dis 是充放电效率E_cap 是额定容量。SOC_min 一般设 0.1 到 0.2SOC_max 设 0.9 到 0.95留出过充过放保护余量。首末 SOC 约束容易被忽略——如果不约束末端 SOC求解器会把电池放空来套利第二天开局就没电可用。我一般要求末端 SOC 不低于初始 SOC 的 90%或者直接设成相等。注意SOC 递推里的 dt 单位要和功率单位对齐。如果功率是 kWdt 是小时E_cap 是 kWh那公式直接成立。如果 dt 是分钟记得除以 60。2.3 预测误差怎么在模型里留余量光伏和负荷预测都有误差确定性调度跑出来的结果直接下发遇到预测偏差就会导致功率缺额或储能过放。常见做法是加旋转备用约束# 备用约束可控单元留出一定比例的备用容量 for t in range(T): prob (P_dis_max[t] - P_dis[t]) (P_grid_max - P_grid_buy[t]) reserve_ratio * P_load[t]reserve_ratio 一般取 0.05 到 0.15看预测精度。如果预测误差标准差大就往上取。另一种做法是用场景法或鲁棒优化但计算量会大很多离线仿真可以在线滚动调度一般还是备用约束更实用。3. 用 Python 跑通一个离线调度仿真3.1 环境准备与数据格式我一般用 Python 加 PuLP 或 CVXPY 做原型求解器用 CBC 或 GLPK都是开源可用的。数据准备三张表光伏预测功率、负荷预测功率、分时电价时间分辨率 15 分钟或 1 小时存成 CSV。pip install pulp pandas numpy matplotlib数据格式示例timestamp,pv_kw,load_kw,price_buy,price_sell 2024-01-01 00:00,0,120,0.35,0.12 2024-01-01 00:15,0,118,0.35,0.12 2024-01-01 00:30,0,115,0.35,0.12pv_kw 和 load_kw 是预测值price_buy 和 price_sell 是购售电价。如果只有光伏没有风机P_wt 那一项直接去掉不影响模型结构。3.2 完整调度脚本骨架import pulp import pandas as pd # 读取数据 df pd.read_csv(data.csv) T len(df) dt 0.25 # 15分钟 # 创建问题 prob pulp.LpProblem(microgrid_dispatch, pulp.LpMinimize) # 决策变量 P_grid_buy pulp.LpVariable.dicts(buy, range(T), lowBound0) P_grid_sell pulp.LpVariable.dicts(sell, range(T), lowBound0) P_ch pulp.LpVariable.dicts(ch, range(T), lowBound0, upBound50) P_dis pulp.LpVariable.dicts(dis, range(T), lowBound0, upBound50) SOC pulp.LpVariable.dicts(soc, range(T), lowBound0.1, upBound0.95) u_ch pulp.LpVariable.dicts(u_ch, range(T), catBinary) # 互斥约束充放电不能同时进行 for t in range(T): prob P_ch[t] 50 * u_ch[t] prob P_dis[t] 50 * (1 - u_ch[t]) # SOC 递推 E_cap 200 # kWh eta_ch, eta_dis 0.95, 0.95 for t in range(1, T): prob SOC[t] SOC[t-1] (eta_ch * P_ch[t] - P_dis[t]/eta_dis) * dt / E_cap # 功率平衡 for t in range(T): prob (df.pv_kw[t] P_dis[t] - P_ch[t] P_grid_buy[t] - P_grid_sell[t] df.load_kw[t]) # 目标函数 c_deg 0.05 prob pulp.lpSum( df.price_buy[t] * P_grid_buy[t] * dt - df.price_sell[t] * P_grid_sell[t] * dt c_deg * (P_ch[t] P_dis[t]) * dt for t in range(T) ) # 求解 prob.solve(pulp.PULP_CBC_CMD(msg0)) print(Status:, pulp.LpStatus[prob.status]) print(Total cost:, pulp.value(prob.objective))逻辑说明u_ch 是 0-1 变量用来强制充放电互斥。P_ch 和 P_dis 的上界 50 是储能变流器额定功率按实际设备改。SOC 上下界 0.1 和 0.95 是保护区间。目标函数里 c_deg 取 0.05 元/kWh是常见的磷酸铁锂度电折旧估算。参数怎么改E_cap 改成实际容量P_ch/P_dis 上界改成实际 PCS 功率c_deg 根据电池循环寿命和更换成本反推。如果求解时间太长可以把 u_ch 松弛成连续变量但结果可能不物理只适合做趋势分析。3.3 结果怎么看三条曲线定成败跑完之后我一般画三张图功率堆叠图、SOC 曲线、电价与购售电功率对比。功率堆叠图看源荷储怎么配合SOC 曲线看电池有没有被过度使用电价对比看套利逻辑是否合理。import matplotlib.pyplot as plt fig, axes plt.subplots(3, 1, figsize(12, 8)) axes[0].stackplot(range(T), [df.pv_kw, [pulp.value(P_dis[t]) for t in range(T)]], labels[PV, Discharge]) axes[0].plot(range(T), df.load_kw, k--, labelLoad) axes[0].legend() axes[1].plot(range(T), [pulp.value(SOC[t]) for t in range(T)]) axes[1].set_ylabel(SOC) axes[2].plot(range(T), df.price_buy, labelBuy Price) axes[2].plot(range(T), [pulp.value(P_grid_buy[t]) for t in range(T)], labelGrid Buy) axes[2].legend() plt.tight_layout() plt.savefig(dispatch_result.png)如果 SOC 曲线在一天内频繁触顶触底说明储能容量偏小或者 c_deg 设得太低。如果购电功率在低价时段没有明显上升说明套利逻辑没生效检查 price_buy 和 price_sell 的差值是否覆盖了 c_deg。4. 避坑与排查调度算法落地时最容易踩的五个坑4.1 求解器返回“Infeasible”但约束看起来没问题现象模型状态显示 Infeasible但逐条检查约束都觉得合理。原因最常见的是 SOC 首末约束和功率平衡冲突。比如初始 SOC 设 0.2末端要求不低于 0.5但当天光伏出力极低、负荷又高储能根本充不到 0.5。解决先把末端 SOC 约束松弛掉跑一遍看 SOC 自然演化到多少再根据实际可达到的范围设末端约束。或者把末端约束改成软约束加一个惩罚项。4.2 储能充放电功率出现“抖动”现象相邻时段 P_ch 和 P_dis 反复切换SOC 曲线锯齿状。原因c_deg 设得太小求解器觉得频繁充放不花钱或者互斥约束没加充放电同时为正。解决检查 u_ch 互斥约束是否生效把 c_deg 提高到 0.08 到 0.1 元/kWh或者在目标函数里加一项充放电切换惩罚。4.3 分时电价套利导致储能过放现象电池在低价时段充满高价时段放空SOC 触底。原因末端 SOC 约束太松或者没有设 SOC_min 保护。解决把 SOC_min 从 0.1 提到 0.2末端 SOC 要求不低于初始值。如果还是过放检查 c_deg 是否覆盖了电池循环成本。4.4 预测误差导致实际执行时功率缺额现象离线调度结果很漂亮但实际下发后频繁触发备用。原因确定性调度没有考虑预测误差备用约束太松或没加。解决加旋转备用约束reserve_ratio 取 0.1 到 0.15。如果预测误差分布已知可以用场景法生成多个场景做随机优化。4.5 求解时间过长在线滚动调度来不及现象离线跑一次要几分钟但滚动调度要求 15 分钟内出结果。原因混合整数规划规模太大或者时间分辨率太细。解决把时间分辨率从 15 分钟放宽到 30 分钟或 1 小时或者把 u_ch 松弛成连续变量做线性规划牺牲一点物理精度换速度。另一种做法是把调度周期从 24 小时缩短到 4 小时滚动窗口推进。5. 从离线仿真到在线滚动一个可复用的调度循环离线仿真跑通之后真正要落地还得改成滚动调度。核心思路是每 15 分钟用最新预测数据重新求解未来 4 到 8 小时的调度计划只下发第一个时段的指令下一个周期再滚动。def rolling_dispatch(forecast_func, horizon16, step1): forecast_func: 返回未来 horizon 个时段的预测数据 horizon: 滚动窗口长度时段数 step: 每次推进的时段数 results [] for k in range(0, 96, step): # 一天96个15分钟时段 df_window forecast_func(k, horizon) plan solve_dispatch(df_window) # 复用前面的求解逻辑 results.append(plan[0]) # 只取第一个时段 return results这个循环里最关键的是 forecast_func 的质量。如果预测模型偏差大滚动调度反而比确定性调度更差因为每次都在追着误差跑。我一般会先用历史数据回测比较滚动调度和确定性调度的实际运行成本确认滚动有优势再上。另一个技巧是加一个“调度平滑”后处理如果相邻两个周期的下发指令差异超过阈值就做限幅避免储能变流器频繁大幅调节。验证方法用一周的历史数据做回测对比三种策略——纯规则调度、确定性优化、滚动优化——的实际购电成本、弃光率、储能循环次数。如果滚动优化在三个指标上都不差于确定性优化才值得上在线。我自己的习惯是任何调度算法上线前先用至少一个月的历史数据跑回测把极端天气、节假日、设备检修这些场景都覆盖到。回测通过之后再在仿真环境里跑一周实时数据最后才切到真实控制器。这个流程看起来慢但比上线后天天救火快得多。希望帮到你。本文还有配套的精品资源点击获取