参考文献:
[1]丁佳昀,胡秦然,吴在军,等.低温环境下考虑电池寿命的微电网优化调度[J].中国电机工程学报,2024,44(10):3815-3824.
1.摘要
储能系统作为微电网重要组成部分,为微电网协调能量供需提供了解决方案。然而,在低温环境下,储能系统中电池寿命的快速衰减严重影响了系统的经济性和安全性。因此,该文提出一种低温环境下考虑电池寿命的微电网优化调度混合整数模型,来仿真微电网优化调度过程和高效计算储能充放电计划。首先,基于阿伦尼乌斯方程,分析低温环境中电池寿命的受影响机理;接着,采用考虑充放电次数和放电深度的电池寿命方程,构建电池全温度范围的老化模型;最后,构建考虑电池自发热和全温度范围的寿命衰减模型,并通过可行域凸极点组合方法对模型进行转化和简化,来避免模型中非线性项目导致无法获得全局最优解的困境。算例验证和对比分析表明,该文提出的模型能在低温环境中降低系统运行成本,减缓电池衰减速率,延长近一倍的电池寿命。
2.原理介绍
2.1低温下考虑电池寿命的电池成本模型
在低温环境中,一方面电池的充电效率较低,大量电能消耗于电池的副反应中;另一方面电池寿命损耗较大,加速了电池的更换周期。类似于发电单元,可以将电池的运行成本分为日燃料成本和日运维成本:
电池的日燃料成本与电池的充电效率和实时电价有关,可考虑为电池充电时损耗的电能成本,即:
电池的日运维成本主要由电池的损耗引起,与电池的寿命有直接关联,可通过贴现率实现二者的转化:
由于在放电深度和温度一定时,运维成本和循环次数近似呈线性关系,因此对运维成本作如下分段线性化处理:
2.2目标函数
通常微电网调度以系统总日运行成本最低作为优化目标,即:
2.3 约束条件
2.4 线性化处理
由于考虑到电池自热的影响,电池表面温度实则为与 Pbat 相关的函数,式(24)为非线性约束,为提高求解效率和准确性,可利用可行域凸极点线性组合的方法将非凸问题近似转换为凸问题,以便获得全局最优解。
电池充电和放电时的可行区域均可用一个凸区域表示,分别如图 3、4 所示。
可行区域的形状和大小由每时刻电网侧的输入输出功率与电池侧的充放电功率及电池充放电效率的函数投影决定,可行域内每个运行点对应的电网侧输入输出功率均可表示为该点电池侧的充放电功率和充放电效率的函数。由于凸可行域内任一点的横纵坐标都可由该区域凸极点的横纵坐标线性组合表示,且线性系数和为 1,可近似将可行域内任一点的 Pin或 Pout也用凸极点的 Pin或 Pout线性组合表示。
优化目标:
式(6)、(7)、(9)、(10)、(14)
约束条件:
式(11)—(13)、(15)—(23) 式(25)—(27)、(30)—(39)
使用MATLAB R2021b中的yalmip工具箱调用gurobi 9.1.2 求解器求解。
3.编程思路
3.1参数和变量定义
4.代码运行结果
5.matlab代码
%% 清除内存空间
clc
clear
close all
warning off
%% 系统参数
data = xlsread('data.xlsx'); % 相关数据
cbuy = data(:,2); % 购电电价
csell = data(:,3); % 售电电价
cwind = 0.52; % 风电运行成本
cpv = 0.72; % 光伏运行成本
Ta = data(:,4:6); % 环境温度
Pwind = data(:,7:9); % 风电出力
Ppv = data(:,10:12); % 光伏出力
Pload = data(:,13:15); % 负荷需求
Pbat_max = 40; % 电池充放电功率上限
Smax = 300; % 储能额定容量
SOC_min = 0.3; % 荷电状态下限
SOC_max = 0.95; % 荷电状态上限
SOC0 = 0.4; % 初始荷电状态
[ncha,ndis] = cal_efficiency(Ta); % 充放电效率
Pnet_max = 160; % 交互功率上限
r = 0.07; % 贴现率
C1kwh = 0.02; % 电池的度电运维成本
NT = 24; % 时段数
NS = 3; % 典型场景数
D = 4; % 分段数
dt = 1; % 时段间隔
a_Ta = 0.05; % 自发热比例因子
Zth = 0.1; % 电池热阻
dDOD1_min = [0.05,0.2,0.4,0.6]; % 第d段放电深度的下限
dDOD1_max = [0.2,0.4,0.6,0.7]; % 第d段放电深度的上限
%% 优化变量
gd = binvar(NT + 1,NS,D); % 0-1变量,放电深度处于第d分段时为1,否则为0
Pbat = sdpvar(NT,NS); % 储能输出功率
Pcha = sdpvar(NT,NS); % 储能充电功率
Pdis = sdpvar(NT,NS); % 储能放电功率
Qcha = binvar(NT,NS); % 储能充电状态变量
Qdis = binvar(NT,NS); % 储能放电状态变量
Qstadic = binvar(NT,NS); % 储能静置状态变量
Ssoc = sdpvar(NT + 1,NS); % 储能SOC
Sbat = binvar(NT,NS); % 储能荷电状态改变标志
Pbuy = sdpvar(NT,NS); % 微电网购电功率
Psell = sdpvar(NT,NS); % 微电网售电功率
Pnet = sdpvar(NT,NS); % 交互功率
Qnet = binvar(NT,NS); % 购售电状态变量
dDOD = sdpvar(NT + 1,NS); % 储能放电深度
dDOD1 = sdpvar(NT + 1,NS,D); % 储能放电深度分段
Tb = sdpvar(NT,NS); % 电池温度
n_cycle = sdpvar(1,NS); % 充放电循环数
U_Sbat = binvar(NT,NS,5);
%% 约束条件
Constraints = [];
%% 目标函数
C_COE = cbuy'*((1./ncha - 1).*Pcha);
LT = -0.0623*mean(Tb) + 2.56;
ad = [0.01,0.115,0.23,0.45];
kd = [1.23,3.77,6.28,15.43];
C_OM = sdpvar(NT,NS);
Ugd = sdpvar(NT,NS,D);
for t = 1:NT
for s = 1:NS
C_OM(t,s) = 0;
for d = 1:D
Constraints = [Constraints, Ugd(t,s,d) >= 0 , Ugd(t,s,d) <= 10000*gd(t,s,d) , Ugd(t,s,d) <= n_cycle(s)*ad(d) + kd(d) , Ugd(t,s,d) >= n_cycle(s)*ad(d) + kd(d) - 10000*(1 - gd(t,s,d))];
C_OM(t,s) = C_OM(t,s) + Ugd(t,s,d)*LT(s);
end
end
end
C_buy = cbuy'*Pbuy;
C_sell = csell'*Psell;
C_wind = cwind*sum(Pwind);
C_pv = cwind*sum(Ppv);
objective = C_COE + max(C_OM) + C_buy + C_sell + C_wind + C_pv;
Ps = [0.5;0.25;0.25];
%% 设求解器
% gurobi求解器
ops = sdpsettings('verbose', 3, 'solver', 'gurobi','showprogress',1);
ops.gurobi.TimeLimit = 600; % 运行时间限制为10min
ops.gurobi.MIPGap = 0.01; % 收敛精度限制为0.01
% cplex求解器
% ops = sdpsettings('verbose', 3, 'solver', 'cplex','showprogress',1,'debug',1);
% ops.cplex.timelimit = 600; % 运行时间限制为10min
% ops.cplex.mip.tolerances.mipgap = 0.01; % 收敛精度限制为0.01
% mosek求解器
% ops=sdpsettings('verbose', 3, 'solver', 'MOSEK','cachesolvers',1);
% ops.mosek.MSK_DPAR_OPTIMIZER_MAX_TIME=600;% 运行时间限制为10min
% ops.mosek.MSK_DPAR_MIO_TOL_REL_GAP=0.01; % 收敛精度限制为0.01
sol = optimize(Constraints, objective*Ps, ops);
%% 分析错误标志
if sol.problem == 0
disp('求解成功');
else
disp('运行出错');
yalmiperror(sol.problem)
end
%% 运行结果
show_result;
以上为部分代码,完整代码获取方式如下:
(文章复现)低温环境下考虑电池寿命的微电网优化调度matlab代码资源-CSDN文库