✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
🔥 内容介绍
电动汽车(Electric Vehicle, EV)作为一种环保、高效的交通工具,受到越来越多人的青睐。然而,随着电动汽车数量的增加,对电力系统的冲击也越来越大。为了满足不同充电需求的电动汽车有序充电调度,需要一种高效的算法步骤。
电动汽车有序充电调度是指根据电动汽车的充电需求和电力系统的供电能力,合理安排电动汽车的充电顺序和充电时间。这样可以最大程度地利用电力系统的资源,保证电动汽车的充电需求得到满足,同时减少对电力系统的冲击。
下面将介绍一种电动汽车有序充电调度方法的算法步骤。
第一步是确定电动汽车的充电需求。通过与电动汽车车主进行沟通,了解每辆电动汽车的充电需求,包括充电时间、充电电量等。同时,根据电动汽车的剩余电量和行驶里程,确定其充电的紧急程度。这些信息将作为算法的输入。
第二步是获取电力系统的供电能力。通过监测电力系统的供电情况,包括发电能力、输电能力和配电能力,确定电力系统的供电能力。这些信息将作为算法的输入。
第三步是建立数学模型。根据电动汽车的充电需求和电力系统的供电能力,建立数学模型。这个模型可以是一个优化问题,目标是最小化电力系统的负荷峰值或最大化电动汽车的充电效率。通过数学模型,可以将电动汽车的充电调度转化为一个优化问题,从而可以通过算法求解。
第四步是选择合适的算法。根据建立的数学模型,选择合适的算法进行求解。常用的算法包括贪心算法、遗传算法、模拟退火算法等。选择合适的算法可以提高算法的效率和准确性。
第五步是实施算法。将选择的算法应用到实际情况中,根据电动汽车的充电需求和电力系统的供电能力,进行电动汽车的有序充电调度。这个过程需要考虑实际情况中的各种约束条件,包括电力系统的安全性、电动汽车的充电效率等。
第六步是评估算法的效果。根据实际情况中的数据,评估算法的效果。可以通过比较电力系统的负荷峰值、电动汽车的充电效率等指标,来评估算法的效果。如果效果不理想,可以对算法进行调整和改进。
综上所述,电动汽车有序充电调度方法的算法步骤包括确定电动汽车的充电需求、获取电力系统的供电能力、建立数学模型、选择合适的算法、实施算法和评估算法的效果。通过这些步骤,可以有效地满足不同充电需求的电动汽车的充电调度,减少对电力系统的冲击,提高电动汽车的充电效率。这对于推动电动汽车的发展和电力系统的可持续发展具有重要意义。
📣 部分代码
%以矩阵运算为主,进行求解,接受外部EV数据进行求解
function [] = homeChargingPattern3(EV)
init;%获取所有参数
P_basic_home = [P_basic(49:96,1);P_basic(1:48,1)];%家庭模式下以12点作为调度起点,36点作为调度终点
EV.J_dis=EV.J_c + mod(EV.J_dis-EV.J_c+96,96);%到达时间早于出发时间,视作第二天到达
EV([EV.J_dis< 48+1 EV.J_c> 48+96],:)=[];
EV.J_dis(EV.J_dis>48+96 & EV.J_c<=48+96)=48+96;
EV.J_c(EV.J_dis>=48+1 & EV.J_c<48+1)=48+1;
[n,~]=size(EV);
%计算非协调调度下微电网在一天96个时隙下的负载
x_min = false(n,96);%保存调度结果
x_max = false(n,96);
%计算每个EV满足SOC_max电量和SOC_min电量的结束充电时刻
J_min_end = min(EV.J_dis,EV.J_c+floor(((EV.SOC_min-EV.SOC_con)*Cap_bat_EV)/(P_mid_EV*eta_EV*Delta_T)));
J_max_end = min(EV.J_dis,EV.J_c+floor(((EV.SOC_max-EV.SOC_con)*Cap_bat_EV)/(P_mid_EV*eta_EV*Delta_T)));
for i=1:n
x_min(i,(EV.J_c(i)-48):(J_min_end(i)-48))=1;
x_max(i,(EV.J_c(i)-48):(J_max_end(i)-48))=1;
end
P_SOC_min = P_basic_home + P_mid_EV*sum(x_min,1)';
P_SOC_max = P_basic_home + P_mid_EV*sum(x_max,1)';
%计算协调调度下微电网在一天96个时隙下的负载
%YALMIP建模
%定义待调度变量
x = binvar(n,96);
%计算EV的充电需求
EV.CUI = (EV.J_dis-EV.J_c)*Delta_T*P_slow_EV*eta_EV-...
(EV.SOC_min-EV.SOC_con)*Cap_bat_EV;
P_SOC_crd = P_basic_home;%调度总负载
%表示ev的最终充电量
SOC_dis = EV.SOC_con + (Delta_T*P_slow_EV*eta_EV/Cap_bat_EV)*sum(x,2);
%定义约束条件
c1 = false(n,96);%约束比较矩阵c1,记录x中为定值的点的值为c1中的值
c2 = false(n,96);%约束矩阵c2,x中为定值的点在c2中为1
for i = 1:n
ev = EV(i,:);%取出EV(i)的信息
if ev.CUI<0%如果ev为紧急充电需求(第i行为定值,)
%计算紧急充电需求的充电结束时刻,J_end
J_end = min(ev.J_dis,ev.J_c+floor(((ev.SOC_max-ev.SOC_con)*Cap_bat_EV)/(P_fast_EV*eta_EV*Delta_T)));
c1(i,ev.J_c-48:J_end-48)=1;
c2(i,:)=1;
%将其加入总负载
P_SOC_crd = P_SOC_crd + P_fast_EV * x(i,:)';
else%如果ev为非紧急充电需求
c2(i,[1:ev.J_c-48-1 ev.J_dis-48+1:96])=1;
%将其加入总负载
P_SOC_crd = P_SOC_crd + P_slow_EV * x(i,:)';
end
end
%添加此约束确保c2矩阵中为1的点的值为c1
constraint1 = c2.*x==c1;
%添加此约束确保非紧急充电需求下SOC_dis在SOC_min和SOC_max之间
constraint2 = EV.SOC_min(EV.CUI>=0)<=SOC_dis(EV.CUI>=0)<=EV.SOC_max(EV.CUI>=0);
%定义目标函数使得负载高峰max(P_SOC_crd)与负载低谷min(P_SOC_crd)之间插值最小
objective = max(P_SOC_crd)-min(P_SOC_crd);
%定义求解器为cplex
options = sdpsettings('solver','cplex');
%求解
result = solvesdp([constraint1 constraint2],objective,options);
result.info
yalmiperror(result.problem)
x = double(x);
P_SOC_crd = double(P_SOC_crd);
%显示
f=figure;
bar(12+0.125:0.25:36-0.125,P_basic_home,1);
hold on;
stairs(12+0.125:0.25:36-0.125,P_SOC_min,"LineWidth",1);
hold on;
stairs(12+0.125:0.25:36-0.125,P_SOC_max,"LineWidth",1);
hold on;
stairs(12+0.125:0.25:36-0.125,P_SOC_crd,"LineWidth",1);
legend('basic load','minSOC','maxSOC','crdSOC');%增加图例
legend('Location','northeast');%图例放在左上角
set(gca,'xtick',12:2:36); %x轴刻度
%
end