基于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. 实现机器学习预测(价格预测、负荷预测)

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

相关推荐
wabs66624 分钟前
关于贪心算法的思考
算法·贪心算法
社交怪人39 分钟前
【判断大小】信息学奥赛一本通C语言解法(题号1043)
算法
Snasph1 小时前
GNU Make 用户手册(中文版)
服务器·算法·gnu
江澎涌1 小时前
拆解与 AI 的一次对话
人工智能·算法·程序员
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
Lsk_Smion2 小时前
力扣实训 _ [102].层序遍历--前序--后续_递归与非递归的实现
数据结构·算法·leetcode
小欣加油3 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
Halo_tjn4 小时前
反射与设计模式1
java·开发语言·算法
V搜xhliang02465 小时前
临床科研新范式:从选题到投稿,AI智能体如何接管全流程?
运维·数据结构·人工智能·算法·microsoft·数据挖掘·自动化
计算机安禾6 小时前
【算法分析与设计】第46篇:近似难度与不可近似性理论
网络协议·算法·ssl