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

news2024/11/27 14:31:34

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 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代码、数据、文章讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目录显示变应用程序需要权限的解决方法

在平日使用电脑的过程中,好多人通常会一些状况,其中最常见的就是目录变应用程序了,许多用户都不确定电脑目录变应用程序打不开怎么办,这种状况不要焦急,下面小编就来给大伙讲一讲电脑目录骤然目录的方法,一…

Windows上配置访问共享

Windows上配置访问共享 方法一:FTP共享方法二:文件共享 方法一:FTP共享 参考该链接:https://blog.csdn.net/qq_41101213/article/details/94214121 方法二:文件共享 本案例是在windows防火墙开启的状态下配置的 给本…

Redis主从

搭建主从架构 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 5之前叫slave,之后叫replica好像 共包含三个节点,一个主节点,两个从节点。 这里我们会…

chatgpt赋能Python-pandas归一化

深入了解Pandas归一化:什么是归一化,为什么需要归一化? Pandas是Python中最常用的数据分析库之一。Pandas提供了许多功能,使数据分析变得更加轻松。其中,归一化是数据分析中一个重要的概念,它将数据缩放到…

chatgpt赋能Python-pycharm如何横向输出

PyCharm如何横向输出 如果你是Python开发者,那么你一定会使用到PyCharm这个IDE,而且PyCharm的强大也是得到大家的一致认可的。但是,有没有遇到过需要横向输出的情况呢?比如输出一个很长的字符串,但是你希望它能够在你…

【利用AI刷面试题】AI:十道不常见的TypeScript面试题

文章目录 前言😏以下是关于 TypeScript 的一些偏僻的面试题😝1. 泛型约束中的 "extends" 关键字有哪些用法和含义?2. 什么是交叉类型(Intersection Types)?如何在 TypeScript 中定义和使用它们&a…

chatgpt赋能Python-pycharm如何加库

Pycharm如何加库:A Complete Guide Pycharm是一款强大的Python集成开发环境(IDE),它提供了许多有用的工具和功能来简化Python开发过程。尽管Pycharm已经内置了许多功能和工具,但我们在开发过程中仍然需要使用第三方库来提高效率。在本文中&a…

MySQL 常用/见函数

目录 日期函数 字符串函数 数学函数 其它函数 日期函数 获得时分秒: select current_time(); ---------------- | current_time() | ---------------- | 13 :51:21 | ---------------- 日期就是date 获得时间戳: select current_timestamp()…

chatgpt赋能Python-pycharm中添加库

PyCharm中添加库:让你的Python开发更加高效 Python是一种高级编程语言,因其易学易用的特性被广泛应用于Web开发、数据分析、人工智能等领域。PyCharm是Python开发的一种强大的IDE(集成开发环境),它提供了各种有用的功…

【P24】JMeter 正则表达式用户参数(RegEx User Parameters)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜: http://111.231.103.117/#/login 进入网页后,登录,页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12,打开调试工具,点击搜索 二、测试计划设…

Hantek 5000系列示波器原理图研究

Hantek 5000系列是Hantek(汉泰)2010年左右推出的入门型号示波器,最高采样率1GSa/s,带宽200M。2010年的时候,EEVblog论坛的大佬tinhead给出了该系列示波器的详细原理图(下载),图的可读…

RapidVideOCR(视频硬字幕提取工具)新增exe版

引言 考虑到提取视频字幕的小伙伴大多不是程序员行当,为了降低使用门槛,特此推出界面版的RapidVideOCR Desktop. RapidVideOCR Desktop需要搭配VideoSubFinder使用。它们两个关系如下图所示: #mermaid-svg-md1FaKkTWKdZahtd {font-family:&q…

Git常用命令rebase

Git常用命令rebase 1、git常用命令rebase rebase 会把你当前分支的 commit 放到公共分支的最后面,所以叫变基,就好像你从公共分支又重新拉出来这个 分支一样。 例如如果你从 master 拉了个 feature 分支出来,然后你提交了几个 commit&…

VScode添加右键运行、并设置每次运行前都清屏即去除之前的输出

一、添加右键运行 下载安装运行插件即可 二、运行前清屏 在运行插件中设置 找到Code-runner: Clear Previous Output,把√打上即可

同样都是PoE交换机,标准PoE交换机、非标准PoE交换机和非PoE交换机三者到底有啥区别?

网络交换机是企业和组织中构建局域网、企业网络和数据中心网络的重要组成部分。其中最常见的类型之一是PoE交换机。PoE交换机是一种允许通过网络线路提供电源和数据传输的交换机,这种技术可以为设备提供电力,避免了需要附加电源的麻烦。 本文将介绍PoE交…

从零制作操作系统——环境搭建以及HelloWorld

从零制作操作系统——环境搭建以及HelloWorld 起因 最近在学习操作系统,尝试自己照着书搓一个出来。 环境搭建 基础环境 我们的操作系统在x86平台的Linux下进行编写和运行。编辑器用的VIM。 我的系统是Fedora 36,当然你也可以使用Ubuntu或者其他Li…

码云(Gitee)与Git配置

前提 本文配置的前提是已经申请好了码云(gitee)的账号和电脑上已经安装好了git 1.配置gitee的ssh公钥 在gitee的个人设置里面配置ssh公钥 就是将公钥复制到右侧的框中, 并点击确定即可。 1.1生成ssh公钥 右键鼠标打开git bash here 输入如下命令,邮箱就填自己…

栈与队列的对决:如何用栈实现队列?

本篇博客会讲解力扣“232. 用栈实现队列”的解题思路,这是题目链接。 先来审题: 以下是输出示例: 以下是提示和进阶: 栈是一种后进先出的数据结构,而队列是一种先进先出的数据结构,如何用栈实现队列呢&…

chatgpt赋能Python-pingouin_python

了解Pingouin Python对数据分析和统计学的优势 介绍Pingouin Python Pingouin Python是一个强大的Python包,它提供了在数据分析和统计学中所需的一些主要函数。使用Pingouin Python可以方便地进行t-检验、方差分析、相关性等常用的数据分析和统计学任务。 此外&a…

Vue组件复杂表格高级编辑功能

Vue 组件复杂表格高级编辑功能 文章目录 Vue 组件复杂表格高级编辑功能1. sync 父子组件数据同步更新2. 在 el-table 中开发高级编辑表格功能3. 参考文献 在vue中组件的定义是希望组件可以做单一的功能,做到高复用,低耦合,所以父子组件之间的…