2024电工杯A题保姆级分析完整思路+代码+数据教学
A题题目:园区微电网风光储协调优化配置
以下仅展示部分,完整版看文末的文章
%A_1_1_A
% 清除工作区
clear;clc;close all;warning off;
%读取参数
%正常读取
% P_LOAD=xlsread('附件1:各园区典型日负荷数据.xlsx');
% P_PVWT=xlsread('附件2:各园区典型日风光发电数据.xlsx');
% P_load=P_LOAD(:,2)';
% P_PV=750*P_PVWT(:,2)';
%若无法读取直接使用该数据
P_load=[275,275,277,310,310,293,293,380,375,281,447,447,447,405,404,403,268,313,287,288,284,287,277,275];%电负荷/kW
P_PV=750*[0,0,0,0,0,0,0,.0058,.3026,.6020,.7711,.8555,.8531,.7842,.6437,.4242,.0619,0,0,0,0,0,0,0,];%光伏输出/kW
%常数
N_T=24;%24h
C_buy=1;%购电价格:元/kWh
C_PV=.5;%风电价格:元/kWh
C_WT=.4;%价格:元/kWh
% 决策变量
P_buy = sdpvar(1,N_T);%购电功率
P_waste = sdpvar(1,N_T);%弃电功率
% 设置约束条件
C=[
P_PV+P_buy==P_load+P_waste %电平衡
P_buy >= 0 % 购电功率非负
P_waste >= 0 % 弃电功率非负
];
ops = sdpsettings('solver', 'gurobi', 'verbose', 2, 'debug', 1);
F = sum(P_PV*C_PV+C_buy*P_buy);
result = optimize(C,F,ops);
if result.problem == 0 % problem =0 代表求解成功
disp(value(F));
else
disp('求解出错');
end
% 定义要删除的文件名
filename = 'A_1_1_A.xlsx';
% 使用delete函数删除文件
if exist(filename, 'file')
delete(filename);
disp(['已成功删除文件:' filename]);
else
disp(['文件 ' filename ' 不存在。']);
end
data = table({'购电量/kWh', '弃风弃光电量/kWh', '总供电成本/¥', '单位电量平均供电成本/(¥/kWh)'}', ...
[sum(value(P_buy)), sum(value(P_waste)),value(F),value(F)/sum(P_load)]', 'VariableNames', {'经济参数', 'A_1_1_A'});
writetable(data, 'A_1_1_A.xlsx');
figure('Position', [880, 60, 800, 500]); % [左下角 x 坐标, 左下角 y 坐标, 宽度, 高度]
b=bar([value(P_buy);value(P_PV);-value(P_waste)]','stacked');hold on;
b(1).FaceColor = [156/255 168/255 184/255];
b(2).FaceColor = [122/255 103/255 71/255];
b(3).FaceColor = [201/255 156/255 78/255];
plot(P_load,'k','LineWidth',2);hold on;
legend('购电','光伏','弃电','电负荷','Orientation', 'horizontal')%横着放图例
legend('Location', 'NorthWest'); % 根据需要选择位置
title('A\_1\_1\_A电平衡');
saveas(gcf, 'A_1_1_A电平衡.jpg');
%A_1_1_B
% 清除工作区
clear;clc;close all;warning off;
%读取参数
%正常读取
% P_LOAD=xlsread('附件1:各园区典型日负荷数据.xlsx');
% P_PVWT=xlsread('附件2:各园区典型日风光发电数据.xlsx');
% P_load=P_LOAD(:,3)';
% P_WT=1000*P_PVWT(:,3)';
%若无法读取直接使用该数据
P_load=[241,253,329,315,290,270,307,354,264,315,313,291,360,369,389,419,412,291,379,303,331,306,285,324];%电负荷/kW
P_WT=1000*[0.2301,0.3828,0.2968,0.4444,0.5029,0.3609,0.2402,0.0473,0.1538,0.1068,0.0518,0.2169,0.3546,...
0.2194,0.1110,0.2186,0.3779,0.3421,0.5008,0.4646,0.2197,0.1783,0.1535,0.0000,];%风电输出/kW
%常数
N_T=24;%24h
C_buy=1;%购电价格:元/kWh
C_PV=.5;%风电价格:元/kWh
C_WT=.4;%价格:元/kWh
% 决策变量
P_buy = sdpvar(1,N_T);%购电功率
P_waste = sdpvar(1,N_T);%弃电功率
% 设置约束条件
C=[
P_WT+P_buy==P_load+P_waste %电平衡
P_buy >= 0 % 购电功率非负
P_waste >= 0 % 弃电功率非负
];
ops = sdpsettings('solver', 'gurobi', 'verbose', 2, 'debug', 1);
F = sum(P_WT*C_WT+C_buy*P_buy);
result = optimize(C,F,ops);
if result.problem == 0 % problem =0 代表求解成功
disp(value(F));
else
disp('求解出错');
end
% 定义要删除的文件名
filename = 'A_1_1_B.xlsx';
% 使用delete函数删除文件
if exist(filename, 'file')
delete(filename);
disp(['已成功删除文件:' filename]);
else
disp(['文件 ' filename ' 不存在。']);
end
data = table({'购电量/kWh', '弃风弃光电量/kWh', '总供电成本/¥', '单位电量平均供电成本/(¥/kWh)'}', ...
[sum(value(P_buy)), sum(value(P_waste)),value(F),value(F)/sum(P_load)]', 'VariableNames', {'经济参数', 'A_1_1_B'});
writetable(data, 'A_1_1_B.xlsx');
figure('Position', [880, 60, 800, 500]); % [左下角 x 坐标, 左下角 y 坐标, 宽度, 高度]
b=bar([value(P_buy);value(P_WT);-value(P_waste)]','stacked');hold on;
b(1).FaceColor = [156/255 168/255 184/255];
b(2).FaceColor = [123/255, 139/255, 111/255];
b(3).FaceColor = [201/255 156/255 78/255];
plot(P_load,'k','LineWidth',2);hold on;
legend('购电','风电','弃电','电负荷','Orientation', 'horizontal')%横着放图例
legend('Location', 'NorthWest'); % 根据需要选择位置
title('A\_1\_1\_B电平衡');
saveas(gcf, 'A_1_1_B电平衡.jpg');
%A_1_2_A
% 清除工作区
clear;clc;close all;warning off;
%读取参数
%正常读取
% P_LOAD=xlsread('附件1:各园区典型日负荷数据.xlsx');
% P_PVWT=xlsread('附件2:各园区典型日风光发电数据.xlsx');
% P_load=P_LOAD(:,2)';
% P_PV=750*P_PVWT(:,2)';
%若无法读取直接使用该数据
P_load=[275,275,277,310,310,293,293,380,375,281,447,447,447,405,404,403,268,313,287,288,284,287,277,275];%电负荷/kW
P_PV=750*[0,0,0,0,0,0,0,.0058,.3026,.6020,.7711,.8555,.8531,.7842,.6437,.4242,.0619,0,0,0,0,0,0,0,];%光伏输出/kW
%常数
N_T=24; %24h
C_buy=1; %购电价格:元/kWh
C_PV=.5; %风电价格:元/kWh
C_WT=.4; %价格:元/kWh
eta=.95; %充放电效率
SOC_lb=100*0.1;
SOC_ub=100*0.9;
SOC0=SOC_lb;
Emax=50; %充放电最大功率
% 决策变量
P_buy = sdpvar(1,N_T); %购电功率
P_waste = sdpvar(1,N_T);%弃电功率
SOC = sdpvar(1,N_T); %电池电量
E_ch = sdpvar(1,N_T); %充能功率
E_dis = sdpvar(1,N_T); %放能功率
U_ch = binvar(1,N_T); %充能状态
U_dis = binvar(1,N_T); %放能状态
% 设置约束条件
C=[
P_PV+P_buy+E_dis==E_ch+P_load+P_waste %电平衡
P_buy >= 0 % 购电功率非负
P_waste >= 0 % 弃电功率非负
U_ch+U_dis<=1 %不能同时充放
%SOC0==SOC(N_T)
SOC_lb<=SOC & SOC<=SOC_ub
E_ch>=0 & E_ch<=U_ch*Emax %充能限制
E_dis>=0 & E_dis<=U_dis*Emax %放能限制
];
for t=1:N_T %此文档为DS数模团队原创代码,如需完整版请务必购买正版资源,群:722026824
if t==1
C=[C;SOC(t)==SOC0+E_ch(t)*eta-E_dis(t)/eta];
else
C=[C;SOC(t)==SOC(t-1)+E_ch(t)*eta-E_dis(t)/eta];
end
end
ops = sdpsettings('solver', 'gurobi', 'verbose', 2, 'debug', 1);
F = (50*800+100*1800)/3650+sum(P_PV*C_PV+C_buy*P_buy);
result = optimize(C,F,ops);
if result.problem == 0 % problem =0 代表求解成功
disp(value(F));
else
disp('求解出错');
end
% 定义要删除的文件名
filename = 'A_1_2_A.xlsx';
% 使用delete函数删除文件
if exist(filename, 'file')
delete(filename);
disp(['已成功删除文件:' filename]);
else
disp(['文件 ' filename ' 不存在。']);
end
data = table({'购电量/kWh', '弃风弃光电量/kWh', '总供电成本/¥', '单位电量平均供电成本/(¥/kWh)'}', ...
[sum(value(P_buy)), sum(value(P_waste)),value(F),value(F)/sum(P_load)]', 'VariableNames', {'经济参数', 'A_1_2_A'});
writetable(data, 'A_1_2_A.xlsx');
figure('Position', [880, 460, 800, 500]); % [左下角 x 坐标, 左下角 y 坐标, 宽度, 高度]
b=bar([value(P_buy);value(P_PV);-value(P_waste);value(E_ch);value(E_dis)]','stacked');hold on;
b(1).FaceColor = [156/255 168/255 184/255];
b(2).FaceColor = [122/255 103/255 71/255];
b(3).FaceColor = [201/255 156/255 78/255];
b(4).FaceColor = [75/255 92/255 156/255];
b(5).FaceColor = [238/255 234/255 193/255];
plot(P_load,'k','LineWidth',2);hold on;
plot(value(SOC),'r','LineWidth',2);
legend('购电','光伏','弃电','充电','放电','电负荷','SOC','Orientation', 'horizontal')%横着放图例
legend('Location', 'NorthWest'); % 根据需要选择位置
title('A\_1\_2\_A电平衡'); %此文档为DS数模团队原创代码,如需完整版请务必购买正版资源,群:722026824
saveas(gcf, 'A_1_2_A电平衡.jpg');
%A_2_1
% 清除工作区
clear;clc;close all;warning off;
%读取参数
%正常读取
P_LOAD=xlsread('附件1:各园区典型日负荷数据.xlsx');
P_PVWT=xlsread('附件2:各园区典型日风光发电数据.xlsx');
P_load=P_LOAD(:,2)'+P_LOAD(:,3)'+P_LOAD(:,4)';
P_PV=750*P_PVWT(:,2)'+600*P_PVWT(:,4)';
P_WT=500*P_PVWT(:,5)'+1000*P_PVWT(:,3)';
%若无法读取直接使用该数据
% P_load=[818 820 913 918 871 815 883 957 931 879 1047 1100 1253 1278 1248 1328 963 915 1084 814 844 954 864 890];%电负荷/kW
% P_PV=[0 0 0 0 0 0 0 10.6500000000000 423.750000000000 830.340000000000 1054.48500000000 1177.12500000000 1179.76500000000 1081.41000000000 882.795000000000 574.650000000000 59.3850000000000 0 0 0 0 0 0 0];%光伏输出/kW
% P_WT=[303.300000000000 491.550000000000 494.750000000000 535.950000000000 738.700000000000 671.650000000000 387.500000000000 108 166.300000000000 257.950000000000 61.6000000000000 278.100000000000 521.350000000000 352.050000000000 172 300.250000000000 510.150000000000 512.500000000000 659.950000000000 629.550000000000 304.850000000000 261.050000000000 248.350000000000 116.150000000000];%风电输出/kW
%常数
N_T=24;%24h
C_buy=1;%购电价格:元/kWh
C_PV=.5;%风电价格:元/kWh
C_WT=.4;%价格:元/kWh
% 决策变量
P_buy = sdpvar(1,N_T);%购电功率
P_waste = sdpvar(1,N_T);%弃电功率
% 设置约束条件
C=[
P_PV+P_WT+P_buy==P_load+P_waste %电平衡
P_buy >= 0 % 购电功率非负
P_waste >= 0 % 弃电功率非负
];
ops = sdpsettings('solver', 'gurobi', 'verbose', 2, 'debug', 1);
F = sum(P_PV*C_PV+P_WT*C_WT+C_buy*P_buy);
result = optimize(C,F,ops);
if result.problem == 0 % problem =0 代表求解成功
disp(value(F));
else
disp('求解出错');
end
% 定义要删除的文件名
filename = 'A_2_1.xlsx';
filename_b='各时段A_2_1.xlsx';
% 使用delete函数删除文件
if exist(filename, 'file')
delete(filename);
disp(['已成功删除文件:' filename]);
else
disp(['文件 ' filename ' 不存在。']);
end
if exist(filename_b, 'file')
delete(filename_b);
disp(['已成功删除文件:' filename_b]);
else
disp(['文件 ' filename_b ' 不存在。']);
end
% 创建数据表
tdata = table((0:23)', value(P_buy)', value(P_waste)', ...
'VariableNames', {'时间段', '购电量/kWh', '弃风弃光电量/kWh'});
data = table({'购电量/kWh', '弃风弃光电量/kWh', '总供电成本/¥', '单位电量平均供电成本/(¥/kWh)'}', ...
[sum(value(P_buy)), sum(value(P_waste)),value(F),value(F)/sum(P_load)]', 'VariableNames', {'经济参数', 'A_2_1'});
% 将表格写入Excel文件
writetable(tdata, '各时段A_2_1.xlsx');
writetable(data, 'A_2_1.xlsx');
figure('Position', [880, 60, 800, 500]); % [左下角 x 坐标, 左下角 y 坐标, 宽度, 高度]
b=bar([value(P_buy);value(P_WT);value(P_PV);-value(P_waste)]','stacked');hold on;
b(1).FaceColor = [156/255 168/255 184/255];
b(2).FaceColor = [123/255, 139/255, 111/255];
b(3).FaceColor = [122/255 103/255 71/255];
b(4).FaceColor = [201/255 156/255 78/255];
plot(P_load,'k','LineWidth',2);hold on;
legend('购电','风电','光伏','弃电','电负荷','Orientation', 'horizontal')%横着放图例
legend('Location', 'NorthWest'); % 根据需要选择位置
title('A\_2\_1电平衡');
ylabel('功率/kW')
xlabel('时间/h')
saveas(gcf, 'A_2_1电平衡.jpg');
以上仅为小部分第一问、第二问代码,其中更详细的思路、各题目思路、代码、讲解视频、成品论文及其他相关内容,可以看文末名片获取哦!