1. 电力系统优化模型基础:蓄电池与市场交易的综合调度
在电力系统运行中,如何经济高效地调度各类资源是核心问题。本文将详细介绍一个考虑蓄电池充放电、电力市场买卖约束的优化模型,使用MATLAB+YALMIP+CPLEX工具链实现。这个模型特别适合电力系统优化领域的新手学习,它包含了该领域的几个关键要素:时间序列优化、储能系统建模、电力市场交易和约束处理。
1.1 模型核心问题定义
我们面对的是一个典型的电力系统经济调度问题:在24小时的时间范围内,系统需要满足用电负荷需求,可以通过三种方式实现:
- 从电力市场购电
- 向电力市场售电
- 使用蓄电池进行充放电调节
目标是最小化总运行成本,包括:
- 购电成本
- 售电收入(负成本)
- 电池损耗成本
同时需要满足以下约束条件:
- 功率平衡约束(供需实时平衡)
- 市场交易约束(购售电功率限制)
- 蓄电池运行约束(充放电功率、容量限制)
1.2 工具链选择与配置
本模型采用MATLAB作为开发平台,配合以下工具:
- YALMIP:MATLAB的建模语言,用于定义优化问题
- CPLEX:商业优化求解器,用于求解混合整数线性规划问题
这种组合在电力系统优化研究中非常常见,因为:
- YALMIP提供了直观的建模语法,大大简化了优化问题的表述
- CPLEX是业界领先的求解器,能高效处理大规模优化问题
- MATLAB提供了丰富的数据分析和可视化功能
安装配置要点:
- 确保已安装MATLAB(R2016b或更新版本)
- 安装YALMIP工具箱(可从官网免费获取)
- 获取CPLEX许可证(学术用户通常可免费申请)
2. 模型参数与变量定义
2.1 基础参数设置
首先定义时间范围和各类系统参数:
matlab复制T = 24; % 24小时调度周期
P_buy_max = 100; % 最大购电功率(kW)
P_sell_max = 80; % 最大售电功率(kW)
Bat_capacity = 200; % 电池容量(kWh)
Bat_charge_max = 50; % 最大充放电功率(kW)
Bat_discharge_eff = 0.95; % 放电效率
% 分时电价设置
C_buy = [0.5*ones(1,8), 0.7*ones(1,8), 0.6*ones(1,8)]; % 购电价格(元/kWh)
C_sell = C_buy * 0.9; % 售电价格为购电价格的90%
% 负荷需求曲线
load_demand = [50*ones(1,8), 80*ones(1,8), 60*ones(1,8)]; % 每小时负荷(kW)
参数设计说明:
- 电价采用分时电价,模拟真实电力市场场景
- 售电价格设为购电价格的90%,反映市场交易中的"买卖价差"
- 负荷曲线分为三个阶段,模拟日负荷变化
- 电池参数包括容量、最大功率和效率,这些都是储能系统建模的关键参数
2.2 决策变量定义
使用YALMIP的sdpvar定义决策变量:
matlab复制% 市场交易变量
P_buy = sdpvar(1,T); % 每小时购电量(kW)
P_sell = sdpvar(1,T); % 每小时售电量(kW)
% 蓄电池操作变量
P_charge = sdpvar(1,T); % 充电功率(kW)
P_discharge = sdpvar(1,T); % 放电功率(kW)
Bat_SOC = sdpvar(1,T); % 电池剩余容量(kWh)
变量说明:
- 所有变量都定义为1×24的向量,对应24小时
- 充放电功率分开定义,便于后续约束处理
- 电池SOC(State of Charge)是关键状态变量,需要跟踪其变化
3. 目标函数与约束条件构建
3.1 目标函数设计
目标是最小化总运行成本:
matlab复制% 总成本 = 购电成本 - 售电收入 + 电池损耗成本
total_cost = sum(C_buy.*P_buy - C_sell.*P_sell + 0.1*(P_charge+P_discharge));
成本项解释:
C_buy.*P_buy:购电成本,按时段电价计算-C_sell.*P_sell:售电收入(负成本)0.1*(P_charge+P_discharge):简化的电池损耗成本模型
注意:实际项目中电池损耗模型会更复杂,可能包括循环老化、日历老化等因素。这里的线性模型仅用于教学目的。
3.2 约束条件设置
3.2.1 功率平衡约束
每小时电力供需必须平衡:
matlab复制constraints = [];
for t=1:T
constraints = [constraints,
% 功率平衡方程
load_demand(t) == P_buy(t) + P_discharge(t)*Bat_discharge_eff - P_sell(t) - P_charge(t)
];
end
关键点:
- 放电功率需要乘以效率系数(0.95),反映能量转换损耗
- 充电功率直接减去,因为充电时损耗体现在电网侧
3.2.2 市场交易约束
购售电功率需要满足市场限制:
matlab复制for t=1:T
constraints = [constraints,
% 购电限制
P_buy(t) >= 0;
P_buy(t) <= P_buy_max;
% 售电限制
P_sell(t) >= 0;
P_sell(t) <= P_sell_max;
];
end
3.2.3 蓄电池运行约束
蓄电池操作需要满足物理限制:
matlab复制% 充放电功率限制
for t=1:T
constraints = [constraints,
P_charge(t) >= 0;
P_charge(t) <= Bat_charge_max;
P_discharge(t) >= 0;
P_discharge(t) <= Bat_charge_max;
];
end
% 电池SOC约束
constraints = [constraints,
Bat_SOC(1) == 100 + P_charge(1) - P_discharge(1) % 初始容量设为100kWh
];
for t=2:T
constraints = [constraints,
% SOC递推公式
Bat_SOC(t) == Bat_SOC(t-1) + P_charge(t) - P_discharge(t),
% SOC安全范围(20%~90%)
0.2*Bat_capacity <= Bat_SOC(t) <= 0.9*Bat_capacity
];
end
电池约束要点:
- 充放电功率不能超过额定值
- SOC更新采用递推公式,反映能量守恒
- SOC限制在20%-90%之间,避免过充过放,延长电池寿命
4. 模型求解与结果分析
4.1 求解器配置与优化
配置CPLEX求解器并求解:
matlab复制ops = sdpsettings('solver','cplex','verbose',0);
optimize(constraints, total_cost, ops)
求解器设置说明:
- 指定使用CPLEX求解器
verbose=0关闭求解过程输出,使结果更简洁
4.2 结果可视化
使用MATLAB绘制优化结果:
matlab复制% 提取优化结果
P_buy_opt = value(P_buy);
P_sell_opt = value(P_sell);
P_charge_opt = value(P_charge);
P_discharge_opt = value(P_discharge);
Bat_SOC_opt = value(Bat_SOC);
% 绘制购售电和SOC曲线
figure(1)
stairs(P_buy_opt,'r','LineWidth',2); hold on
stairs(P_sell_opt,'b--','LineWidth',2);
stairs(Bat_SOC_opt,'g:','LineWidth',2);
xlabel('时间(小时)');
ylabel('功率(kW)/容量(kWh)');
title('优化调度结果');
legend('购电','售电','电池容量');
grid on;
% 绘制充放电功率
figure(2)
stairs(P_charge_opt,'m','LineWidth',2); hold on
stairs(P_discharge_opt,'c','LineWidth',2);
xlabel('时间(小时)');
ylabel('功率(kW)');
title('蓄电池充放电功率');
legend('充电功率','放电功率');
grid on;
典型结果分析:
- 在电价低谷时段(如夜间),系统倾向于购电并充电
- 在电价高峰时段(如白天),系统倾向于放电或售电
- SOC曲线呈现周期性变化,维持在安全范围内
4.3 成本分析
计算并显示总成本:
matlab复制total_cost_value = value(total_cost);
disp(['总运行成本:', num2str(total_cost_value), '元']);
成本构成可以进一步分解:
matlab复制buy_cost = sum(C_buy.*P_buy_opt);
sell_income = sum(C_sell.*P_sell_opt);
battery_cost = sum(0.1*(P_charge_opt+P_discharge_opt));
disp(['购电成本:', num2str(buy_cost), '元']);
disp(['售电收入:', num2str(sell_income), '元']);
disp(['电池损耗成本:', num2str(battery_cost), '元']);
5. 常见问题与调试技巧
5.1 模型无可行解
可能原因及解决方法:
- 负荷需求过高:检查负荷需求是否超过最大购电+最大放电能力
- 解决方法:调整负荷曲线或增加系统容量
- 电池容量不足:SOC约束可能过于严格
- 解决方法:放宽SOC限制范围(如10%-95%)
- 约束冲突:可能存在相互矛盾的约束条件
- 解决方法:逐步添加约束,定位冲突点
5.2 结果不符合预期
常见异常及排查:
- 电池始终不放电:
- 检查售电价格是否设置合理(应高于放电成本)
- 确认放电效率系数已正确应用
- 购售电同时发生:
- 这是正常现象,在特定电价结构下可能最优
- 如需禁止,可添加约束:
P_buy(t)*P_sell(t) == 0
- SOC超出限制:
- 检查SOC递推公式是否正确
- 确认初始SOC在允许范围内
5.3 性能优化建议
- 模型简化:
- 对于大型系统,可考虑减少时间分辨率(如每小时改为每2小时)
- 简化电池损耗模型(当不是研究重点时)
- 求解器设置:
- 尝试不同的求解器(如GUROBI)
- 调整求解器参数(如最优间隙容忍度)
- 代码优化:
- 使用向量化操作替代循环
- 预分配数组空间
6. 模型扩展与进阶方向
6.1 可再生能源集成
在现有模型中加入光伏发电:
matlab复制% 添加光伏预测出力
PV_pred = [zeros(1,6), linspace(0,60,4), 60*ones(1,8), linspace(60,0,6)];
% 修改功率平衡约束
for t=1:T
constraints = [constraints,
load_demand(t) == P_buy(t) + P_discharge(t)*Bat_discharge_eff + PV_pred(t) - P_sell(t) - P_charge(t)
];
end
6.2 不确定性处理
考虑光伏预测误差:
matlab复制% 定义预测误差范围
PV_error = 0.2; % ±20%误差
% 采用鲁棒优化方法
for t=1:T
constraints = [constraints,
load_demand(t) <= P_buy(t) + P_discharge(t)*Bat_discharge_eff + (1-PV_error)*PV_pred(t) - P_sell(t) - P_charge(t),
load_demand(t) >= P_buy(t) + P_discharge(t)*Bat_discharge_eff + (1+PV_error)*PV_pred(t) - P_sell(t) - P_charge(t)
];
end
6.3 多目标优化
同时考虑经济和环境目标:
matlab复制% 假设购电碳排放强度
carbon_intensity = [0.6*ones(1,8), 0.8*ones(1,8), 0.7*ones(1,8)]; % kgCO2/kWh
% 计算总碳排放
total_carbon = sum(carbon_intensity.*P_buy);
% 多目标处理(加权法)
weight_cost = 0.7; % 经济权重
weight_carbon = 0.3; % 环境权重
total_objective = weight_cost*total_cost + weight_carbon*total_carbon;
optimize(constraints, total_objective, ops);
在实际项目中,这个基础模型可以从以下几个方向进一步扩展:
- 更精细的电池老化模型
- 考虑网络约束的分布式系统
- 参与多时间尺度市场交易
- 机器学习辅助的预测与优化结合