(文章复现)低温环境下考虑电池寿命的微电网优化调度

news2024/11/24 0:37:27

参考文献:

[1]丁佳昀,胡秦然,吴在军,等.低温环境下考虑电池寿命的微电网优化调度[J].中国电机工程学报,2024,44(10):3815-3824.

1.摘要

        储能系统作为微电网重要组成部分,为微电网协调能量供需提供了解决方案。然而,在低温环境下,储能系统中电池寿命的快速衰减严重影响了系统的经济性和安全性。因此,该文提出一种低温环境下考虑电池寿命的微电网优化调度混合整数模型,来仿真微电网优化调度过程和高效计算储能充放电计划。首先,基于阿伦尼乌斯方程,分析低温环境中电池寿命的受影响机理;接着,采用考虑充放电次数和放电深度的电池寿命方程,构建电池全温度范围的老化模型;最后,构建考虑电池自发热和全温度范围的寿命衰减模型,并通过可行域凸极点组合方法对模型进行转化和简化,来避免模型中非线性项目导致无法获得全局最优解的困境。算例验证和对比分析表明,该文提出的模型能在低温环境中降低系统运行成本,减缓电池衰减速率,延长近一倍的电池寿命。

2.原理介绍

2.1低温下考虑电池寿命的电池成本模型

        在低温环境中,一方面电池的充电效率较低,大量电能消耗于电池的副反应中;另一方面电池寿命损耗较大,加速了电池的更换周期。类似于发电单元,可以将电池的运行成本分为日燃料成本和日运维成本:

        电池的日燃料成本与电池的充电效率和实时电价有关,可考虑为电池充电时损耗的电能成本,即:

        电池的日运维成本主要由电池的损耗引起,与电池的寿命有直接关联,可通过贴现率实现二者的转化:

        由于在放电深度和温度一定时,运维成本和循环次数近似呈线性关系,因此对运维成本作如下分段线性化处理:

2.2目标函数

        通常微电网调度以系统总日运行成本最低作为优化目标,即:

2.3 约束条件

2.4 线性化处理

        由于考虑到电池自热的影响,电池表面温度实则为与 Pbat 相关的函数,式(24)为非线性约束,为提高求解效率和准确性,可利用可行域凸极点线性组合的方法将非凸问题近似转换为凸问题,以便获得全局最优解。

        电池充电和放电时的可行区域均可用一个凸区域表示,分别如图 3、4 所示。

        可行区域的形状和大小由每时刻电网侧的输入输出功率与电池侧的充放电功率及电池充放电效率的函数投影决定,可行域内每个运行点对应的电网侧输入输出功率均可表示为该点电池侧的充放电功率和充放电效率的函数。由于凸可行域内任一点的横纵坐标都可由该区域凸极点的横纵坐标线性组合表示,且线性系数和为 1,可近似将可行域内任一点的 Pin或 Pout也用凸极点的 Pin或 Pout线性组合表示。

优化目标:

        式(6)、(7)、(9)、(10)、(14)

约束条件:

        式(11)—(13)、(15)—(23) 式(25)—(27)、(30)—(39)

        使用MATLAB R2021b中的yalmip工具箱调用gurobi 9.1.2 求解器求解。

3.编程思路

3.1参数和变量定义

4.代码运行结果

5.matlab代码

%% 清除内存空间
clc
clear
close all
warning off

%% 系统参数
data = xlsread('data.xlsx');                % 相关数据
cbuy = data(:,2);                           % 购电电价
csell = data(:,3);                          % 售电电价
cwind = 0.52;                               % 风电运行成本
cpv = 0.72;                                 % 光伏运行成本
Ta = data(:,4:6);                           % 环境温度
Pwind = data(:,7:9);                        % 风电出力
Ppv = data(:,10:12);                        % 光伏出力
Pload = data(:,13:15);                      % 负荷需求
Pbat_max = 40;                              % 电池充放电功率上限
Smax = 300;                                 % 储能额定容量
SOC_min = 0.3;                              % 荷电状态下限
SOC_max = 0.95;                             % 荷电状态上限
SOC0 = 0.4;                                 % 初始荷电状态
[ncha,ndis] = cal_efficiency(Ta);           % 充放电效率
Pnet_max = 160;                             % 交互功率上限
r = 0.07;                                   % 贴现率
C1kwh = 0.02;                               % 电池的度电运维成本
NT = 24;                                    % 时段数
NS = 3;                                     % 典型场景数
D = 4;                                      % 分段数
dt = 1;                                     % 时段间隔
a_Ta = 0.05;                                % 自发热比例因子
Zth = 0.1;                                  % 电池热阻
dDOD1_min = [0.05,0.2,0.4,0.6];             % 第d段放电深度的下限
dDOD1_max = [0.2,0.4,0.6,0.7];              % 第d段放电深度的上限

