基于CVX的储能调峰调频优化模型。模型用于解决储能系统在电力市场中的能量套利和频率调节服务。
1. 主模型:储能参与调峰调频联合优化
matlab
%% 储能调峰调频优化模型
% 功能:优化储能系统在能量市场和调频市场中的运行策略
% 模型:混合整数线性规划(MILP) - 使用CVX
% 目标:最大化总收益 = 调峰收益 + 调频收益 - 运行成本
clear; clc; close all;
cvx_clear;
addpath('cvx');
%% 1. 参数设置
T = 24; % 时间周期数(24小时)
dt = 1; % 时间间隔(小时)
% 储能系统参数
E_max = 10; % 最大储能容量 (MWh)
E_min = 1; % 最小储能容量 (MWh)
P_ch_max = 5; % 最大充电功率 (MW)
P_dis_max = 5; % 最大放电功率 (MW)
eta_ch = 0.95; % 充电效率
eta_dis = 0.95; % 放电效率
SOC_initial = 0.5; % 初始SOC
SOC_min = 0.1; % 最小SOC
SOC_max = 0.9; % 最大SOC
cycle_cost = 2; % 循环成本 ($/MWh)
% 价格数据
load_price_data(); % 加载价格数据
% 假设已定义:
% energy_price: 日前电价 ($/MWh)
% reg_price: 调频容量价格 ($/MW-h)
% reg_mileage_price: 调频里程价格 ($/MW)
% reg_signal: 调频信号 (MW)
%% 2. CVX优化模型
cvx_begin
% 决策变量
variables P_ch(T) P_dis(T) % 充放电功率
variables E(T+1) % 储能状态
variables P_reg_up(T) P_reg_down(T) % 上下调频容量
variable SOC(T+1) % 荷电状态
% 二元变量:防止同时充放电
variables u_ch(T) u_dis(T) binary
% 目标函数:最大化总收益
profit_energy = 0; % 能量套利收益
profit_reg_cap = 0; % 调频容量收益
profit_reg_mile = 0; % 调频里程收益
cost_cycle = 0; % 循环成本
for t = 1:T
% 能量套利收益 = 放电收入 - 充电成本
profit_energy = profit_energy + ...
(P_dis(t) * energy_price(t) - P_ch(t) * energy_price(t)) * dt;
% 调频容量收益
profit_reg_cap = profit_reg_cap + ...
(P_reg_up(t) + P_reg_down(t)) * reg_price(t) * dt;
% 调频里程收益 (基于里程价格和调频信号)
% 假设调频信号是正态分布的随机变量
expected_mileage = 0.5; % 期望里程系数
profit_reg_mile = profit_reg_mile + ...
expected_mileage * (P_reg_up(t) + P_reg_down(t)) * reg_mileage_price(t);
% 循环成本(与吞吐量成正比)
cost_cycle = cost_cycle + ...
cycle_cost * (P_ch(t) + P_dis(t)) * dt;
end
% 总收益
total_profit = profit_energy + profit_reg_cap + profit_reg_mile - cost_cycle;
maximize(total_profit)
subject to
% 1. 储能动态约束
for t = 1:T
% 能量平衡
E(t+1) == E(t) + eta_ch * P_ch(t) * dt - (1/eta_dis) * P_dis(t) * dt;
% SOC定义
SOC(t) == E(t) / E_max;
% 充放电功率与SOC关系
SOC(t+1) == SOC(t) + ...
(eta_ch * P_ch(t) - (1/eta_dis) * P_dis(t)) * dt / E_max;
end
% 初始和终值约束
E(1) == E_max * SOC_initial;
SOC(1) == SOC_initial;
E(T+1) >= E_max * SOC_initial; % 循环运行要求
% 2. 储能容量约束
for t = 1:T+1
E_min <= E(t) <= E_max;
SOC_min <= SOC(t) <= SOC_max;
end
% 3. 充放电功率约束
for t = 1:T
0 <= P_ch(t) <= P_ch_max * u_ch(t);
0 <= P_dis(t) <= P_dis_max * u_dis(t);
% 防止同时充放电
u_ch(t) + u_dis(t) <= 1;
% 调频容量约束
0 <= P_reg_up(t) <= P_dis_max;
0 <= P_reg_down(t) <= P_ch_max;
% 4. 调频容量与基值功率的关系
% 上调频:放电功率 + 上调容量 <= 最大放电功率
P_dis(t) + P_reg_up(t) <= P_dis_max;
% 下调频:充电功率 + 下调容量 <= 最大充电功率
P_ch(t) + P_reg_down(t) <= P_ch_max;
% 5. 能量与调频的耦合约束
% 提供上调频时,必须有足够的储能
P_reg_up(t) * dt / eta_dis <= E(t) - E_min;
% 提供下调频时,必须有足够的充电空间
P_reg_down(t) * dt * eta_ch <= E_max - E(t);
end
% 6. 爬坡率约束
for t = 2:T
-ramp_rate_max <= (P_ch(t) - P_ch(t-1)) <= ramp_rate_max;
-ramp_rate_max <= (P_dis(t) - P_dis(t-1)) <= ramp_rate_max;
end
cvx_end
2. 调频信号生成与调频性能评估
matlab
%% 调频信号生成与性能评估
function [reg_signal, reg_score] = generate_reg_signal(T, dt)
% 生成调频信号并计算调频性能得分
% 输入:T-时间点数,dt-时间间隔
% 输出:reg_signal-调频信号,reg_score-性能得分
% 1. 生成调频信号(基于实际数据或模拟)
% 方法1:使用正弦波叠加
t = 0:dt:(T-1)*dt;
f1 = 0.1; % 低频成分
f2 = 1.0; % 高频成分
signal1 = sin(2*pi*f1*t);
signal2 = 0.5*sin(2*pi*f2*t);
reg_signal = signal1 + signal2;
% 标准化到[-1, 1]
reg_signal = reg_signal / max(abs(reg_signal));
% 2. 调频性能得分模型
% 基于实际跟踪误差计算
function score = calculate_reg_performance(P_actual, P_setpoint, reg_signal)
% 计算调频性能得分
% 输入:实际功率、设定点功率、调频信号
n = length(P_actual);
error = zeros(1, n);
for i = 1:n
% 计算跟踪误差
if reg_signal(i) > 0
% 上调频
expected_power = P_setpoint(i) + reg_signal(i);
error(i) = abs(P_actual(i) - expected_power) / reg_signal(i);
else
% 下调频
expected_power = P_setpoint(i) + reg_signal(i);
error(i) = abs(P_actual(i) - expected_power) / abs(reg_signal(i));
end
end
% 性能得分(误差越小,得分越高)
avg_error = mean(error);
score = 100 * exp(-avg_error);
end
% 计算示例性能得分
reg_score = calculate_reg_performance(P_dis, P_ch, reg_signal);
end
3. 双层优化模型:日前+实时市场
matlab
%% 双层优化:日前市场计划 + 实时市场调整
function [schedule_day_ahead, schedule_real_time] = two_stage_optimization()
% 功能:双层优化模型
% 第一层:日前市场计划
% 第二层:实时市场调整
%% 第一层:日前市场优化
cvx_begin
variables P_ch_DA(T) P_dis_DA(T)
variables P_reg_up_DA(T) P_reg_down_DA(T)
variable E_DA(T+1)
% 目标:最大化日前市场预期收益
profit_DA = 0;
for t = 1:T
profit_DA = profit_DA + ...
(P_dis_DA(t) * price_DA(t) - P_ch_DA(t) * price_DA(t) + ...
(P_reg_up_DA(t) + P_reg_down_DA(t)) * reg_price_DA(t)) * dt;
end
maximize(profit_DA)
subject to
% 日前约束(类似主模型,但更宽松)
for t = 1:T
E_DA(t+1) == E_DA(t) + eta_ch*P_ch_DA(t)*dt - (1/eta_dis)*P_dis_DA(t)*dt;
0 <= P_ch_DA(t) <= P_ch_max;
0 <= P_dis_DA(t) <= P_dis_max;
P_dis_DA(t) + P_reg_up_DA(t) <= P_dis_max;
P_ch_DA(t) + P_reg_down_DA(t) <= P_ch_max;
end
E_DA(1) == E_max * SOC_initial;
E_min <= E_DA <= E_max;
cvx_end
%% 第二层:实时市场调整(滚动优化)
schedule_real_time = zeros(T, 2); % 存储实时决策
E_rt = E_DA(1); % 从日前计划的初始状态开始
for t = 1:T
% 获取实时价格和调频信号
price_rt = get_real_time_price(t);
reg_signal_rt = get_real_time_reg_signal(t);
% 实时优化(滚动窗口)
horizon = min(4, T-t+1); % 滚动窗口长度
cvx_begin quiet
variables P_ch_rt(horizon) P_dis_rt(horizon)
variables P_reg_up_rt(horizon) P_reg_down_rt(horizon)
variable E_rt_horizon(horizon+1)
% 目标:实时收益最大化
profit_rt = 0;
for h = 1:horizon
% 实时收益 = 能量收益 + 调频收益 - 偏离惩罚
deviation_penalty = 10; % 偏离日前计划的惩罚系数
profit_rt = profit_rt + ...
(P_dis_rt(h) * price_rt(h) - P_ch_rt(h) * price_rt(h) + ...
(P_reg_up_rt(h) + P_reg_down_rt(h)) * reg_price_rt(h)) * dt - ...
deviation_penalty * (abs(P_dis_rt(h) - P_dis_DA(t+h-1)) + ...
abs(P_ch_rt(h) - P_ch_DA(t+h-1)));
end
maximize(profit_rt)
subject to
% 实时运行约束
E_rt_horizon(1) == E_rt;
for h = 1:horizon
E_rt_horizon(h+1) == E_rt_horizon(h) + ...
eta_ch*P_ch_rt(h)*dt - (1/eta_dis)*P_dis_rt(h)*dt;
% 功率约束
0 <= P_ch_rt(h) <= P_ch_max;
0 <= P_dis_rt(h) <= P_dis_max;
% 跟踪调频信号
if h == 1
% 当前时刻需要跟踪实时信号
P_dis_rt(h) - P_ch_rt(h) == P_dis_DA(t) - P_ch_DA(t) + reg_signal_rt;
end
E_min <= E_rt_horizon(h) <= E_max;
end
cvx_end
% 执行第一步决策
schedule_real_time(t, 1) = P_ch_rt(1);
schedule_real_time(t, 2) = P_dis_rt(1);
% 更新储能状态
E_rt = E_rt + eta_ch*P_ch_rt(1)*dt - (1/eta_dis)*P_dis_rt(1)*dt;
end
end
4. 风险约束模型:考虑不确定性
matlab
%% 鲁棒优化模型:考虑价格不确定性
function [robust_schedule] = robust_optimization()
% 使用鲁棒优化处理价格不确定性
cvx_begin
variables P_ch(T) P_dis(T)
variables P_reg_up(T) P_reg_down(T)
variable E(T+1)
variable worst_case_profit
% 不确定参数:价格在区间内波动
price_nominal = energy_price; % 名义价格
price_uncertainty = 0.2; % 20%的不确定性
% 鲁棒优化目标:最大化最坏情况下的收益
maximize(worst_case_profit)
subject to
% 储能约束
for t = 1:T
E(t+1) == E(t) + eta_ch*P_ch(t)*dt - (1/eta_dis)*P_dis(t)*dt;
0 <= P_ch(t) <= P_ch_max;
0 <= P_dis(t) <= P_dis_max;
end
E(1) == E_max * SOC_initial;
E_min <= E <= E_max;
% 鲁棒约束:对任意价格波动,收益不低于worst_case_profit
for scenario = 1:3 % 考虑三种最坏情景
price_scenario = price_nominal * (1 - price_uncertainty * (scenario-1)/2);
scenario_profit = 0;
for t = 1:T
scenario_profit = scenario_profit + ...
(P_dis(t)*price_scenario(t) - P_ch(t)*price_scenario(t) + ...
(P_reg_up(t) + P_reg_down(t))*reg_price(t)) * dt;
end
worst_case_profit <= scenario_profit;
end
cvx_end
robust_schedule = [P_ch, P_dis];
end
5. 可视化与结果分析
matlab
%% 结果可视化
function visualize_results(P_ch, P_dis, P_reg_up, P_reg_down, E, energy_price, reg_price)
figure('Position', [100, 100, 1200, 800]);
% 1. 充放电功率
subplot(3, 2, 1);
stairs(1:T, P_ch, 'b-', 'LineWidth', 2, 'DisplayName', '充电功率');
hold on;
stairs(1:T, P_dis, 'r-', 'LineWidth', 2, 'DisplayName', '放电功率');
stairs(1:T, P_reg_up, 'g--', 'LineWidth', 1.5, 'DisplayName', '上调频容量');
stairs(1:T, P_reg_down, 'm--', 'LineWidth', 1.5, 'DisplayName', '下调频容量');
xlabel('时间 (h)');
ylabel('功率 (MW)');
title('储能功率与调频容量');
legend('Location', 'best');
grid on;
% 2. 储能SOC
subplot(3, 2, 2);
SOC = E / E_max;
plot(1:T+1, SOC*100, 'k-o', 'LineWidth', 2, 'MarkerSize', 4);
xlabel('时间 (h)');
ylabel('SOC (%)');
title('储能SOC变化');
ylim([0, 100]);
grid on;
hold on;
yline(SOC_min*100, 'r--', '最小SOC', 'LineWidth', 1.5);
yline(SOC_max*100, 'r--', '最大SOC', 'LineWidth', 1.5);
% 3. 电价曲线
subplot(3, 2, 3);
yyaxis left;
plot(1:T, energy_price, 'b-', 'LineWidth', 2);
ylabel('电价 ($/MWh)');
yyaxis right;
plot(1:T, reg_price, 'r-', 'LineWidth', 2);
ylabel('调频价格 ($/MW)');
xlabel('时间 (h)');
title('电价与调频价格');
legend({'电价', '调频价格'}, 'Location', 'best');
grid on;
% 4. 收益分解
subplot(3, 2, 4);
profit_energy = cumsum((P_dis - P_ch) .* energy_price * dt);
profit_reg = cumsum((P_reg_up + P_reg_down) .* reg_price * dt);
plot(1:T, profit_energy, 'b-', 'LineWidth', 2, 'DisplayName', '能量收益');
hold on;
plot(1:T, profit_reg, 'r-', 'LineWidth', 2, 'DisplayName', '调频收益');
plot(1:T, profit_energy+profit_reg, 'k-', 'LineWidth', 2, 'DisplayName', '总收益');
xlabel('时间 (h)');
ylabel('累积收益 ($)');
title('收益分解');
legend('Location', 'best');
grid on;
% 5. 功率分布
subplot(3, 2, 5);
histogram(P_ch, 20, 'FaceColor', 'b', 'FaceAlpha', 0.5, 'DisplayName', '充电功率');
hold on;
histogram(P_dis, 20, 'FaceColor', 'r', 'FaceAlpha', 0.5, 'DisplayName', '放电功率');
xlabel('功率 (MW)');
ylabel('频率');
title('功率分布直方图');
legend('Location', 'best');
grid on;
% 6. 调频性能
subplot(3, 2, 6);
% 计算调频里程
reg_mileage = cumsum(abs(P_reg_up) + abs(P_reg_down));
reg_revenue = cumsum((P_reg_up + P_reg_down) .* reg_price * dt);
yyaxis left;
plot(1:T, reg_mileage, 'g-', 'LineWidth', 2);
ylabel('调频里程 (MW)');
yyaxis right;
plot(1:T, reg_revenue, 'm-', 'LineWidth', 2);
ylabel('调频收入 ($)');
xlabel('时间 (h)');
title('调频性能');
legend('调频里程', '调频收入', 'Location', 'best');
grid on;
end
6. 收益计算函数
matlab
%% 收益计算与分析
function [results] = calculate_profits(P_ch, P_dis, P_reg_up, P_reg_down, E, params)
% 计算详细的收益分析
results = struct();
% 基本参数
T = length(P_ch);
dt = params.dt;
energy_price = params.energy_price;
reg_price = params.reg_price;
cycle_cost = params.cycle_cost;
% 1. 能量套利收益
energy_revenue = zeros(T, 1);
for t = 1:T
if P_dis(t) > 0
energy_revenue(t) = P_dis(t) * energy_price(t) * dt;
end
if P_ch(t) > 0
energy_revenue(t) = energy_revenue(t) - P_ch(t) * energy_price(t) * dt;
end
end
results.energy_revenue_total = sum(energy_revenue);
results.energy_revenue_daily = energy_revenue;
% 2. 调频容量收益
reg_cap_revenue = (P_reg_up + P_reg_down) .* reg_price * dt;
results.reg_cap_revenue_total = sum(reg_cap_revenue);
results.reg_cap_revenue_daily = reg_cap_revenue;
% 3. 循环成本
throughput = P_ch + P_dis; % 总吞吐量
cycle_cost_total = sum(throughput) * cycle_cost * dt;
results.cycle_cost = cycle_cost_total;
% 4. 总收益
results.total_revenue = results.energy_revenue_total + ...
results.reg_cap_revenue_total - ...
cycle_cost_total;
% 5. 效率分析
energy_in = sum(P_ch) * dt;
energy_out = sum(P_dis) * dt;
results.round_trip_efficiency = (energy_out * eta_dis) / (energy_in / eta_ch);
results.utilization_rate = sum(abs(P_ch) + abs(P_dis)) / (2 * P_ch_max * T);
% 6. 调频性能指标
results.reg_up_ratio = sum(P_reg_up) / (P_dis_max * T);
results.reg_down_ratio = sum(P_reg_down) / (P_ch_max * T);
results.avg_reg_capacity = mean(P_reg_up + P_reg_down);
% 显示结果
fprintf('\n========== 储能调峰调频收益分析 ==========\n');
fprintf('能量套利收益: $%.2f\n', results.energy_revenue_total);
fprintf('调频容量收益: $%.2f\n', results.reg_cap_revenue_total);
fprintf('循环成本: $%.2f\n', results.cycle_cost);
fprintf('总收益: $%.2f\n', results.total_revenue);
fprintf('------------------------------------------\n');
fprintf('循环效率: %.2f%%\n', results.round_trip_efficiency * 100);
fprintf('利用率: %.2f%%\n', results.utilization_rate * 100);
fprintf('平均调频容量: %.2f MW\n', results.avg_reg_capacity);
fprintf('==========================================\n\n');
end
参考代码 储能调峰调频模型matlab+cvx www.youwenfan.com/contentcst/160615.html
使用方法
matlab
%% 主程序示例
% 1. 设置参数
params = struct();
params.T = 24;
params.dt = 1;
params.E_max = 10;
params.P_ch_max = 5;
params.eta_ch = 0.95;
params.eta_dis = 0.95;
params.cycle_cost = 2;
params.SOC_initial = 0.5;
% 2. 生成模拟价格数据
params.energy_price = 30 + 20*randn(24,1); % 电价
params.energy_price = max(10, min(100, params.energy_price)); % 限制范围
params.reg_price = 5 + 3*randn(24,1); % 调频价格
params.reg_price = max(2, min(15, params.reg_price));
% 3. 运行优化
[P_ch, P_dis, P_reg_up, P_reg_down, E] = energy_storage_optimization(params);
% 4. 计算收益
results = calculate_profits(P_ch, P_dis, P_reg_up, P_reg_down, E, params);
% 5. 可视化
visualize_results(P_ch, P_dis, P_reg_up, P_reg_down, E, ...
params.energy_price, params.reg_price);
模型特点
- 多市场参与:同时参与能量市场和调频辅助服务市场
- 物理约束:考虑充放电效率、SOC限制、功率限制
- 经济性:最大化总收益,考虑循环成本
- 风险控制:可扩展为鲁棒优化模型
- 实时调整:支持双层优化(日前+实时)
扩展方向
- 添加不确定性模型(随机优化)
- 考虑多类型储能(电池+抽水蓄能)
- 加入碳交易机制
- 考虑电网约束(节点电价、阻塞管理)
- 实现机器学习预测(价格预测、负荷预测)
此模型为基本框架,可根据实际需求进行调整和扩展。