计及调频成本和荷电状态恢复的多储能系统调频功率双层优化【蓄电池经济最优目标下充放电】(基于matlab+yalmip+cplex的蓄电池出力优化)

摘要:针对电网中不同类型储能电站调频成本、剩余调频
能力存在差异、储能电站内部储能单元 SOC 过高或过低
的问题,提出计及调频成本和 SOC 恢复的多储能系统调
频功率双层优化策略,该策略包含调频功率优化层和
SOC 优化层:在调频功率优化层引入与储能电站剩余调
频能力相关的抗拒系数,与调频成本共同构成目标函数,
根据不同类型储能电站的调频成本和剩余调频能力实现
调频功率优化分配;在 SOC 优化层引入 SOC 权重以恢复
储能单元 SOC 为目标对调频功率优化结果进行再分配。
采用包含三种不同电池类型的区域电网验证所提分配策
略的有效性,结果表明:与 3 种对比策略相比,所提策略
不仅具有较好的经济性,还能恢复各储能单元的 SOC,
显著提高了调频效果。

目标函数经济成本最小如下:
目标函数
目标函数参数:
目标函数参数
蓄电池参数:
  蓄电池参数
蓄电池soc初始值:
soc初值
四种策略方案:
策略
对策略二基于matlab+yalmip+cplex的蓄电池出力优化复现:
蓄电池经济最优目标下充放电
程序如下:

// matlab+yalmip+cplex的蓄电池出力优化
%% 策略二,按经济最优充放电
clc
clear
close all
[agc]=xlsread('agcdata','Sheet1','c2:c181');%agc参数
canshu;
X = sdpvar(8,180);         %电站1
Y = sdpvar(8,180);         %电站2
Z = sdpvar(8,180);         %电站3

%% 约束矩阵
constraint=[];
% objective = 0;