%% 优化变量
gd = binvar(NT + 1,NS,D);                   % 0-1变量,放电深度处于第d分段时为1,否则为0
Pbat = sdpvar(NT,NS);                       % 储能输出功率
Pcha = sdpvar(NT,NS);                       % 储能充电功率
Pdis = sdpvar(NT,NS);                       % 储能放电功率
Qcha = binvar(NT,NS);                       % 储能充电状态变量
Qdis = binvar(NT,NS);                       % 储能放电状态变量
Qstadic = binvar(NT,NS);                    % 储能静置状态变量
Ssoc = sdpvar(NT + 1,NS);                   % 储能SOC
Sbat = binvar(NT,NS);                       % 储能荷电状态改变标志
Pbuy = sdpvar(NT,NS);                       % 微电网购电功率
Psell = sdpvar(NT,NS);                      % 微电网售电功率
Pnet = sdpvar(NT,NS);                       % 交互功率
Qnet = binvar(NT,NS);                       % 购售电状态变量
dDOD = sdpvar(NT + 1,NS);                   % 储能放电深度
dDOD1 = sdpvar(NT + 1,NS,D);                % 储能放电深度分段
Tb = sdpvar(NT,NS);                         % 电池温度
n_cycle = sdpvar(1,NS);                     % 充放电循环数
U_Sbat = binvar(NT,NS,5);

%% 约束条件
Constraints = [];



%% 目标函数
C_COE = cbuy'*((1./ncha - 1).*Pcha);
LT = -0.0623*mean(Tb) + 2.56;
ad = [0.01,0.115,0.23,0.45];
kd = [1.23,3.77,6.28,15.43];
C_OM = sdpvar(NT,NS);
Ugd = sdpvar(NT,NS,D);
for t = 1:NT
    for s = 1:NS
        C_OM(t,s) = 0;
        for d = 1:D
            Constraints = [Constraints, Ugd(t,s,d) >= 0 , Ugd(t,s,d) <= 10000*gd(t,s,d) , Ugd(t,s,d) <= n_cycle(s)*ad(d) + kd(d) , Ugd(t,s,d) >= n_cycle(s)*ad(d) + kd(d) - 10000*(1 - gd(t,s,d))];
            C_OM(t,s) = C_OM(t,s) + Ugd(t,s,d)*LT(s);
        end
    end
end

C_buy = cbuy'*Pbuy;
C_sell = csell'*Psell;
C_wind = cwind*sum(Pwind);
C_pv = cwind*sum(Ppv);
objective = C_COE + max(C_OM) + C_buy + C_sell + C_wind + C_pv;
Ps = [0.5;0.25;0.25];

%% 设求解器
% gurobi求解器
ops = sdpsettings('verbose', 3, 'solver', 'gurobi','showprogress',1);
ops.gurobi.TimeLimit = 600;                 % 运行时间限制为10min
ops.gurobi.MIPGap = 0.01;                   % 收敛精度限制为0.01

% cplex求解器
% ops = sdpsettings('verbose', 3, 'solver', 'cplex','showprogress',1,'debug',1);
% ops.cplex.timelimit = 600;                  % 运行时间限制为10min
% ops.cplex.mip.tolerances.mipgap = 0.01;     % 收敛精度限制为0.01



% mosek求解器
% ops=sdpsettings('verbose', 3, 'solver', 'MOSEK','cachesolvers',1);
% ops.mosek.MSK_DPAR_OPTIMIZER_MAX_TIME=600;% 运行时间限制为10min
% ops.mosek.MSK_DPAR_MIO_TOL_REL_GAP=0.01;  % 收敛精度限制为0.01
sol = optimize(Constraints, objective*Ps, ops);


%% 分析错误标志
if sol.problem == 0
    disp('求解成功');
else
    disp('运行出错');
    yalmiperror(sol.problem)
end

%% 运行结果
show_result;

        以上为部分代码,完整代码获取方式如下:

(文章复现)低温环境下考虑电池寿命的微电网优化调度matlab代码资源-CSDN文库

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

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

相关文章

抽象类接口(超详细)

抽象类&接口(超详细) 一:抽象类和抽象方法 封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为 如果老师的work是教书,学生的work是学习。以前我们是在父类里面写一个work随便写一个方法体,然后子类重写。但是有一个弊端,如果子类不是你写的,是别人写…

嵌入式仪器模块:波形发生器模块(嵌入式)

• 16 位分辨率 • 125 MHz 刷新率 • 支持生成 FSK/ASK 信号 应用场景 • 生成任意标准波形或用户自定义波形 • 在特殊协议通信中模拟某个波形 • 无线充电&#xff08;信号调制&#xff09; 道114输出阻抗Low-ZLow-ZLow-Z输出范围 5 V 5 V 6 V耦合DCDCDC带宽4 MHz10 M…

第一个SpringBoot项目

目录 &#x1f4ad;1、新建New Project IDEA2023版本创建Sping项目只能勾选17和21&#xff0c;却无法使用Java8&#xff1f;&#x1f31f; 2、下载JDK 17&#x1f31f; &#x1f4ad;2、项目创建成功界面 1、目录 &#x1f31f; 2、pom文件&#x1f31f; &#x1f4ad;3、…

