【V2G】电动汽车接入电网优化调度研究(Matlab代码实现)

简介: 【V2G】电动汽车接入电网优化调度研究(Matlab代码实现)

💥1 概述

V2G优化调度:


设计了一种算法,以充电成本最小的方式安排500辆电动汽车使用一个充电站,同时随机安排任意少数电动汽车前往指定的房屋负载,在那里放电并返回充电站。模拟测试了三种不同的场景,第一,客户满意度(即电动汽车车主满意度)被认为是放电所赚的钱与充电所花的钱之间的总差额,第二,客户满意度与第一种场景相同,但在模拟结束时减去未完成的费用的总成本,第三,客户满意度考虑了放电的利润,充电的成本,在整个模拟过程中,未完成充电的总成本和从每辆电动汽车切换的成本。


为了模拟电动汽车的行为,使用了许多不同的基于时间的变量。以下是最关键的变量,是决定客户满意度的主要因素:a) X -充电状态(1或0)b) Y -放电状态(1或0)c) SOC -充电状态(以最大电池容量的百分比测量)与变量一起,电动汽车初始化的值包括最大电池容量,第三种情况的最大开关数量等。在整个仿真过程中的每个时间单位,对x和y变量以及能量约束实施各种系统约束,以确保稳定性和车辆到电网系统的工作。例如,单个EV在单个单位时间内只能在不行驶时处于充电或放电状态,而不能同时处于充电或放电状态(即x = 1或y = 1,不能同时处于充电或放电状态)。


另一个关键的系统要求是充电站有足够的能量来继续为正在充电的车辆充电。在第三种情况中引入了一个额外的约束,其中每辆电动汽车必须保持在从充电到放电、从充电到空闲等状态允许的最大开关数量限制内。初始化值、EV变量和各种约束方程的基础是Shima Hosseinpour和Ona Egbue的研究论文——优化电动汽车充放电的动态调度。


一旦模拟完成,将进行中期模拟行程的车辆的最终充电状态与到达房屋负载时和在房屋负载完成放电后的充电状态进行比较。还制作了各种图形和条形图-每辆电动汽车的开关数量,随机电动汽车的充电状态与时间,在指定房屋进行模拟中期放电行程的电动汽车的充电状态与距离等。


在离线和在线充放电调度模型中,分别开发了三种不同的场景。在第一种场景中,目标函数只考虑电动汽车车主的放电收益和充电成本。因此,该模型预计会对电动汽车进行调度,使它们放电的次数多于充电的次数。在第二个场景中,考虑未完成的充电请求以及放电的利润。因此,未充电电力的惩罚成本被添加到第二种情况的目标函数中。在第三种情况下,根据电池寿命,考虑到电动汽车电池可以拥有的最大开关数量的限制。这个限制包含在模型的约束中。所以,第三种情况的目标函数和第二种情况是一样的。

详细文章讲解及数学模型讲解见第4部分

📚2 运行结果


部分代码:

%% Figure 16/22
figure(2)
plot(planning_periods, total_x_1st, planning_periods, total_x_2nd, 'r', planning_periods, total_x_3rd, 'g')
title('Figure 16/22')
xlabel('Time')
ylabel('Electricty Units')
legend('Scenario 1','Scenario 2', 'Scenario 3')
%% Figure 17/23
figure(3)
plot(planning_periods, total_y_1st, planning_periods, total_y_2nd, 'r', planning_periods, total_y_3rd, 'g')
title('Figure 17/23')
xlabel('Time')
ylabel('Electricty Units')
legend('Scenario 1','Scenario 2', 'Scenario 3')
%% Figure 18/27
figure(4)
yyaxis left
plot(planning_periods, total_x_3rd, planning_periods, total_y_3rd)
title('Figure 18/27')
xlabel('Time')
ylabel('Electricity Units')
yyaxis right
plot(planning_periods, Ct_available_EU)
ylabel('Price (cents)')
legend('Charging','Discharging','Price')
%% Figure 19/24
[list_of_total_z_1st, z_index_1st] = sort(list_of_total_z_1st);
z_freq_temp_1st = frequency_of_z_1st;
for i = 1:length(z_freq_temp_1st)
    frequency_of_z_1st(i) = z_freq_temp_1st(z_index_1st(i));
    if ~ismember(list_of_total_z_1st(i),list_of_total_z_2nd)
        list_of_total_z_2nd = [list_of_total_z_2nd list_of_total_z_1st(i)];
        frequency_of_z_2nd = [frequency_of_z_2nd 0];
    end
    if ~ismember(list_of_total_z_1st(i),list_of_total_z_3rd)
        list_of_total_z_3rd = [list_of_total_z_3rd list_of_total_z_1st(i)];
        frequency_of_z_3rd = [frequency_of_z_3rd 0];
    end