%% 功率平衡约束

    for j=1:180
        if agc(j)>=0
        constraint=[constraint,agc(j) == sum(X(:,j))*e1 + sum(Y(:,j))*e2 + sum(Z(:,j))*e3 ];
        else
        constraint=[constraint,agc(j) == sum(X(:,j))/e1 + sum(Y(:,j))/e2 + sum(Z(:,j))/e3 ];
        end
    end

 %% 储能约束
 for i=1:180
     % 第一单元
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,1) - sum(X(1,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,2) - sum(X(2,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,3) - sum(X(3,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,4) - sum(X(4,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,5) - sum(X(5,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,6) - sum(X(6,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,7) - sum(X(7,1:i)) <= S1*soc_max1];
     constraint=[constraint,S1*soc_min1 <= S1*soc(1,8) - sum(X(8,1:i)) <= S1*soc_max1];
     
     % 第二单元
     constraint=[constraint,S2*soc_min2 <= S2*soc(2,1) - sum(Y(1,1:i)) <= S2*soc_max2];
      constraint=[constraint,S2*soc_min2 <= S2*soc(2,2) - sum(Y(2,1:i)) <= S2*soc_max2];
      constraint=[constraint,S2*soc_min2 <= S2*soc(2,3) - sum(Y(3,1:i)) <= S2*soc_max2];
     constraint=[constraint,S2*soc_min2 <= S2*soc(2,4) - sum(Y(4,1:i)) <= S2*soc_max2]; 
      constraint=[constraint,S2*soc_min2 <= S2*soc(2,5) - sum(Y(5,1:i)) <= S2*soc_max2];
      constraint=[constraint,S2*soc_min2 <= S2*soc(2,6) - sum(Y(6,1:i)) <= S2*soc_max2];
      constraint=[constraint,S2*soc_min2 <= S2*soc(2,7) - sum(Y(7,1:i)) <= S2*soc_max2];
      constraint=[constraint,S2*soc_min2 <= S2*soc(2,8) - sum(Y(8,1:i)) <= S2*soc_max2];
      
      % 第三单元
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,1) - sum(Z(1,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,2) - sum(Z(2,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,3) - sum(Z(3,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,4) - sum(Z(4,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,5) - sum(Z(5,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,6) - sum(Z(6,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,7) - sum(Z(7,1:i)) <= S3*soc_max3];
     constraint=[constraint,S3*soc_min3 <= S3*soc(3,8) - sum(Z(8,1:i)) <= S3*soc_max3];
     
 end
  



%% 成本计算
% 投资成本
inv_cost1=(cost_s1*S1*0.08*1.08.^long1)/(365*1440*((1.08.^long1)-1))  ;
inv_cost2= (cost_s2*S2*0.08*1.08.^long2)/(365*1440*((1.08.^long2)-1)) ;
inv_cost3= (cost_s3*S3*0.08*1.08.^long3)/(365*1440*((1.08.^long3)-1))   ;
obj1=inv_cost1+inv_cost2+inv_cost3;

% 损耗成本
loss_cost=520;
obj2_1=0;
obj2_2=0;
obj2_3=0;
% for i=1:180
%      if agc(i)>=0         
%        obj2_1(i)=loss_cost*(1/e1 - 1)*sum(X(1:8,i))  ;%*REF_1(i)
%        obj2_2(i)=loss_cost*(1/e2 - 1)*sum(Y(1:8,i))  ;
%        obj2_3(i)=loss_cost*(1/e3 - 1)*sum(Z(1:8,i))  ;
%      else
%        obj2_1(i)=loss_cost*(1-e1)*sum(X(1:8,i))  ;%*REF_1(i)
%        obj2_2(i)=loss_cost*(1-e2)*sum(Y(1:8,i))  ;
%        obj2_3(i)=loss_cost*(1-e3)*sum(Z(1:8,i))  ;
%      end
% end

for i=1:180
    for n=1:8
       if agc(i)>=0         
       obj2_1=obj2_1+loss_cost*(1/e1 - 1)*X(n,i)  ;%*REF_1(i)
       obj2_2=obj2_2+loss_cost*(1/e2 - 1)*Y(n,i)  ;
       obj2_3=obj2_3+loss_cost*(1/e3 - 1)*Z(n,i)  ;
       else
       obj2_1=obj2_1+loss_cost*(1-e1)*X(n,i)  ;%*REF_1(i)
       obj2_2=obj2_2+loss_cost*(1-e2)*Y(n,i)  ;
       obj2_3=obj2_3+loss_cost*(1-e3)*Z(n,i)  ;
       end
     end
end
obj2=obj2_1 + obj2_2 + obj2_3;

% 折损成本

life_cost1 = 0.5*cost_p1*S1/times1 ;
life_cost2 = 0.5*cost_p2*S2/times2;
life_cost3 = 0.5*cost_p3*S3/times3 ;
obj3_1=0;
obj3_2=0;
obj3_3=0;
for i=1:180
    for n=1:8
     if agc(i)>=0
        obj3_1=obj3_1+life_cost1*(X(n,i))/(S1*e1*3600) ;
        obj3_2=obj3_2+life_cost2*(Y(n,i))/(S2*e2*3600) ;
        obj3_3=obj3_3+life_cost3*(Z(n,i))/(S1*e3*3600) ;
       else
        obj3_1=obj3_1+life_cost1*(X(n,i))*e1/(S1*3600);
        obj3_2=obj3_2+life_cost1*(X(n,i))*e2/(S1*3600);
        obj3_3=obj3_3+life_cost1*(X(n,i))*e3/(S1*3600);
     end
    end
end
obj3=obj3_1+obj3_2+obj3_3;
% obj4=obj3_1*(REF_1);
%% 目标函数
      objective=obj1+obj2 +obj3;
% objective=sum(objective_);

 %% 求解
ops=sdpsettings('verbose', 1, 'solver', 'cplex');
sol=optimize(constraint,objective,ops);
objective=value(objective)
%% 输出
figure
plot(agc)
X=value(X);
Y= value(Y);
Z=value(Z);
P=zeros(1,180);
for i=1:180
    for n=1:8
        P(i)=P(i)+X(n,i)+Y(n,i)+Z(n,i);
    end
end
hold on
plot(P)

运行结果如下:
电平衡结果图

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,这是一个比较复杂的优化问题,需要一些时间来编写程序。以下是一个可能的 MATLAB 代码示例,它使用 Gurobi 进行储能出力和额定容量的优化配置,优化目标储能成本最小,同时考虑功率约束、容量约束和荷电状态约束: ```matlab % 储能出力和额定容量优化配置 % 优化目标储能成本最小 % 约束条件:功率约束、容量约束和荷电状态约束 % 容量约束和功率约束 c_max = 100; % 最大容量 p_max = 50; % 最大功率 p_min = -50; % 最小功率 % 荷电状态约束 soc_min = 0.2; % 最小荷电状态 soc_max = 0.8; % 最大荷电状态 soc_init = 0.5; % 初始荷电状态 % 成本 c_c = 100; % 充电成本 c_d = 150; % 放电成本 % 时间步长 dt = 0.1; % 算法参数 options = optimoptions('linprog','Algorithm','dual-simplex'); % 定义模型 model.A = []; model.rhs = []; model.sense = []; model.lb = [zeros(1,10) ones(1,10)*-c_max]; % 10个时间步长的出力和10个时间步长的充放电容量 model.ub = [ones(1,10)*p_max ones(1,10)*c_max]; model.obj = [repmat(c_d,1,10) repmat(c_c,1,10)]; % 10个时间步长的成本 model.modelsense = 'min'; % 添加约束条件 for t = 1:10 % 功率约束 A = zeros(1,20); A(t) = 1; model.A = [model.A; A]; model.rhs = [model.rhs; p_max]; model.sense = [model.sense; '<=']; A = zeros(1,20); A(t) = -1; model.A = [model.A; A]; model.rhs = [model.rhs; -p_min]; model.sense = [model.sense; '<=']; % 容量约束 A = zeros(1,20); A(10+t) = 1; model.A = [model.A; A]; model.rhs = [model.rhs; c_max]; model.sense = [model.sense; '<=']; % 荷电状态约束 if t == 1 soc = soc_init; else soc = x(10+t-1); end % 充电 A = zeros(1,20); A(t) = -dt; A(10+t) = 1; model.A = [model.A; A]; model.rhs = [model.rhs; c_max*(soc_max-soc)]; model.sense = [model.sense; '<=']; % 放电 A = zeros(1,20); A(t) = dt; A(10+t) = -1; model.A = [model.A; A]; model.rhs = [model.rhs; c_max*(soc-soc_min)]; model.sense = [model.sense; '<=']; end % 求解模型 result = gurobi(model); % 输出结果 x = result.x(1:10); y = result.x(11:20); disp(['储能出力: ' num2str(x)]); disp(['储能容量: ' num2str(y)]); disp(['总成本: ' num2str(result.objval)]); ``` 这个代码示例中,我们使用了 MATLAB 的 Gurobi 接口来定义和求解优化模型。我们首先定义了容量约束和功率约束的最大值和最小值,以及荷电状态约束的最小值、最大值和初始值。然后,我们定义了充电和放电的成本,并指定了时间步长。接下来,我们使用 `optimoptions` 函数定义了用于求解线性规划的算法参数。然后,我们定义了优化模型的各个参数,包括线性目标函数、变量上下界和约束条件。对于每个时间步长,我们添加了功率约束、容量约束和荷电状态约束。最后,我们使用 `gurobi` 函数求解模型,并输出结果。 请注意,这只是一个示例代码,具体的问题和数据可能需要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电磁MATLAB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值