C#操作MySQL从入门到精通(20)——更新数据

前言: 谈到数据库,大家最容易脱口而出的就是增删改查,本文所说的更新数据就是增删改查的改,改变数据的意思。 本文测试使用的数据库如下: 1、更新一列 所谓更新一列的意思就是只更改一列数据,并且通常要使用where条件,因为不加这个条件的话会导致将所有行的数据进行…

LeetCode:环形链表II

文章收录于LeetCode专栏 LeetCode地址 环形链表II 题目 给定一个链表&#xff0c;返回链表开始入环的第一个节点。如果链表无环&#xff0c;则返回null。   为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0开始&#…

vue3中进度条上加高亮圆点

实现效果 小圆点基于进度条定位&#xff08;left&#xff09;。 实现代码 <template><!-- 这块代码实现的功能&#xff1a;progressData遍历的年份进度数组&#xff0c;展示每年完成的进度--><ul><li v-for"(item, index) in progressData" :k…

LabVIEW 反向工程的实现与法律地位

什么是LabVIEW反向工程&#xff1f; 反向工程是指从现有的应用程序或软件中推导出其设计、架构、代码等信息的过程。对于LabVIEW而言&#xff0c;反向工程涉及从现有的VI&#xff08;虚拟仪器&#xff09;文件、项目或应用程序中提取出设计思路、功能模块、算法实现等。 LabV…

轻松上手MYSQL:SQL优化之Explain详解

​​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 文章目录 一、Explain1.1 explain作用1.2 explain列说明idselect_typetableparti…

Linux|如何安装 Java

引言 Java是最受欢迎的编程语言之一&#xff0c;JVM&#xff08;Java的虚拟机&#xff09;是运行Java应用程序的运行时环境。这两个平台是许多流行软件所需的&#xff0c;包括Tomcat&#xff0c;Jetty&#xff0c;Cassandra&#xff0c;Glassfish和Jenkins。 本教程[1]将指导您…

关闭Cloudflare Pages的访问策略

curl API 获取相应的 uid curl -X GET "https://api.cloudflare.com/client/v4/accounts/账户标识符/access/apps" \-H "X-Auth-Email: 邮箱" \-H "X-Auth-Key: Global API KEY" \-H "Content-Type: application/json"账户标识符是登…

C# WPF入门学习主线篇(十九)—— 布局管理实战『混合布局案例』

C# WPF入门学习主线篇&#xff08;十九&#xff09;—— 布局管理实战『混合布局案例』 欢迎来到C# WPF入门学习系列的第十九篇。在前几篇文章中&#xff0c;我们详细介绍了各个布局容器的基本概念和使用方法。本篇博客将通过一个综合的实战案例&#xff0c;展示如何在WPF中使用…

Python第二语言(五、Python文件相关操作)

目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件&#xff1a;write与flush 4. 文件的追加操作 5. 文件操作的综合案例&#xff08;文件备份操作&#x…

【SQLAlChemy】常见的数据类型有哪些,Column可选的参数有哪些呢?

常见数据类型与Column参数 常见类型 Integer&#xff1a;整数类型&#xff0c;对应数据库的 int 类型。Float&#xff1a;浮点数类型&#xff0c;对应数据库的 float 类型。它占用 32 位空间。Double&#xff1a;双精度浮点数类型&#xff0c;对应数据库的 double 类型&#…

AI演进之道:剖析大模型技术的四大核心架构

▼最近直播超级多&#xff0c;预约保你有收获 随着 AI 大模型技术的持续进步&#xff0c;大模型的技术框架经历了不断优化与革新。本文我们将细致解析四种关键的大模型技术结构&#xff1a;纯粹 Pompt 提示词法、Agent Function Calling 机制、RAG&#xff08;检索增强生成&am…

Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]

背景&#xff1a; 使用JavaSEJDBCMySQL技术实现一个物业管理系统&#xff0c;具体要求如下 物业管理系统需求&#xff1a; 需求分析 1.1用户需求分析 在进入系统之前&#xff0c;要进行身份确认&#xff0c;只有用户名和用户密码都相符的用户方可进入本系统&#xff0c;为…

基于Java的超市进销存管理系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; Java JSP Servlet JavaBean 工具&#xff1a; IDEA/Eclipse、…

TS 小技巧: 使用元组生成联合类型

前言 在我们使用 TypeScript 开发业务的时候&#xff0c;也许你会遇到一个这样的问题&#xff1a;我们如何根据一个数组的值得到一个联合类型&#xff1f; 这里向大家介绍一个开发小技巧&#xff1a;使用元组生成联合类型 开发场景 我们看下面一段 ts 代码&#xff1a; con…

Java Web学习笔记31——Maven介绍

Maven&#xff1a;Java项目的构建工具。 Maven&#xff1a; Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建Java项目的工具。 Apache软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&#xff0c;也是一个专…

【30天精通Prometheus:一站式监控实战指南】第18天:apache_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…