end
[list_of_total_z_2nd, z_index_2nd] = sort(list_of_total_z_2nd);
z_freq_temp_2nd = frequency_of_z_2nd;
for i = 1:length(z_freq_temp_2nd)
    frequency_of_z_2nd(i) = z_freq_temp_2nd(z_index_2nd(i));
end
[list_of_total_z_3rd, z_index_3rd] = sort(list_of_total_z_3rd);
z_freq_temp_3rd = frequency_of_z_3rd;
for i = 1:length(z_freq_temp_3rd)
    frequency_of_z_3rd(i) = z_freq_temp_3rd(z_index_3rd(i));
end
plot_param = zeros(length(frequency_of_z_1st),3);
for i = 1:length(frequency_of_z_1st)
    for j = 1:3
        if j == 1
            plot_param(i,j) = frequency_of_z_1st(i);
        elseif j == 2
            plot_param(i,j) = frequency_of_z_2nd(i);
        else
            plot_param(i,j) = frequency_of_z_3rd(i);
        end
    end
end
figure(5)
bar(list_of_total_z_1st, plot_param)
title('Figure 19/24')
xlabel('Z')
ylabel('Frequency')
legend('Scenario 1','Scenario 2', 'Scenario 3')
%% Figure 20/25
z_values_1st = [];
z_values_2nd = [];
z_values_3rd = [];
EVs = [];
for i = 1:N
    z_values_1st = [z_values_1st EV_1st(i).z];
    z_values_2nd = [z_values_2nd EV_2nd(i).z(periods)];
    z_values_3rd = [z_values_3rd EV_3rd(i).z(periods)];
    EVs = [EVs i];
end
figure(6)
plot(EVs, z_values_1st, EVs, z_values_2nd, 'r', EVs, z_values_3rd, 'g')
xlabel('EV Number')
ylabel('Electricity Units')
title('Figure 20/25')
legend('Z1','Z2','Z3')
%% Figure 21/28
figure(7)
plot(planning_periods, total_x_3rd, planning_periods, cpt_available_EU)
title('Figure 18/27')
xlabel('Time')
ylabel('Electricity Units')
legend('Charging','Capacity')
%% SOC vs distance plot of test EV taking home trip
%Assuming an initial SOC of 100% (i.e., of either 10 EU or 15 EU) can cover
%400 miles at full charge. First determine whether the test EV is PHEV or
%BEV
distance_per_EU = [];
distance_per_period = [];
total_periods = [];
home_vehicle_IDs = [];
for i = 1:N
    if ismember(i,home_vehicles)
        distance_per_EU = [distance_per_EU 400/EV(i).mc]; %Distance covered per EU depending on the type
        distance_per_period = distance_per_EU; %Assume 1 EU is spent in one period of travelling
        total_periods = [total_periods EV(i).travel_time];
        home_vehicle_IDs = [home_vehicle_IDs i];
    end
end
%EV energy vs distance plot 
random_num = randi(length(total_periods));
total_periods_vector = zeros(1,total_periods(random_num));
count = 0;
for i = 1:total_periods(random_num)
    count = count + 1;
    total_periods_vector(i) = count*distance_per_period(random_num);
