基于CVX的储能调峰调频优化模型

基于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);

模型特点

  1. 多市场参与:同时参与能量市场和调频辅助服务市场
  2. 物理约束:考虑充放电效率、SOC限制、功率限制
  3. 经济性:最大化总收益,考虑循环成本
  4. 风险控制:可扩展为鲁棒优化模型
  5. 实时调整:支持双层优化(日前+实时)

扩展方向

  1. 添加不确定性模型(随机优化)
  2. 考虑多类型储能(电池+抽水蓄能)
  3. 加入碳交易机制
  4. 考虑电网约束(节点电价、阻塞管理)
  5. 实现机器学习预测(价格预测、负荷预测)

此模型为基本框架,可根据实际需求进行调整和扩展。

相关推荐
啦啦啦_99991 小时前
KNN算法
算法
Engineer邓祥浩1 小时前
LeetCode 热题 100 - 第1题:两数之和
算法·leetcode·职场和发展
white-persist1 小时前
逆向入门经典题:从 IDA 反编译坑点到 Python 解题详细分析解释
c语言·开发语言·数据结构·python·算法·逆向·安全架构
炽烈小老头2 小时前
【每天学习一点算法 2026/04/23】盛最多水的容器
学习·算法
Ailan_Anjuxi2 小时前
手写数字识别零基础实战:基于PyTorch的CNN完整拆解
算法·图像识别
jiucaixiuyang2 小时前
散户如何使用手机T0算法?
算法·量化·t0
阿Y加油吧2 小时前
算法二刷复盘:LeetCode 79 单词搜索 & 131 分割回文串(Java 回溯精讲)
java·算法·leetcode
徐新帅2 小时前
4164:【GESP2512七级】学习⼩组
算法
北顾笙9802 小时前
day30-数据结构力扣
数据结构·算法·leetcode