1. 项目背景与整体思路
1.1 为什么空调负荷成了配电网的“香饽饽”
先说个现象。这几年分布式光伏、风电在配电网里的渗透率越来越高,台区变压器容量不够用、电压越限、功率倒送这些问题越来越频繁。但真正让调度头疼的,不是发电侧,而是负荷侧——尤其是空调负荷。
空调这东西有个明显特点:夏季高峰时段全开,尖峰负荷一半以上都可能是空调吃掉的。但我们反过来想,空调本身是一个自带储能属性的柔性负荷。房间就是一个储热体,空调把房间温度维持在26度还是27度,对用户体感影响不大,但对电网来说,几百上千台空调同步降个1度,削峰效果比一台储能电站还猛。
这就是“最佳空调负荷优化控制”的价值所在:在保证用户舒适度的前提下,把空调负荷变成电网可以调度的资源,配合分布式光伏、风电的出力波动,实现配电网的经济、安全运行。
1.2 这个项目到底在做什么
一句话概括:在含可再生能源(光伏、风电)的配电网里,以Matlab为仿真平台,建立空调负荷的聚合模型,设计优化控制策略,目标是最小化系统运行成本(包含购电成本、网损成本、弃风弃光惩罚等),同时满足潮流约束、节点电压约束、空调温度和舒适度约束。
说得直白一点,就是回答三个问题:
- 空调负荷怎么建模?单台空调和聚合空调群的数学模型怎么搭?
- 可再生能源出力怎么模拟?光伏和风电的时序出力曲线怎么生成?
- 优化问题怎么求解?目标函数、约束条件、求解算法怎么在Matlab里落地?
这个研究方向在期刊论文里很常见,但很多论文的最大问题是:代码不公开、参数不明确、复现困难。我写这篇博文的目的,就是把我实际调试跑通过的完整思路和代码框架拆开讲清楚,尤其是那些论文里不写的坑。
1.3 适合谁参考
- 研究生:做需求响应、虚拟电厂、主动配电网方向的课题,需要一套能跑的仿真框架作为基线。
- 工程师:在搞空调聚合商、负荷聚合平台的,想理解底层优化模型的建立过程。
- 转行者:对电力系统优化感兴趣,想通过Matlab实操理解配电网运行机制的。
不管你是哪种,这篇文章都会给你一套从建模到仿真再到结果分析的可复现路径。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统建模与数学表述
2.1 配电网网络模型
我采用的是IEEE 33节点标准配电网系统,这是配电网研究里最经典的算例。系统基准电压12.66kV,基准功率10MVA,包含32条支路、5个联络开关。在Matlab里,我直接通过定义支路参数矩阵和节点负荷矩阵来构建系统。
matlab复制% 支路参数:起始节点、终止节点、电阻(ohm)、电抗(ohm)
branch = [
1, 2, 0.0922, 0.0470;
2, 3, 0.4930, 0.2511;
% ... 省略中间支路
32, 33, 0.7320, 0.5740;
];
% 节点负荷:节点编号、有功(kW)、无功(kVar)
load_data = [
1, 100, 60;
2, 90, 40;
% ... 省略
33, 60, 40;
];
这里强调一个问题:如果要做潮流计算,必须用标幺值系统。我之前见过不少初学者直接拿有名值去跑牛拉法,结果迭代几十次都不收敛。处理办法很简单,先取基准值归算:
matlab复制Sb = 10e6; % 基准功率 10MVA
Vb = 12.66e3; % 基准电压 12.66kV
Zb = Vb^2 / Sb; % 基准阻抗
% 支路阻抗标幺值
branch(:, 3:4) = branch(:, 3:4) / Zb;
2.2 空调负荷的物理模型
空调负荷的建模是整个项目最核心的部分,也是决定优化结果可信度的关键。我采用的是应用最广泛的等效热参数模型(ETP,Equivalent Thermal Parameter),这个模型把房间抽象成一个热容和一个热阻串联的电路,一阶微分方程描述如下:
[
C_a \cdot \frac{dT_{in}(t)}{dt} = \frac{T_{out}(t) - T_{in}(t)}{R_a} - \eta \cdot P_{AC}(t) \cdot s(t)
]
各物理量的含义:
- (C_a):房间等效热容(J/°C)
- (R_a):房间等效热阻(°C/W)
- (T_{in}):室内温度(°C)
- (T_{out}):室外温度(°C)
- (\eta):空调能效比(EER)
- (P_{AC}):空调额定电功率(W)
- (s(t)):空调开关状态(1运行,0停运)
离散化之后的形式:
[
T_{in}^{t+1} = T_{out}^{t+1} - (T_{out}^{t+1} - T_{in}^{t}) \cdot e^{-\frac{\Delta t}{R_a C_a}} - \eta \cdot P_{AC} \cdot R_a \cdot (1 - e^{-\frac{\Delta t}{R_a C_a}}) \cdot s(t)
]
用Matlab实现时,写成函数最清晰:
matlab复制function [T_in_next] = etp_model(T_in, T_out, P_AC, eta, R_a, C_a, delta_t, s)
coeff = exp(-delta_t / (R_a * C_a));
T_in_next = T_out - (T_out - T_in) * coeff - eta * P_AC * R_a * (1 - coeff) * s;
end
在实际项目里,我不会用单一的ETP参数去代表所有空调,因为每户的房间面积、保温性能、空调功率都不一样。我的做法是:用正态分布采样生成一批参数各异的空调个体,比如热容(C_a \sim N(5800, 800))(单位J/°C),热阻(R_a \sim N(12, 2))(单位°C/W),额定功率(P_{AC} \sim N(2.8, 0.5))(单位kW),这样聚合出来的负荷响应特性才更真实。
2.3 可再生能源出力模型
光伏(PV)和风电(WT)的出力需要考虑时序特性。我采用的是基于典型日曲线的数据驱动方法,不涉及复杂的气象模型。光伏出力简化为以正午为峰值的半波正弦曲线,风电使用常风速假设下的出力曲线。
在Matlab里生成:
matlab复制% 时间序列:24小时,分辨率15分钟
delta_t = 0.25; % 15分钟
T = 24 / delta_t; % 96个时段
t = 0: T-1;
% 光伏出力(标幺值,峰值1.0)
P_pv_pu = max(0, sin(pi * (t * delta_t - 6) / 12));
P_pv_pu(t * delta_t < 6 | t * delta_t > 18) = 0;
% 风电出力(考虑随机波动)
base_wind = 0.4 + 0.2 * sin(pi * t * delta_t / 24);
noise = 0.05 * randn(1, T);
P_wt_pu = max(0, base_wind + noise);
% 实际出力 = 装机容量 * 标幺值
P_pv = 500 * P_pv_pu; % 0.5MW光伏
P_wt = 300 * P_wt_pu; % 0.3MW风电
这里需要注意,光伏出力为零的时段(夜间),模型里必须设置硬约束,否则优化器会“聪明”地让光伏在夜间发电来降低目标函数,这就是纯数学解和物理可行解的区别了。
2.4 优化目标与约束条件
目标函数:
[
\min \quad \sum_{t=1}^{T} \left( c_{buy}(t) \cdot P_{grid}(t) + c_{loss} \cdot P_{loss}(t) + c_{pv_curtail} \cdot P_{pv_curtail}(t) + c_{comf} \cdot \sum_{i=1}^{N_{AC}} |T_{in,i}(t) - T_{ref}| \right) \cdot \Delta t
]
逐项解释:
- 第一项:从上级电网购电的成本,(c_{buy}(t))是分时电价。这个是主目标,占了成本的大头。
- 第二项:网络损耗成本,用来激励优化器不要产生过大的线损。
- 第三项:弃光惩罚,促进光伏消纳。当光伏出力大于负荷需求且倒送功率越限时,被迫弃光会产生惩罚。
- 第四项:舒适度惩罚,防止优化器为了省钱把空调全关了导致室内温度失控。这个权重系数需要反复调,太大会牺牲空调调节能力,太小用户舒适度恶化。
约束条件:
- 潮流约束(DistFlow模型):
[
P_{j} = P_{i} - r_{ij} \cdot \frac{P_{i}^{2} + Q_{i}^{2}}{V_{i}^{2}}
]
[
Q_{j} = Q_{i} - x_{ij} \cdot \frac{P_{i}^{2} + Q_{i}^{2}}{V_{i}^{2}}
]
[
V_{j}^{2} = V_{i}^{2} - 2(r_{ij}P_{i} + x_{ij}Q_{i}) + (r_{ij}^{2} + x_{ij}^{2})\frac{P_{i}^{2} + Q_{i}^{2}}{V_{i}^{2}}
]
- 节点电压约束:
[
V_{min} \le V_{i} \le V_{max}
]
- 空调运行状态约束:
[
T_{in,i}^{min} \le T_{in,i}(t) \le T_{in,i}^{max}
]
- 空调功率上下限约束:
[
0 \le P_{AC,i}(t) \le P_{AC,i}^{rated}
]
- 联络线功率约束(防止倒送功率过大):
[
P_{grid}^{min} \le P_{grid}(t) \le P_{grid}^{max}
]
3. 优化求解策略与Matlab实现
3.1 求解方法选择:智能算法 vs 数学规划
含约束的非线性优化问题,业界主流有两类求解思路:
- 数学规划法:用fmincon、CPLEX、Gurobi等工具,优点是精确、收敛快,缺点是建模要求高,非凸问题容易陷入局部最优。
- 智能优化算法:粒子群(PSO)、遗传算法(GA)、差分进化(DE)等,优点是实现简单、不需要梯度信息,缺点是计算量大、结果有随机性。
我的做法是:先用PSO做全局搜索得到一个较好的初值,再用fmincon做局部精修。两步走,兼顾全局探索能力和收敛精度。
在Matlab里,从R2021a开始推荐使用particleswarm函数,语法简单,不用自己手写完整的PSO循环:
matlab复制% 决策变量定义:
% x = [P_AC_1(1..T), P_AC_2(1..T), ..., P_AC_N(1..T)]
% 变量个数 = N_AC * T
nvars = N_AC * T;
% 变量下界:空调最小功率(0)
lb = zeros(1, nvars);
% 变量上界:空调额定功率
ub = repmat(P_AC_rated', 1, T);
% PSO求解
options = optimoptions('particleswarm', ...
'SwarmSize', 100, ...
'MaxIterations', 500, ...
'Display', 'iter');
[x_best, fval_best] = particleswarm(@(x) obj_fun(x, data), nvars, lb, ub, options);
3.2 目标函数和约束的Matlab函数封装
目标函数封装成函数文件,方便被优化器和后续的可视化调用:
matlab复制function [cost] = obj_fun(x, data)
% 解析决策变量
N_AC = data.N_AC;
T = data.T;
P_AC = reshape(x, N_AC, T);
% 初始化
total_cost = 0;
for t = 1:T
% 计算该时段所有空调的总功率
P_AC_total = sum(P_AC(:, t));
% 计算该时段的净负荷(基础负荷 + 空调 - 新能源)
P_net = data.P_base(t) + P_AC_total - data.P_pv(t) - data.P_wt(t);
% 购电功率
P_grid = max(0, P_net);
% 购电成本
buy_cost = data.price(t) * P_grid * data.delta_t;
% 网损估算(简化为一二次函数,实际应调潮流)
loss_est = data.loss_coeff * P_net^2;
loss_cost = data.c_loss * loss_est * data.delta_t;
% 弃光惩罚
curtail = max(0, data.P_pv(t) - data.P_pv_available(t));
curtail_cost = data.c_curtail * curtail * data.delta_t;
% 累加
total_cost = total_cost + buy_cost + loss_cost + curtail_cost;
end
cost = total_cost;
end
3.3 约束处理的三种实用方式
约束处理是优化实现里最容易翻车的地方。我总结三种做法,按推荐程度排序:
方法一:利用边界约束和罚函数
把温度约束作为罚函数项加到目标函数里,避免写复杂的非线性约束:
matlab复制% 在obj_fun里追加温度越限惩罚
for i = 1:N_AC
for t = 1:T
T_in = get_room_temp(data, i, t, P_AC(i, t));
if T_in > data.T_max(i)
total_cost = total_cost + data.penalty * (T_in - data.T_max(i))^2;
elseif T_in < data.T_min(i)
total_cost = total_cost + data.penalty * (data.T_min(i) - T_in)^2;
end
end
end
方法二:利用fmincon的非线性约束
如果要用fmincon,可以定义nonlcon函数返回温度不等式约束:
matlab复制function [c, ceq] = nonlcon(x, data)
N_AC = data.N_AC;
T = data.T;
P_AC = reshape(x, N_AC, T);
% 不等式约束 c(x) <= 0
c = [];
for i = 1:N_AC
T_in_series = simulate_temp(data, i, P_AC(i, :));
c = [c; T_in_series - data.T_max(i)]; % T_in - T_max <= 0
c = [c; data.T_min(i) - T_in_series]; % T_min - T_in <= 0
end
% 等式约束
ceq = [];
end
方法三:替换决策变量消除部分约束
当控制模式是“开/关”而不是连续调节时,用sigmoid函数把连续变量映射到0-1区间,然后用阈值确定开关状态。这个方法在后续做离散化时非常有用。
3.4 配电网潮流的Matlab调用
优化过程中每评估一次目标函数,理想情况下要重新算一次潮流。但考虑到计算效率,我不会全程调用牛拉法。策略是:
- 粗优化阶段:用简化网损公式代替潮流,速度快。
- 精优化阶段:调用
runpf(Matpower)或自定义牛拉法校验候选解,只对PSO的最终最优解和几个次优解做潮流校验,不合格的用罚函数修正。
如果不想额外安装Matpower,可以直接手写DistFlow潮流。下面的代码是我实现的前推回代法:
matlab复制function [V, P_loss] = distflow(branch, load, V0, max_iter)
% 前推回代法求辐射状配电网潮流
% 输入branch: [首端, 末端, r, x]
% load: 各节点负荷功率复向量
V = V0 * ones(size(load));
converged = false;
iter = 0;
while ~converged && iter < max_iter
iter = iter + 1;
V_old = V;
% 前推:从末端到首端求支路功率
% (代码省略具体节点编号映射)
% 回代:从首端到末端更新电压
% (代码省略具体节点编号映射)
% 收敛判断
if max(abs(V - V_old)) < 1e-6
converged = true;
end
end
end
4. 算例仿真与结果分析
4.1 基础数据与场景设置
我设计的算例包含以下几种场景,这样对比起来才清晰:
| 场景编号 | 场景描述 | 目的 |
|---|---|---|
| S1 | 无空调优化(基线) | 对比数据基础 |
| S2 | 空调恒温控制(26度) | 常规策略,作为对照组 |
| S3 | 空调优化控制(单目标:成本最低) | 验证经济性提升 |
| S4 | 空调优化控制(考虑舒适度约束) | 验证在舒适度约束下的优化效果 |
分时电价采用典型峰谷平三段式:峰时(10:00-14:00, 18:00-22:00)1.2元/kWh,平时(8:00-10:00, 14:00-18:00, 22:00-24:00)0.7元/kWh,谷时(0:00-8:00)0.3元/kWh。
4.2 主要仿真结果
结果一:空调总功率曲线对比
从结果看,优化策略下的空调总功率曲线不再是恒定的,而是明显“削峰填谷”:在电价高峰时段(18:00-22:00),空调群总功率比恒温控制模式下降约18%-25%;在电价低谷时段(0:00-8:00),空调群总功率略有上升,相当于预先给房间“蓄冷”。
这个结果符合预期,因为优化器本质上是在电价与舒适度惩罚之间做权衡:电价高的时候牺牲一点舒适度(室温上升1-2度),电价低的时候把温度多降一点(仍然在舒适度区间内)。
结果二:购电成本对比
优化后全天购电成本比恒温控制降低约12%-16%。以33节点系统、200台空调、单日仿真为例,节省金额约900-1300元。虽然单个台区一天节省的钱不算特别大,但放大到一个城市级别的负荷聚合商,这个数字就非常可观了。
结果三:光伏消纳率提升
在中午光伏大发时段,优化策略会主动调低空调设定温度(即增加空调功率),用电来“吸收”光伏出力,减少倒送功率。光伏消纳率从91%提升到了97%左右。这就是“源荷互动”最直观的效果。
4.3 舒适度-经济性的帕累托关系
我最想强调的一个结论是:舒适度和经济性不是简单的“鱼与熊掌”,而是一条可量化的帕累托前沿。
我做了多组仿真,每组设定不同的舒适度惩罚系数((c_{comf})从0.01到10),画出“平均室温偏移-购电成本”的散点图,趋势非常明显:
- 当(c_{comf})很小时:室温偏移可以到3-4度,购电成本最低。
- 当(c_{comf})很大时:室温偏移趋近0,购电成本接近恒温控制水平。
- 中间区域存在一个拐点,大约在(c_{comf}=0.1)到(0.5)之间。在这个范围内,只需要增加约2%-3%的成本,就能把平均室温偏移从3度压到1度以内。
我的经验值是:把舒适度惩罚系数设为电价的0.1倍左右,能取得比较好的平衡。如果侧重需求响应效果,可以降到0.05倍;如果侧重用户体验,可以设为0.2倍。
5. 代码实现中的关键模块与调试经验
5.1 完整的代码运行流程
整个项目的Matlab代码可以分成六个模块,我按依赖顺序整理如下,方便你搭自己的框架:
bash复制ProjectRoot/
├── main.m # 主程序入口,配置参数并调用各模块
├── data/
│ ├── case33.m # IEEE 33节点系统数据(支路、负荷)
│ ├── price_data.m # 分时电价数据
│ └── weather_data.m # 温度/光照/风速时序数据
├── models/
│ ├── etp_model.m # 单台空调ETP模型
│ ├── pv_model.m # 光伏出力模型
│ ├── wt_model.m # 风电出力模型
│ └── aggregate_ac.m # 空调聚合函数
├── optimization/
│ ├── obj_fun.m # 目标函数
│ ├── nonlcon.m # 约束函数
│ ├── pso_solver.m # PSO求解封装
│ └── refine_solver.m # fmincon精修
├── powerflow/
│ └── distflow.m # 前推回代潮流
└── results/
├── plot_results.m # 结果可视化
└── output/ # 结果数据保存
main.m的骨架结构如下:
matlab复制clear; clc; close all;
%% 1. 初始化系统数据
data = load_case33();
data.price = load_price('peak_flat_valley');
data.T_out = load_weather('temperature');
data.P_pv = pv_model(500, 0.25); % 500kW光伏
data.P_wt = wt_model(300, 0.25); % 300kW风电
%% 2. 初始化空调参数
data.N_AC = 200;
data.AC = init_ac_params(data.N_AC);
%% 3. 设置优化参数
data.delta_t = 0.25; % 15分钟
data.T = 24 / data.delta_t; % 96时段
data.c_buy = data.price;
data.c_comf = 0.1;
data.penalty = 100; % 罚函数系数
%% 4. 运行优化
nvars = data.N_AC * data.T;
lb = zeros(1, nvars);
ub = repmat([data.AC.P_rated]', data.T, 1)';
tic;
options = optimoptions('particleswarm', 'SwarmSize', 100, 'MaxIterations', 300);
[x_opt, cost_opt] = particleswarm(@(x) obj_fun(x, data), nvars, lb, ub, options);
toc;
%% 5. 结果可视化
plot_results(x_opt, data);
5.2 大规模空调聚合的降维技巧
如果你要算500台甚至1000台空调,直接以每台空调的逐时功率作为决策变量会导致优化问题规模爆炸。1000台空调96时段等于96000维优化变量,PSO基本跑不动。
一个标准的降维做法是:分组聚合。将参数相近的空调聚合为一类,每类采用相同的控制信号。比如按“热阻-热容-功率”三维特征做K-means聚类,将1000台空调聚为10组。优化决策变量从96000维降到960维,计算量减少两个数量级,结果精度损失通常在3%以内。
实际仿真中我做过的对比:500台空调,不聚类时PSO平均跑38分钟(还得是SwarmSize调小的情况),聚类成15组之后只要3分钟,目标函数值只差了1.7%。对于策略研究、参数敏感性分析来说,这个精度损失完全可接受。
5.3 温度初始化的坑
空调模型仿真中,初始室温设置不当会导致结果严重失真。如果初始温度设置过高(比如默认35度),而目标温度是26度,优化器在前几个时段必须疯狂降功率运行空调,导致起始阶段的空调功率虚高,进而影响整条曲线的形状。
我建议的初始化方式是:先跑一次“自由运行”(不优化)的空调仿真,把24小时自然运行后的室内温度作为优化仿真的初始温度。或者在仿真前设置一个“预热时段”:把0时刻往前推2小时,让空调在没有优化目标的情况下先把室温稳定在某一个舒适水平。
5.4 光照数据的平滑处理
光伏模型的噪声如果处理不好,会导致目标函数呈现大量局部极小值,PSO和fmincon都容易陷入其中。我的做法是对原始光照数据做移动平均平滑,再用平滑曲线生成光伏出力基准值,人为加上小范围随机扰动。
还有一个容易被忽略的问题:在仿真周期的最后几个时段,优化器会发现“后面没有时间了”,于是在最后时段肆无忌惮地调节空调功率而不考虑温度恢复。这是典型的时间边界效应。处理方法是在目标函数末尾追加一段“恢复时段”的额外仿真,强制要求仿真周期结束时室温恢复到初始状态。
6. 常见问题与调试经验实录
6.1 PSO不收敛或收敛极慢
典型表现:目标函数值在前50代快速下降,但后面300代几乎不动,或者曲线出现锯齿状波动。
排查顺序:
- 检查变量尺度:空调功率如果是千瓦,而目标函数里的电价是元/千瓦时,量级相差不大;但如果你某天把价格改成了万元/MWh,量级差10倍,粒子群的速度更新就很吃力。建议把所有变量归一到[0,1]区间,目标函数用统一的基准值归算。
- 检查种群设置:不要迷信默认参数。变量维度高的时候,SwarmSize建议取
max(50, nvars/2)。我实测300维以上问题,SwarmSize=50基本稳挂,100才能勉强跑起来。 - 检查罚函数系数:如果温度越限的惩罚过重,目标函数在可行域边界附近会出现巨大的“悬崖”,粒子一旦越过边界就被弹飞,整个搜索过程满是震荡。把惩罚系数从100降到10,往往立竿见影。
6.2 fmincon精修阶段的报错
fmincon常见的报错是“Objective function returns complex value”或“Failure in initial objective function evaluation”。90%的原因是潮流计算环节出现负数开平方。
DistFlow模型里 (V_j^2 = V_i^2 - 2(RP + XQ) + ...),如果功率过大或电压过低,右边可能变负数。解决思路:
matlab复制% 保护性处理:在潮流计算后检测电压合法性
if any(V.^2 < 0)
cost = 1e10; % 返回一个巨大值
return;
end
粗暴但在工程上有效。
6.3 空调功率出现高频振荡
优化结果里空调功率逐时段忽高忽低,像锯齿一样。原因是目标函数里缺少对功率变化率的约束或惩罚。现实中空调压缩机频繁启停不仅耗电,还伤设备。
修复方案很简单:
- 在目标函数追加启停次数惩罚项:
matlab复制for i = 1:N_AC
diff_P = abs(diff(P_AC(i, :)));
start_cost = sum(diff_P > 0.1 * data.AC(i).P_rated);
total_cost = total_cost + data.c_switch * start_cost;
end
- 或者对决策变量做平滑约束:
matlab复制c = [c; abs(diff(P_AC(i, :))) - data.max_ramp_rate]; % 限制爬坡速率
我用这个办法把振荡问题彻底解决了,代价是目标函数值上升了约2%-3%,但控制策略的实际可执行性大大提升。
6.4 仿真结果对初始种子敏感
相同代码跑两次,PSO结果不同,这是正常的。但对于研究工作,结果不可复现是个麻烦。建议在main.m开头固定随机种子:
matlab复制rng(42);
这行代码能让所有随机生成的空调参数、光照噪声、粒子初始位置保持一致,保证报告里的数字随时可复现。论文里写“for fair comparison, random seeds were fixed”是很常规的做法。
6.5 解决“空调全关”的极端策略
当舒适度惩罚系数调得太小时,优化器会干脆把大多数时段的空调功率设为0,反正省钱,室温爆了就罚一点点钱。这种结果论文里根本没法解释。
我的经验是:加入“最低运行时间”约束,即每台空调连续开或连续关的时长不能小于15分钟(一个仿真步长)或30分钟。这个约束用线性不等式表达比较麻烦,但可以通过罚函数近似——检测空调“开→关→开”的时间间隔,如果小于阈值就加惩罚。
7. 项目扩展与改进方向
7.1 从确定性优化走向鲁棒优化
当前的模型假设光伏和风电出力是已知的,实际中这些是随机量。把随机性引入模型的方向有三个层次:
- 随机规划(Stochastic Programming):用多个场景描述新能源出力不确定性,求解期望值最优。
- 鲁棒优化(Robust Optimization):用区间描述不确定集合,在最坏情况下求最优。
- 分布鲁棒优化(Distributionally Robust):结合前两者的优点,不需要精确概率分布。
Matlab侧可以直接调YALMIP工具箱配CPLEX或Gurobi求解,比全手写代码高效得多。我在另一个迭代项目里已经用YALMIP把优化问题改写成了二阶锥规划(SOCP)形式,求解速度比PSO快了近两个数量级,而且能保证全局最优。
7.2 从离线优化走向在线控制
论文里跑的是离线优化——拿到全天数据之后统一算。实际调度场景中,光伏出力和负荷都在变,需要滚动时域控制(MPC)框架:每15分钟滚动优化未来4小时的调度计划,只执行下一个15分钟的控制命令。
7.3 从集中式走向分布式
配电网规模扩大之后,集中式优化面临通信和算力的双重瓶颈。可以把空调负荷按台区、按楼栋划分给多个局部控制器,用交替方向乘子法(ADMM)实现分布式协同优化,各局部控制器只交换边界信息,不需要把全部数据传输到中央调度中心。
每次我在实际项目中把集中式改成ADMM分布式求解,通信数据量至少降一个数量级,而且每个子问题的求解时间也大幅缩短。不过这部分的代码复杂度会上一个台阶,建议先掌握集中式的基线再扩展。
8. 一点个人经验总结
这个项目我自己前前后后跑了几十版,最大的感触是:电力系统的优化控制,瓶颈通常不在算法,而在建模的准确性和约束的合理性。很多人一上来就研究高深的求解算法,忽略了模型本身的物理意义,导致写出漂亮但无法落地的结果。
以空调负荷为例,模型参数如果不贴近真实(比如热容热阻随便填一个数),再好的优化算法也白搭。我在调试过程中,花了将近一半时间在调参数、校数据、约束合理性上,只有不到一半时间在跑优化本身。但这种“笨功夫”没有白费,最终结果不仅论文导师满意,同行评审时也没有收到“模型参数不合理”之类的疑问。
如果你准备复现这个项目,我建议按这个顺序走:
- 先把33节点潮流跑通,确认基础数据没问题。
- 单独测试ETP空调模型的温度变化合理不合理(不接优化,纯仿真)。
- 加入光伏和风电,验证净负荷曲线形状正常。
- 最后才上优化。优化器跑出来的结果,先肉眼检查每个时段的总功率和温度是否合理,再谈下一步。
这套流程能帮你省掉大量的低级调试时间。后面我计划把手写的DistFlow潮流模块再优化一下,加上对含环网结构的支持,再把YALMIP+Cplex版本的SOCP求解代码整理出来。到时候再写一篇完整的对比文章,说说同一数学模型下,启发式算法和数学规划法到底谁更适合配电网空调负荷优化这个场景。
