
简介针对智能楼宇微电网优化场景这份MATLAB源码包实现了虚拟储能系统与光伏配比联合调度适合电力系统、建筑节能方向的学生、研究人员及工程师。包内共4个文件包含2个m函数文件主程序与适应度计算、1份docx说明文档和1篇caj格式参考文献压缩包总大小仅510KB便于快速下载与复用其中主程序直接运行即可观察粒子群迭代效果适应度函数可作为扩展基线docx说明交代建模思路caj文献为冷热电联供楼宇微网优化提供理论参考。已有384人学习浏览实用性得到验证。代码基于粒子群算法搜索最优能源调度策略可动态调节空调等柔性负荷以模拟储能充放电同时考虑光伏渗透率、温度约束和冷热电联供楼宇微网运行经济性帮助读者理解虚拟储能建模、PSO参数整定、适应度函数设计及多目标优化的完整流程。1. 虚拟储能与光伏配比智能楼宇能量管理的边界问题当光伏板装上智能楼宇屋顶最常被低估的不是逆变器效率而是“楼宇本身能不能消纳这些电”。单纯把光伏容量放大一倍自耗率不升反降多余电量倒送电网经济模型立刻崩掉。这就是光伏配比要做的工作——用光伏装机功率除以楼宇峰值负荷得到一个比值但这个比值背后还牵着一层东西虚拟储能。虚拟储能不占物理电池柜它用空调设定温度浮动、热水箱蓄热、电梯与照明可转移时段把楼宇本身变成一个“时间平移器”。标题里的仿真源码做的就是把这层平移能力写进配比优化里让楼宇在给定柔性资源下算出光伏到底该装多大。这个话题适合搞建筑节能、微电网或 MATLAB 优化仿真的工程师往下看。2. 虚拟储能与光伏配比的基本逻辑为什么是容量系数而不是电池容量2.1 虚拟储能的物理含义把楼宇热惯性抽象成等效 SOC虚拟储能Virtual Energy Storage, VES最初来自电力市场对柔性负荷的聚合落到智能楼宇里最常见的对象是空调和热水系统。以空调为例房间不是零热容墙体和空气都能吸热放热。设定温度允许在舒适区间 [T_min, T_max] 内浮动时空调功率可以暂时低于或高于维持目标温度所需的平均值。被压低的这部分功率本质上等于向楼宇“充电”——把冷量或热量存在建筑结构里后续功率抬升再把能量放出来。数学上可以写成等效荷电状态 SOC_VESSOC_VES(t) (T_avg(t) - T_min) / (T_max - T_min)当 SOC_VES 接近 0 时房间温度贴近下限继续压低空调功率会导致舒适度越界也就是说“虚拟储能放完电了”。这个映射直观形式上也跟电池 SOC 一致所以配比优化时可以直接把它放进状态约束里。虚拟储能的容量不是固定数它由楼宇热参数、允许温度浮动窗口和可持续时间共同决定。同一栋楼夏天允许 26±2°C虚拟储能容量可能达到数百千瓦时如果允许 26±0.5°C容量立刻缩水到原来的四分之一。做配比仿真的时候要把这个温度窗口当成决策参数而不是写死后不管。2.2 光伏配比的核心指标自耗率、自给率与倒送率怎么读光伏配比 r 的定义是装机功率与基准负荷峰值之比r P_pv_rated / P_base_peak给定 r 之后需要评价楼宇整体表现。三个指标几乎在所有建筑光伏方案评审里都会出现指标定义含义常见阈值自耗率 SCRE_pv_self / E_pv_total光伏发电中被楼宇自己用掉的比例低于 30% 属于配比过猛自给率 SSRE_pv_self / E_load_total楼宇总用电需求中光伏覆盖的比例40%~70% 视配置而定倒送率 ORE_export / E_pv_total反向送网电量占比并网模型里越低越好三个指标与配比并非简单单调关系。r 从 0.4 升到 0.8SSR 上升明显SCR 下降有限r 从 1.0 升到 1.5SSR 可能只增加 10 个百分点SCR 却可能跌破 45%多余光伏发电全部变成低电价倒送。这就是虚拟储能介入的时机——把 SCR 曲线下弯的那一段往回拉净收益仍然存在优化空间。实际工程里我一般先扫三组 r0.6、0.8、1.0把 SCR/SSR 两个数打印出来看拐点位置再决定要不要加密扫描。这个方法避免盲目跑几百次优化速度快很多。2.3 配比与虚拟储能耦合的边界两套参数不能分开定仿真代码里通常把两者分开建模再耦合。耦合点有两处。第一处是功率平衡方程P_grid(t) P_load(t) - P_PV(t)其中 P_load(t) 已经被虚拟储能调节过。第二处是经济评价调节 P_load 会改变空调能耗也改变光伏消纳量两块收益必须放在同一目标函数里权衡。常见的错误做法是先把光伏配比固定再单独优化虚拟储能最后把两个结果拼接起来。问题是光伏出力高峰时段也是空调负荷高峰期如果虚拟储能只按“削峰”逻辑优化不考虑光伏多发的时段特征很可能会在中午主动下调房间温度人为增加空调负荷自耗率拉高了但制冷能耗也上去了净收益未必更优。所以源码层面至少要迭代几次配比-储能联合求解或者把 r 作为外层循环变量做灵敏度分析。3. matlab 下光伏出力与虚拟储能联合建模的源码结构在 MATLAB 里走通这一套比较顺手的路径是先按时间序列生成负荷、辐照度、温度三个输入向量再写光伏出力函数再叠加虚拟储能状态更新最后把目标函数递交给优化器。下面按这个顺序给可复现代码。3.1 气象与负荷的预处理单位统一和时间序列清洗假设基础数据是逐小时的 8760 条记录或者仿真周期取夏季典型周168 点。先做单位归一化和缺失值填充。% 读入基础数据约定列hour, irradiance(W/m2), temp(°C), load(kW) data load(building_data_typ_week.mat); hour data.hour; % 1~168 G data.irradiance; % 水平面辐照度 T_amb data.temp; % 环境温度 L_base data.load; % 建筑基线功率 % 剔除异常负数和突变值 G(G 0) 0; L_base(L_base 0) 0; % 辐照度出现连续零值后的孤立尖峰用滑动中位数平滑 G movmedian(G, 5, omitnan);说明辐照度单位统一为 W/m²负荷单位 kW时间步长 1 小时后续计算电量的单位就是 kWh避免中途换单位造成比例错误。movmedian 的窗口大小根据数据采样间隔调整5 点窗口对逐小时数据可接受逐 15 分钟数据建议改成 7窗口太大会把真实辐照峰削平。光伏出力的核心输入不是水平面辐照度而是倾斜面辐照度。工程上粗略估计时乘以朝向系数 1.1~1.2精确做法用各向异性天空模型。基准方案里直接给定 tilt_factortilt_factor 1.15; % 朝向修正系数南向30度常见 G_tilt G .* tilt_factor; G_tilt(G_tilt 1000) 1000; % 防止极端天气时刻的异常值这段的目的是把气象站数据换算到组件实际接收面不做这步直接套用水平辐照度夏季午间出力会低估 10% 以上配比因此偏保守。3.2 光伏出力函数温度修正与 NOCT光伏组件实际输出受组件温度影响不能只按标况功率折算。工程上常用 NOCT额定工作温度估算组件温度function P_pv pv_power_output(G_tilt, T_amb, P_stc, k_temp, NOCT, G_noct) % 参数说明 % G_tilt : 倾斜面辐照度 W/m2 % T_amb : 环境温度 °C % P_stc : 标况(1000W/m2, 25°C)下的额定出力 kW % k_temp : 温度系数, 单晶硅常见 -0.0035 ~ -0.0045 /°C % NOCT : 额定工作温度, 常见值 45±2°C % G_noct : 测试辐照度, 通常 800 W/m2 T_cell T_amb (NOCT - 20) .* (G_tilt ./ G_noct); P_pv P_stc .* (G_tilt ./ 1000) .* (1 k_temp .* (T_cell - 25)); P_pv(P_pv 0) 0; end这函数按向量化写法一次返回整段时间序列出力循环都不用写。温度修正项在夏季午后尤其明显——辐照度 900 W/m²、环境温度 38°C 时组件温度可达 65°C输出相比标况下降 12%~15%。这部分不修正配比算出来会偏乐观。仿真精度要求高的场合把 k_temp 拆成季节参数表冬夏各定一组值。3.3 虚拟储能的状态转移ETP 模型与功率限幅这里用一阶等效热参数ETP模型更新室温这也是大多数建筑能源仿真的默认骨架。设定温度浮动窗口后空调功率可调整范围就是虚拟储能的可放功率室温归一化后就是 SOC。function [P_ac, SOC, T_room] ves_etp(T_amb, T_set, window, C_room, R_wall, ... P_ac_max, cop, dt) % 参数说明 % T_amb : 室外温度向量 °C % T_set : 目标设定温度 °C % window : 温度浮动半宽例如 2 表示 T_set±2 % C_room : 房间热容 kWh/°C % R_wall : 墙体热阻 °C/kW % P_ac_max : 空调额定功率 kW % cop : 能效比名义 COP % dt : 时间步长 h N length(T_amb); T_room T_set * ones(N, 1); T_lo T_set - window; T_hi T_set window; P_ac zeros(N, 1); SOC zeros(N, 1); P_ac_min 0.1 * P_ac_max; % 变频空调最低运行功率 for k 2:N % 热平衡功率维持当前室温所需的平均功率 P_balance (T_room(k-1) - T_amb(k-1)) / R_wall / cop; err T_set - T_room(k-1); % PI 式跟踪比例系数 1.5积分项由前一时刻隐含 P_desire P_balance 1.5 * err; P_ac(k) min(P_ac_max, max(P_ac_min, P_desire)); % 室温更新制冷量注入与围护结构热损失之差 T_room(k) T_room(k-1) dt / C_room * ... (cop * P_ac(k) - (T_room(k-1) - T_amb(k-1)) / R_wall); % 舒适度越界保护锁到窗口边界同时限制功率继续偏移 T_room(k) min(T_hi, max(T_lo, T_room(k))); % SOC1表示处在窗口上沿冷量富余0表示贴住下沿 SOC(k) (T_hi - T_room(k)) / (T_hi - T_lo); end end说明P_ac_min 取 10% 额定功率防止虚拟储能模型把空调功率压到 0随后室温越界。真实压缩机不可能无级到 0变频机下限通常为额定的 10%~30%。温度越界保护用钳位处理这个简单方法在逐小时仿真里稳定运行步长细到分钟级时建议把 ETP 方程改成隐式欧拉格式否则数值振荡。3.4 配比优化的目标函数与约束求解写法外层按给定 r 生成 P_pv内层优化各时刻的空调功率与倒送功率。目标函数写为min Σ [ C_elec(t) * P_grid(t) C_penalty * ΔT_violation(t) ]其中 P_grid(t) L_base(t) P_ac(t) - P_pv(t)。P_grid 0 表示购电P_grid 0 表示倒送。约束包括室温区间、空调功率限幅和 ETP 方程。MATLAB 里最省事的做法是 fmincon目标函数写成匿名函数r 0.8; P_pv_rated r * max(L_base); P_pv pv_power_output(G_tilt, T_amb, P_pv_rated, k_temp, NOCT, G_noct); % 决策变量 x: 每小时空调功率 P_ac(1..N) 和室温 T_room(1..N) N length(hour); x0 [0.6 * ones(N,1); 26 * ones(N,1)]; lb [0.1 * ones(N,1); 22 * ones(N,1)]; ub [1.0 * ones(N,1); 30 * ones(N,1)]; price get_tou_price(hour); % 分时电价从外部文件读入 objfun (x) obj_ves_price(x, L_base, P_pv, price, C_room, R_wall, dt); constr (x) con_ves_temp(x, T_set, window); opts optimoptions(fmincon, Display, off, MaxIterations, 2000); [optx, fval, exitflag] fmincon(objfun, x0, [], [], [], [], lb, ub, ... constr, opts);目标函数内部按 P_grid L_base P_ac - P_pv 计算购电成本并叠加室温越界的一次软惩罚。约束函数里写室温在 22~30 之间的硬约束以及空调功率与室温之间的 ETP 方程。这样写的好处是配比 r 完全外置改一个数就能跑完整周仿真。4. 配比优化的参数设置、求解器选型与常见排错4.1 关键参数表与默认值建议写进源码的参数里最容易影响收敛和质量的是下面这几个按重要性排序参数符号默认值设置依据配比扫描范围r0.3 : 0.1 : 1.5覆盖欠配到过配区间室内温度窗口window±2°C热舒适标准常见上限空调功率下限系数0.1变频压缩机最低运行比PV 温度系数k_temp-0.004 /°C单晶硅典型值虚拟储能时间常数τ R_wall * C_room2~6 h由围护结构决定分时电价步长1h峰平谷三段电价配比扫描范围不要总是从 0 开始。楼宇自身的基线负荷里已经包含一部分基础用电r 在 0.3 以下时光伏只是点缀SCR 会虚高这个范围的信息量不大。我一般从 0.3 起步步长 0.1先粗扫后细扫。4.2 fmincon 与 linprog 的取舍如果空调模型写成线性约束、目标函数里只保留购电成本和固定电价问题退化为线性规划linprog 比 fmincon 快一个数量级。虚拟储能状态转移方程是线性的约束也是线性的唯一可能非线性的是分时电价与 P_grid 乘积的分段线性关系。分段线性可以通过引入辅助变量线性化然后用 linprog 解决。具体判断标准很简单你的光伏出力是不是固定序列如果是那么在给定 r 下 P_pv 就是常数整个模型是线性或分片线性的用 linprog 或 intlinprog带整数变量时。如果你把配比本身也放进决策变量做联合寻优或者温度约束写成非线性舒适度函数那就回到 fmincon。MATLAB 优化工具箱里两种求解器都封装好了切换成本很低值得先试 linprog。% 线性化示意用辅助变量 split_pos/split_neg 替代 P_grid A_eq []; b_eq []; % 实际使用时需要按变量顺序展开系数矩阵 [x_lp, fval_lp, exitflag_lp] linprog(f, A, b, A_eq, b_eq, lb, ub);注意 linprog 没有非线性约束温度越界逻辑必须写成线性不等式比如 T_room(k) - T_room(k-1) 的转移关系拆成显式表达后再放进 A 矩阵。这也是为什么前面 3.3 节的 ETP 模型写成一阶线性形式——它就是为这一步准备的。4.3 Inf、NaN 与收敛失败的诊断路径仿真跑出 Inf 或 NaN 时不要急着调求解器选项。按下面的顺序排查检查 P_pv 是否全零。辐照度单位错会造成数据全为 0 或全部被上限截断光伏出力是 0目标函数里 P_grid 就变成纯负荷优化结果离谱但不会报错。检查温度初值 x0 是否落在可行域内。如果 lb 是 22°C初值给 19°Cfmincon 第一步就找不到满足 ETP 方程的可行解。检查分时电价序列里有没有 NaN。读入外部 Excel 文件时末尾空行常被读成 NaN乘到目标函数里整个梯度就崩了。粗步长试跑。时间步长先放大到 2 小时若收敛再把步长恢复回去确认不是数值刚性问题。提示fmincon 返回 exitflag 为 -2 时先检查约束函数是否在初始点可行而不是去调 MaxIterations。初始点可行之后绝大多数收敛问题会自动消失。把上面四个检查写成一个 check_model_health.m 脚本每次跑优化前自动输出诊断信息可以省掉大量来回试错的时间。5. 一个可复现的配比灵敏度分析脚本5.1 r 扫描循环与结果矩阵存储最后给一个可以直接套用的灵敏度分析骨架。这个脚本把 r 放在外层循环内层依次调用光伏出力函数、虚拟储能模型和目标函数把结果存进矩阵跑完直接画曲线r_list 0.3:0.1:1.5; n_r length(r_list); SCR zeros(n_r, 1); SSR zeros(n_r, 1); OR zeros(n_r, 1); P_grid_summary zeros(n_r, length(hour)); for i 1:n_r r r_list(i); P_pv_rated r * max(L_base); P_pv pv_power_output(G_tilt, T_amb, P_pv_rated, k_temp, NOCT, G_noct); % 此处调用 3.3 节 ETP 模型把空调功率代入功率平衡 [P_ac, SOC, T_room] ves_etp(T_amb, T_set, window, C_room, R_wall, ... P_ac_max, cop, dt); P_net L_base P_ac - P_pv; E_pv sum(P_pv) * dt; E_used sum(min(P_pv, L_base P_ac)) * dt; E_load sum(L_base P_ac) * dt; E_export sum(max(-P_net, 0)) * dt; SCR(i) E_used / E_pv; SSR(i) E_used / E_load; OR(i) E_export / E_pv; P_grid_summary(i, :) P_net; end注意 SOC 变量在这里没有直接参与目标函数计算但它在 ETP 模型内部起了约束作用保证空调功率的调整不会突破舒适度边界。跑完这个循环你就可以得到一张配比扫描表每一行对应一个 r三列分别给出 SCR、SSR 和倒送率。5.2 SCR-SSR 曲线绘制与判读要点绘制自耗率-自给率曲线时横轴用 r双纵轴分别画 SCR 和 SSR观察交叉点的位置。figure; yyaxis left; plot(r_list, SCR * 100, -o, LineWidth, 1.5); ylabel(自耗率 SCR (%)); ylim([20 100]); yyaxis right; plot(r_list, SSR * 100, -s, LineWidth, 1.5); ylabel(自给率 SSR (%)); ylim([0 100]); xlabel(光伏配比 r P_pv_rated / P_base_peak); grid on; legend(SCR, SSR, Location, southeast);曲线的经验判读方法SCR 从 90% 往下掉到 70% 附近的那个 r 就是“经济甜点区”再往上加装机容量边际收益迅速衰减。如果在这个甜点区之前 SSR 已经超过 80%说明楼宇自身负荷太小该考虑的不是继续加光伏而是把虚拟储能的温度窗口放宽到 ±3°C让楼宇结构承担更多平移任务或者增加热水蓄热负荷来扩充本地消纳能力。最后一个实用技巧把上面脚本里 r_list 改成 [0.5, 0.6, 0.7]输出每一天的 P_grid_summary 曲线叠加到同一张图上观察午间倒送峰的抬升速度这是判断楼宇是否值得配物理储能的最直观依据——虚拟储能能平掉的峰是有限的峰值倒送时间超过 3 小时的部分才需要真正的电池柜。仿真结果里有这组曲线光伏配比方案在评审时说服力会强很多。本文还有配套的精品资源点击获取