end
%Create a uniformly distributed distance vector
total_periods_vector = linspace(total_periods_vector(1),total_periods_vector(length(total_periods_vector)),total_periods(random_num)+1);
start_time = EV_1st(home_vehicle_IDs(random_num)).schedule(2);
end_time = EV_1st(home_vehicle_IDs(random_num)).schedule(3);
figure(8)
plot(total_periods_vector, EV_1st(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_1st(home_vehicle_IDs(random_num)).mc).^(-1)),total_periods_vector, EV_2nd(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_2nd(home_vehicle_IDs(random_num)).mc).^(-1)),total_periods_vector, EV_3rd(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_3rd(home_vehicle_IDs(random_num)).mc).^(-1)))
title('Energy vs. Distance plot for randomly chosen vehicle to recharge home')
xlabel('Distance in miles')
ylabel('State of Charge of EV in Percentage of Max Capacity')
legend('1st Scenario','2nd Scenario', '3rd Scenario')
figure(9)
plot(total_periods_vector, EV_1st(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_1st(home_vehicle_IDs(random_num)).mc).^(-1)),total_periods_vector, EV_2nd(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_2nd(home_vehicle_IDs(random_num)).mc).^(-1)))
title('Energy vs. Distance plot for randomly chosen vehicle to recharge home')
xlabel('Distance in miles')
ylabel('State of Charge of EV in Percentage of Max Capacity')
legend('1st Scenario','2nd Scenario')
figure(10)
plot(total_periods_vector, EV_2nd(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_2nd(home_vehicle_IDs(random_num)).mc).^(-1)),total_periods_vector, EV_3rd(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_3rd(home_vehicle_IDs(random_num)).mc).^(-1)))
title('Energy vs. Distance plot for randomly chosen vehicle to recharge home')
xlabel('Distance in miles')
ylabel('State of Charge of EV in Percentage of Max Capacity')
legend('2nd Scenario', '3rd Scenario')
figure(11)
plot(total_periods_vector, EV_1st(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_1st(home_vehicle_IDs(random_num)).mc).^(-1)),total_periods_vector, EV_3rd(home_vehicle_IDs(random_num)).soc(start_time:end_time).*(100.*(EV_3rd(home_vehicle_IDs(random_num)).mc).^(-1)))
title('Energy vs. Distance Plot for Randomly Chosen Vehicle to Recharge Home')
xlabel('Distance in miles')
ylabel('State of Charge of EV in Percentage of Max Capacity')
legend('1st Scenario', '3rd Scenario')
%% SOC vs time plot of test EV taking home trip
figure(12)
plot(planning_periods, EV_1st(home_vehicle_IDs(random_num)).soc.*(100.*(EV_1st(home_vehicle_IDs(random_num)).mc).^(-1)), planning_periods, EV_2nd(home_vehicle_IDs(random_num)).soc.*(100.*(EV_2nd(home_vehicle_IDs(random_num)).mc).^(-1)), planning_periods, EV_3rd(home_vehicle_IDs(random_num)).soc.*(100.*(EV_3rd(home_vehicle_IDs(random_num)).mc).^(-1)))
title('Energy vs Time Plot for Randomly Chosen Vehicle to Recharge Home')
xlabel('Time in periods')
ylabel('State of Charge of EV in Percentage of Max Capacity')
legend('1st Scenario', '2nd Scenario', '3rd Scenario')

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。


[1]汪思奇.考虑V2G的区域综合能源系统运行调度优化[J].科学技术创新,2022(34):30-34.


[2]郑鑫,邱泽晶,郭松,廖晖,黄玉萍,雷霆.电动汽车V2G调度优化策略的多指标评估方法[J].新能源进展,2022,10(05):485-494.


[3]肖丽,谢尧平,胡华锋,罗维,朱小虎,刘晓波,宋天斌,李敏.基于V2G的电动汽车充放电双层优化调度策略[J].高压电器,2022,58(05):164-171.DOI:10.13296/j.1001-1609.hva.2022.05.022.


🌈4 Matlab代码、数据、文章讲解

相关文章
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
211 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
95 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
135 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
7月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
7月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
7月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)
|
7月前
|
供应链 算法
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
|
7月前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
|
7月前
|
算法 调度 SoC
电动汽车充放电V2G模型(Matlab代码)
电动汽车充放电V2G模型(Matlab代码)