一、MATLAB优化工具箱概述
MATLAB提供了强大的优化工具箱用于解决混合整数规划问题:
| 组件 | 功能 | 关键函数 |
|---|---|---|
| Optimization Toolbox | 线性、非线性、混合整数规划 | intlinprog, linprog, fmincon |
| Global Optimization Toolbox | 全局优化、遗传算法 | ga, particleswarm |
| Problem-Based Optimization | 基于问题的建模 | optimproblem, optimvar |
推荐使用基于问题的建模,代码更直观,易于维护。
二、问题建模与MATLAB实现
2.1 问题描述
考虑一个用户侧储能系统 ,在分时电价下优化电池容量和运行策略,最小化年化总成本(投资成本 + 运行电费)。
2.2 完整MATLAB代码
matlab
%% 基于混合整数规划的电池容量优化
% 问题:优化电池储能系统的容量和日运行策略,最小化年化总成本
% 日期:2024年
clear; clc; close all;
%% 1. 参数设置
disp('=== 电池容量优化 - 参数设置 ===');
% 1.1 时间参数
T = 24; % 时段数 (24小时)
dt = 1; % 每时段长度 (小时)
days_per_year = 365; % 年运行天数
% 1.2 负荷与电价数据 (示例数据)
% 典型日负荷曲线 (kW)
P_load = [30, 25, 20, 18, 20, 25, 40, 60, 80, 75, 70, 65, ...
60, 55, 50, 60, 80, 100, 120, 110, 90, 70, 50, 40];
% 分时电价 (元/kWh) - 峰谷平电价
% 谷时(0:00-8:00): 0.3, 平时(8:00-16:00, 22:00-24:00): 0.6, 峰时(16:00-22:00): 1.0
price = [0.3*ones(1,8), 0.6*ones(1,8), 1.0*ones(1,6), 0.6*ones(1,2)];
% 1.3 电池参数
eta_ch = 0.95; % 充电效率
eta_dis = 0.95; % 放电效率
SOC_min = 0.2; % 最小荷电状态
SOC_max = 0.9; % 最大荷电状态
C_rate = 0.5; % 充放电倍率 (C)
dod_max = 0.8; % 最大放电深度
cycle_life = 5000; % 循环寿命 (次)
calendar_life = 10; % 日历寿命 (年)
% 1.4 成本参数
cost_cap = 1200; % 单位容量成本 (元/kWh)
cost_pwr = 800; % 单位功率成本 (元/kW)
discount_rate = 0.08; % 折现率
project_life = 10; % 项目寿命 (年)
% 1.5 电网约束
P_grid_max = 150; % 最大购电功率 (kW)
sell_back = false; % 是否允许向电网售电
if sell_back
sell_price = 0.4; % 售电电价 (元/kWh)
end
% 1.6 优化参数
E_max_min = 10; % 最小电池容量 (kWh)
E_max_max = 500; % 最大电池容量 (kWh)
P_max_min = 5; % 最小电池功率 (kW)
P_max_max = 250; % 最大电池功率 (kW)
%% 2. 基于问题的优化建模
disp('=== 构建优化模型 ===');
% 创建优化问题
prob = optimproblem('ObjectiveSense', 'minimize');
% 2.1 定义决策变量
% 连续变量
E_max = optimvar('E_max', 'LowerBound', E_max_min, 'UpperBound', E_max_max); % 电池容量 (kWh)
P_max = optimvar('P_max', 'LowerBound', P_max_min, 'UpperBound', P_max_max); % 电池功率 (kW)
% 24小时连续变量
P_ch = optimvar('P_ch', T, 'LowerBound', 0); % 充电功率 (kW)
P_dis = optimvar('P_dis', T, 'LowerBound', 0); % 放电功率 (kW)
SOC = optimvar('SOC', T, 'LowerBound', SOC_min, 'UpperBound', SOC_max); % 荷电状态
P_grid = optimvar('P_grid', T, 'LowerBound', 0, 'UpperBound', P_grid_max); % 电网购电功率
% 二进制变量 (表示充放电状态)
u_ch = optimvar('u_ch', T, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1); % 充电标志
u_dis = optimvar('u_dis', T, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1); % 放电标志
% 2.2 定义目标函数
% 年化投资成本
annuity_factor = discount_rate * (1 + discount_rate)^project_life / ...
((1 + discount_rate)^project_life - 1);
investment_cost = annuity_factor * (cost_cap * E_max + cost_pwr * P_max);
% 年运行电费
operating_cost = days_per_year * sum(price' .* P_grid * dt);
% 电池老化成本 (简化模型)
% 每天等效循环次数 = 总放电能量 / (2 * 容量 * 放电深度)
daily_discharge = sum(P_dis) * dt;
daily_cycles = daily_discharge / (2 * E_max * dod_max);
yearly_cycles = daily_cycles * days_per_year;
life_years = min(calendar_life, cycle_life / yearly_cycles);
replacement_cost = cost_cap * E_max / (life_years * annuity_factor);
% 总目标函数
prob.Objective = investment_cost + operating_cost + replacement_cost;
% 2.3 定义约束条件
disp('=== 添加约束条件 ===');
% 约束1: 功率平衡约束
prob.Constraints.power_balance = P_grid + eta_dis * P_dis == P_load' + P_ch;
% 约束2: 充放电互斥约束
for t = 1:T
prob.Constraints.mutex_constraint{t} = u_ch(t) + u_dis(t) <= 1;
end
% 约束3: 充放电功率上下限约束
prob.Constraints.charge_limit = P_ch <= u_ch * P_max;
prob.Constraints.discharge_limit = P_dis <= u_dis * P_max;
% 约束4: 充放电倍率约束
prob.Constraints.C_rate_ch = P_ch <= C_rate * E_max;
prob.Constraints.C_rate_dis = P_dis <= C_rate * E_max;
% 约束5: SOC动态约束
prob.Constraints.SOC_dynamics{1} = SOC(1) == SOC_min; % 初始SOC
for t = 1:T-1
prob.Constraints.SOC_dynamics{t+1} = SOC(t+1) == ...
SOC(t) + (eta_ch * P_ch(t) - P_dis(t)/eta_dis) * dt / E_max;
end
% 循环约束: 结束时的SOC等于初始SOC
prob.Constraints.SOC_cycle = SOC(T) == SOC_min;
% 约束6: 容量与功率关系约束 (可选)
prob.Constraints.power_capacity_relation = P_max == C_rate * E_max;
% 约束7: 电网交互约束
if ~sell_back
% 不允许向电网售电
prob.Constraints.no_sell_back = P_grid >= 0;
else
% 允许向电网售电
P_sell = optimvar('P_sell', T, 'LowerBound', 0);
prob.Constraints.power_balance_sell = P_grid - P_sell + eta_dis * P_dis == P_load' + P_ch;
% 更新目标函数,考虑售电收入
operating_cost = days_per_year * sum((price' .* P_grid - sell_price * P_sell) * dt);
prob.Objective = investment_cost + operating_cost + replacement_cost;
end
%% 3. 求解优化问题
disp('=== 开始求解 ===');
options = optimoptions('intlinprog', ...
'Display', 'iter', ...
'RelativeGapTolerance', 0.01, ...
'MaxTime', 300);
% 将基于问题转换为基于求解器的问题
[solver_prob, solver_x] = prob2struct(prob);
% 求解
tic;
[sol, fval, exitflag, output] = intlinprog(solver_prob);
solve_time = toc;
if exitflag > 0
disp('=== 求解成功 ===');
fprintf('求解时间: %.2f 秒\n', solve_time);
fprintf('目标函数值: %.2f 元/年\n', fval);
% 提取解决方案
solution = struct();
solution.E_max = sol(solver_x.E_max);
solution.P_max = sol(solver_x.P_max);
solution.P_ch = sol(solver_x.P_ch(1):solver_x.P_ch(2));
solution.P_dis = sol(solver_x.P_dis(1):solver_x.P_dis(2));
solution.SOC = sol(solver_x.SOC(1):solver_x.SOC(2));
solution.P_grid = sol(solver_x.P_grid(1):solver_x.P_grid(2));
solution.u_ch = sol(solver_x.u_ch(1):solver_x.u_ch(2));
solution.u_dis = sol(solver_x.u_dis(1):solver_x.u_dis(2));
% 计算各项成本
investment_annual = annuity_factor * (cost_cap * solution.E_max + cost_pwr * solution.P_max);
operating_annual = days_per_year * sum(price' .* solution.P_grid * dt);
daily_discharge = sum(solution.P_dis) * dt;
daily_cycles = daily_discharge / (2 * solution.E_max * dod_max);
yearly_cycles = daily_cycles * days_per_year;
life_years = min(calendar_life, cycle_life / yearly_cycles);
replacement_annual = cost_cap * solution.E_max / (life_years * annuity_factor);
fprintf('\n=== 优化结果 ===\n');
fprintf('最优电池容量: %.2f kWh\n', solution.E_max);
fprintf('最优电池功率: %.2f kW\n', solution.P_max);
fprintf('年化投资成本: %.2f 元/年\n', investment_annual);
fprintf('年运行电费: %.2f 元/年\n', operating_annual);
fprintf('年化替换成本: %.2f 元/年\n', replacement_annual);
fprintf('电池预期寿命: %.1f 年\n', life_years);
fprintf('日循环次数: %.3f 次/天\n', daily_cycles);
else
error('求解失败,退出标志: %d', exitflag);
end
%% 4. 结果可视化
disp('=== 生成可视化结果 ===');
time = 0:T-1;
figure('Position', [100, 100, 1200, 800]);
% 子图1: 负荷、充放电功率和电网购电功率
subplot(3,2,1);
plot(time, P_load, 'b-', 'LineWidth', 2, 'DisplayName', '负荷');
hold on;
plot(time, solution.P_ch, 'g-', 'LineWidth', 2, 'DisplayName', '充电功率');
plot(time, solution.P_dis, 'r-', 'LineWidth', 2, 'DisplayName', '放电功率');
plot(time, solution.P_grid, 'm--', 'LineWidth', 2, 'DisplayName', '电网购电');
xlabel('时间 (小时)');
ylabel('功率 (kW)');
title('功率曲线');
legend('Location', 'best');
grid on;
xlim([0, T-1]);
% 子图2: SOC变化曲线
subplot(3,2,2);
plot(time, solution.SOC*100, 'b-', 'LineWidth', 2);
xlabel('时间 (小时)');
ylabel('SOC (%)');
title('电池荷电状态变化');
grid on;
xlim([0, T-1]);
ylim([SOC_min*100, SOC_max*100]);
% 子图3: 电价曲线
subplot(3,2,3);
bar(time, price, 'FaceColor', [0.8, 0.8, 0.8]);
xlabel('时间 (小时)');
ylabel('电价 (元/kWh)');
title('分时电价');
grid on;
xlim([0, T-1]);
% 子图4: 充放电状态
subplot(3,2,4);
stairs(time, solution.u_ch, 'g-', 'LineWidth', 2, 'DisplayName', '充电状态');
hold on;
stairs(time, solution.u_dis, 'r-', 'LineWidth', 2, 'DisplayName', '放电状态');
xlabel('时间 (小时)');
ylabel('状态 (0/1)');
title('充放电状态');
legend('Location', 'best');
grid on;
xlim([0, T-1]);
ylim([-0.1, 1.1]);
% 子图5: 能量平衡
subplot(3,2,5);
energy_load = P_load * dt;
energy_ch = solution.P_ch * dt;
energy_dis = solution.P_dis * dt;
energy_grid = solution.P_grid * dt;
bar_data = [sum(energy_load), sum(energy_ch), sum(energy_dis), sum(energy_grid)];
bar_labels = {'总负荷', '总充电', '总放电', '电网购电'};
bar(1:4, bar_data);
set(gca, 'XTickLabel', bar_labels);
ylabel('能量 (kWh)');
title('日总能量统计');
grid on;
% 子图6: 成本分解
subplot(3,2,6);
cost_data = [investment_annual, operating_annual, replacement_annual, fval];
cost_labels = {'投资成本', '运行成本', '替换成本', '总成本'};
colors = [0.2, 0.6, 0.8; 0.8, 0.4, 0.2; 0.4, 0.8, 0.4; 0.6, 0.2, 0.6];
bar(1:4, cost_data, 'FaceColor', 'flat');
for i = 1:4
text(i, cost_data(i), sprintf('%.0f', cost_data(i)), ...
'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
end
set(gca, 'XTickLabel', cost_labels);
ylabel('成本 (元/年)');
title('年化成本分解');
grid on;
%% 5. 灵敏度分析
disp('=== 进行灵敏度分析 ===');
% 5.1 分析不同电池容量下的总成本
E_test = linspace(E_max_min, E_max_max, 20);
total_cost_test = zeros(size(E_test));
investment_test = zeros(size(E_test));
operating_test = zeros(size(E_test));
for i = 1:length(E_test)
% 固定容量,重新优化运行策略
prob_fixed = optimproblem('ObjectiveSense', 'minimize');
% 变量定义 (只定义运行变量,容量固定)
P_ch_fixed = optimvar('P_ch', T, 'LowerBound', 0);
P_dis_fixed = optimvar('P_dis', T, 'LowerBound', 0);
SOC_fixed = optimvar('SOC', T, 'LowerBound', SOC_min, 'UpperBound', SOC_max);
P_grid_fixed = optimvar('P_grid', T, 'LowerBound', 0, 'UpperBound', P_grid_max);
u_ch_fixed = optimvar('u_ch', T, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);
u_dis_fixed = optimvar('u_dis', T, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);
% 固定容量对应的功率
P_fixed = C_rate * E_test(i);
% 目标函数: 只考虑运行成本
prob_fixed.Objective = days_per_year * sum(price' .* P_grid_fixed * dt);
% 约束条件 (与之前类似,但容量固定)
prob_fixed.Constraints.power_balance = P_grid_fixed + eta_dis * P_dis_fixed == P_load' + P_ch_fixed;
for t = 1:T
prob_fixed.Constraints.mutex_constraint{t} = u_ch_fixed(t) + u_dis_fixed(t) <= 1;
end
prob_fixed.Constraints.charge_limit = P_ch_fixed <= u_ch_fixed * P_fixed;
prob_fixed.Constraints.discharge_limit = P_dis_fixed <= u_dis_fixed * P_fixed;
prob_fixed.Constraints.C_rate_ch = P_ch_fixed <= C_rate * E_test(i);
prob_fixed.Constraints.C_rate_dis = P_dis_fixed <= C_rate * E_test(i);
prob_fixed.Constraints.SOC_dynamics{1} = SOC_fixed(1) == SOC_min;
for t = 1:T-1
prob_fixed.Constraints.SOC_dynamics{t+1} = SOC_fixed(t+1) == ...
SOC_fixed(t) + (eta_ch * P_ch_fixed(t) - P_dis_fixed(t)/eta_dis) * dt / E_test(i);
end
prob_fixed.Constraints.SOC_cycle = SOC_fixed(T) == SOC_min;
% 求解
[prob_fixed_solver, x_fixed] = prob2struct(prob_fixed);
sol_fixed = intlinprog(prob_fixed_solver);
if ~isempty(sol_fixed)
% 提取运行成本
operating_test(i) = sol_fixed(prob_fixed_solver.f' == 1) * days_per_year;
% 计算总投资成本
investment_test(i) = annuity_factor * (cost_cap * E_test(i) + cost_pwr * P_fixed);
% 计算老化成本
P_dis_extracted = sol_fixed(x_fixed.P_dis(1):x_fixed.P_dis(2));
daily_discharge_i = sum(P_dis_extracted) * dt;
daily_cycles_i = daily_discharge_i / (2 * E_test(i) * dod_max);
yearly_cycles_i = daily_cycles_i * days_per_year;
life_years_i = min(calendar_life, cycle_life / yearly_cycles_i);
replacement_test(i) = cost_cap * E_test(i) / (life_years_i * annuity_factor);
total_cost_test(i) = investment_test(i) + operating_test(i) + replacement_test(i);
end
end
% 5.2 灵敏度分析可视化
figure('Position', [100, 100, 1000, 600]);
subplot(2,2,1);
plot(E_test, total_cost_test/1000, 'b-', 'LineWidth', 2);
hold on;
plot(solution.E_max, fval/1000, 'ro', 'MarkerSize', 10, 'LineWidth', 2);
xlabel('电池容量 (kWh)');
ylabel('总成本 (千元/年)');
title('总成本 vs 电池容量');
grid on;
legend('总成本曲线', '最优解', 'Location', 'best');
subplot(2,2,2);
plot(E_test, investment_test/1000, 'b-', 'LineWidth', 2, 'DisplayName', '投资成本');
hold on;
plot(E_test, operating_test/1000, 'r-', 'LineWidth', 2, 'DisplayName', '运行成本');
plot(E_test, replacement_test/1000, 'g-', 'LineWidth', 2, 'DisplayName', '替换成本');
xlabel('电池容量 (kWh)');
ylabel('成本分量 (千元/年)');
title('成本分解 vs 电池容量');
grid on;
legend('Location', 'best');
% 5.3 电价灵敏度分析
price_scales = [0.5, 0.75, 1.0, 1.25, 1.5]; % 电价缩放因子
optimal_capacity = zeros(size(price_scales));
for p = 1:length(price_scales)
% 使用缩放后的电价重新求解完整问题
price_scaled = price * price_scales(p);
% 简化: 只重新计算运行成本部分
prob_scaled = prob;
% 更新目标函数中的电价
prob_scaled.Objective = investment_cost + ...
days_per_year * sum(price_scaled' .* P_grid * dt) + ...
replacement_cost;
[prob_scaled_solver, x_scaled] = prob2struct(prob_scaled);
sol_scaled = intlinprog(prob_scaled_solver);
if ~isempty(sol_scaled)
optimal_capacity(p) = sol_scaled(x_scaled.E_max);
end
end
subplot(2,2,3);
bar(price_scales, optimal_capacity);
xlabel('电价缩放因子');
ylabel('最优电池容量 (kWh)');
title('最优容量 vs 电价水平');
grid on;
% 5.4 充放电效率灵敏度分析
eta_test = 0.85:0.02:0.95;
optimal_cost_eta = zeros(size(eta_test));
for e = 1:length(eta_test)
% 简化分析: 使用固定容量计算运行成本变化
eta_current = eta_test(e);
% 创建新的优化问题,固定容量为最优解
prob_eta = optimproblem('ObjectiveSense', 'minimize');
P_ch_eta = optimvar('P_ch', T, 'LowerBound', 0);
P_dis_eta = optimvar('P_dis', T, 'LowerBound', 0);
SOC_eta = optimvar('SOC', T, 'LowerBound', SOC_min, 'UpperBound', SOC_max);
P_grid_eta = optimvar('P_grid', T, 'LowerBound', 0, 'UpperBound', P_grid_max);
u_ch_eta = optimvar('u_ch', T, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);
u_dis_eta = optimvar('u_dis', T, 'Type', 'integer', 'LowerBound', 0, 'UpperBound', 1);
prob_eta.Objective = days_per_year * sum(price' .* P_grid_eta * dt);
% 约束 (使用当前效率)
prob_eta.Constraints.power_balance = P_grid_eta + eta_current * P_dis_eta == P_load' + P_ch_eta;
for t = 1:T
prob_eta.Constraints.mutex_constraint{t} = u_ch_eta(t) + u_dis_eta(t) <= 1;
end
prob_eta.Constraints.charge_limit = P_ch_eta <= u_ch_eta * solution.P_max;
prob_eta.Constraints.discharge_limit = P_dis_eta <= u_dis_eta * solution.P_max;
prob_eta.Constraints.C_rate_ch = P_ch_eta <= C_rate * solution.E_max;
prob_eta.Constraints.C_rate_dis = P_dis_eta <= C_rate * solution.E_max;
prob_eta.Constraints.SOC_dynamics{1} = SOC_eta(1) == SOC_min;
for t = 1:T-1
prob_eta.Constraints.SOC_dynamics{t+1} = SOC_eta(t+1) == ...
SOC_eta(t) + (eta_current * P_ch_eta(t) - P_dis_eta(t)/eta_current) * dt / solution.E_max;
end
prob_eta.Constraints.SOC_cycle = SOC_eta(T) == SOC_min;
[prob_eta_solver, x_eta] = prob2struct(prob_eta);
sol_eta = intlinprog(prob_eta_solver);
if ~isempty(sol_eta)
operating_eta = sol_eta(prob_eta_solver.f' == 1) * days_per_year;
optimal_cost_eta(e) = investment_annual + operating_eta + replacement_annual;
end
end
subplot(2,2,4);
plot(eta_test, optimal_cost_eta/1000, 'b-', 'LineWidth', 2);
hold on;
plot(eta_ch, fval/1000, 'ro', 'MarkerSize', 10, 'LineWidth', 2);
xlabel('充放电效率');
ylabel('总成本 (千元/年)');
title('总成本 vs 充放电效率');
grid on;
%% 6. 经济性评估
disp('=== 经济性评估 ===');
% 6.1 计算无电池情况下的电费
cost_without_battery = days_per_year * sum(price' .* P_load' * dt);
% 6.2 计算有电池情况下的电费
cost_with_battery = operating_annual;
% 6.3 计算投资回收期
annual_saving = cost_without_battery - cost_with_battery;
initial_investment = cost_cap * solution.E_max + cost_pwr * solution.P_max;
if annual_saving > 0
payback_period = initial_investment / annual_saving;
fprintf('\n=== 经济性指标 ===\n');
fprintf('无电池年电费: %.2f 元/年\n', cost_without_battery);
fprintf('有电池年电费: %.2f 元/年\n', cost_with_battery);
fprintf('年节约电费: %.2f 元/年\n', annual_saving);
fprintf('初始投资: %.2f 元\n', initial_investment);
fprintf('静态投资回收期: %.2f 年\n', payback_period);
fprintf('项目寿命内总节约: %.2f 元\n', annual_saving * project_life - initial_investment);
if payback_period < project_life
fprintf('结论: 项目经济可行 (回收期 < 项目寿命)\n');
else
fprintf('结论: 项目经济性不佳 (回收期 > 项目寿命)\n');
end
else
fprintf('注意: 电池系统未能节约电费,需重新评估\n');
end
%% 7. 结果输出
disp('=== 生成详细报告 ===');
% 创建结果结构体
results = struct();
results.optimal_capacity = solution.E_max;
results.optimal_power = solution.P_max;
results.total_annual_cost = fval;
results.investment_annual = investment_annual;
results.operating_annual = operating_annual;
results.replacement_annual = replacement_annual;
results.battery_life = life_years;
results.daily_cycles = daily_cycles;
results.payback_period = payback_period;
results.annual_saving = annual_saving;
results.solve_time = solve_time;
results.exit_flag = exitflag;
% 保存结果
save('battery_optimization_results.mat', 'results', 'solution');
% 输出到Excel
output_table = table(time', P_load', solution.P_ch, solution.P_dis, ...
solution.SOC*100, solution.P_grid, price', ...
'VariableNames', {'Hour', 'Load_kW', 'Charge_kW', 'Discharge_kW', ...
'SOC_percent', 'GridPower_kW', 'Price_RMBperkWh'});
writetable(output_table, 'battery_operation_schedule.xlsx');
fprintf('\n=== 优化完成 ===\n');
fprintf('结果已保存到 battery_optimization_results.mat\n');
fprintf('运行计划已导出到 battery_operation_schedule.xlsx\n');
三、关键特性说明
3.1 模型特点
- 完整的经济性模型:包含投资成本、运行成本、电池老化成本
- 基于问题的建模:代码直观,易于理解和修改
- 混合整数规划:包含连续变量和整数变量
- 灵敏度分析:分析关键参数对结果的影响
- 经济性评估:计算投资回收期等关键指标
3.2 核心优化变量
| 变量 | 类型 | 物理意义 |
|---|---|---|
E_max |
连续 | 电池容量 (kWh) |
P_max |
连续 | 电池功率 (kW) |
P_ch, P_dis |
连续 | 充放电功率 (kW) |
SOC |
连续 | 荷电状态 (0-1) |
u_ch, u_dis |
整数(0/1) | 充放电状态标志 |
P_grid |
连续 | 电网购电功率 (kW) |
3.3 主要约束条件
- 功率平衡 :
P_grid + η_dis*P_dis = P_load + P_ch - 充放电互斥 :
u_ch + u_dis ≤ 1 - 功率限制 :
P_ch ≤ u_ch*P_max,P_dis ≤ u_dis*P_max - 倍率限制 :
P_ch ≤ C_rate*E_max,P_dis ≤ C_rate*E_max - SOC动态 :
SOC(t+1) = SOC(t) + (η_ch*P_ch - P_dis/η_dis)*dt/E_max - SOC边界 :
SOC_min ≤ SOC ≤ SOC_max - SOC循环 :
SOC(结束) = SOC(开始)
参考代码 基于混合整数规划的电池容量优化 www.youwenfan.com/contentcst/160721.html
四、运行与调试
4.1 系统要求
- MATLAB R2017b或更高版本
- Optimization Toolbox
- 推荐使用MATLAB R2020a+
4.2 运行步骤
- 将代码保存为
battery_optimization.m - 在MATLAB中运行脚本
- 查看命令行输出和图形结果
- 检查生成的Excel文件和MAT文件
4.3 常见问题解决
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 求解时间过长 | 问题规模大,整数变量多 | 1. 增加MaxTime限制 2. 增加RelativeGapTolerance 3. 简化模型(如减少时段数) |
| 无可行解 | 约束条件矛盾 | 1. 检查约束一致性 2. 放宽某些约束边界 3. 检查初始值 |
| 结果不理想 | 参数设置不合理 | 1. 调整成本参数 2. 修改负荷/电价数据 3. 检查单位一致性 |
4.4 模型扩展建议
- 不确定性处理:使用随机规划或鲁棒优化处理负荷和电价的不确定性
- 多类型电池:扩展模型支持多种电池技术混合配置
- 可再生能源集成:加入光伏、风电等可再生能源
- 需求响应:考虑可调节负荷的协同优化
- 多目标优化:同时考虑经济性和碳排放最小化
五、应用场景
5.1 典型应用
- 工商业用户:通过峰谷套利降低电费
- 微电网:优化储能配置提高供电可靠性
- 可再生能源电站:平滑出力,提高消纳率
- 配电网:延缓投资,提高供电质量
- 电动汽车充电站:优化充电策略,降低需量电费
5.2 参数调整指南
| 应用场景 | 关键参数调整 | 典型值范围 |
|---|---|---|
| 峰谷套利 | 电价差、循环寿命 | 电价差>0.5元/kWh |
| 备用电源 | 可靠性要求、放电深度 | DOD限制严格 |
| 平滑出力 | 波动率限制、响应时间 | 高倍率电池 |
| 需求侧管理 | 需量电费、负荷曲线 | 考虑需量削减 |
六、总结
本MATLAB代码实现了基于混合整数规划的电池容量优化,具有以下特点:
- 完整性:涵盖从建模、求解到分析的全过程
- 实用性:包含经济性评估和灵敏度分析
- 可扩展性:模块化设计便于功能扩展
- 可视化:丰富的图形输出帮助理解结果
通过调整输入参数,本模型可适用于各种电池储能优化场景,为用户提供科学的投资决策支持。
注意事项:
- 实际应用中需根据具体数据调整参数
- 电池老化模型可根据实际情况进一步细化
- 大规模问题可能需要专业求解器(如Gurobi、CPLEX)的接口