风力发电系统的随机调度研究(matlab代码实现)

news2024/12/24 8:11:46

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

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

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

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

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

文献来源:

时域调度模拟是预测风力发电系统运行成本最有效的工具,因为它可以表示限制热电厂、储能和需求侧措施平衡行动的跨时间约束。高风侵度要求及时调度决策能够反映风馈的不确定性,因此使用随机单元承诺(SUC)和滚动规划生成调度决策是可取的。然而,计算负担可能使这种方法在长时间的模拟中不切实际。我们提出了SUC问题的一个有效公式,设计用于单母线电力系统调度仿真。

与传统的SUC技术不同,该公式采用了基于分位数的情景树结构,避免了对外生运营储备的需求。在长达一年的大型系统模拟中,我们比较了各种树拓扑的性能。与固定分位数确定性方法相比,简单的基于分位数的树在统计上具有显著的成本改进,并且与基于蒙特卡罗生成场景的树相比更优。

任何国家的政府都致力于大幅降低其电力部门的碳强度。脱碳的电力系统可能具有以下特点:大的、相对不灵活的核基载;间歇性和部分不可预测的可再生能源的高渗透率,在许多国家将由风能主导;化石燃料车队的载客率比目前低得多。因此,大规模风力集成的一个核心挑战是利用灵活性降低的热机组吸收风力发电的能力。

衡量系统吸收风的能力的一个指标是风的不确定性成本,即由于短期风的不确定性而运行系统的额外成本。简单的统计分析无法告诉我们这一成本,因为平衡风力间歇性的可调度要素受制于限制其响应能力的跨时间约束。这些限制的例子是热发电机的启动时间,以及对可存储能量的限制。为了理解这些限制对系统吸收风的能力的影响,我们必须在时域内模拟整个系统的调度,在一定程度上考虑跨时间约束。如[1]所述,在许多研究中使用时域模拟来评估集成风的成本。

📚2 运行结果

 部分代码:

%%
clearvars
clc 

%% Inputs
load('Data\InputData.mat')
load('Data\SystemParameters.mat')
% The units are GW, k/GW and k to keep the range of variables closer

%% Define the optimisation model:
Load_balance = [];
Aux_constraints = [];
Constraints_Gen_limits = [];
Constraints_Ramp_limits = [];
Cost_node = [];

scenarios = size(Wind_scenarios,1);

% Create some matrices of DVs:
Wind_curtailed = sdpvar(scenarios,time_steps);
Load_curtailed = sdpvar(scenarios,time_steps);

% And some matrices of constraints:
Aux_constraints = [Aux_constraints,...
                           0 <= Wind_curtailed <= Wind_scenarios,...
                           0 <= Load_curtailed <= ones(scenarios,1)*Demand];

tic % Start time counter

for k=1:time_steps

    %% Define DVs

    x{k} = sdpvar(scenarios,num_Clusters); 
        % x{k} = [x1 x2 x3... (scenario 1)
        %         x1 x2 x3... (scenario 2)]; % Power generated by each Cluster in each scenario

    y{k} = intvar(scenarios,num_Clusters); 
    % y{k} = [y1 y2 y3... (scenario 1)
    %         y1 y2 y3... (scenario 2)]; % Commitment decision for each Cluster in each scenario

    % FORCE y{k} to be lower than number of CCGTs and number of OCGTs
    Aux_constraints = [Aux_constraints,...
        zeros(scenarios,1)*num_Gen <= y{k} <= ones(scenarios,1)*num_Gen];

% NO INITIAL COMMITMENT        
%         if k==1
%             Aux_constraints = [Aux_constraints,...
%                                y{n,k}==Initial_commitment];
%         end

    % Fix commitment decision of inflexible_gen to be same as in the first 
    % scenario in this time-step "k"
    Aux_constraints = [Aux_constraints,...
        (ones(scenarios,1)*inflexible).*y{k} == ones(scenarios,1)*(inflexible.*y{k}(1,:))];
        
    % Define DVs for generators started up
    startup_DV{k} = sdpvar(scenarios,num_Clusters);
    if k==1
        Aux_constraints = [Aux_constraints,...
                           startup_DV{k} == y{k}];
    else
        % These 2 constraints model the startup, it's easy to verify
        % that they indeed do:
        Aux_constraints = [Aux_constraints,...
                           startup_DV{k} >= y{k} - y{k-1},...
                           startup_DV{k} >= zeros(scenarios,num_Clusters)];
    end

    %% Constraints:
    Load_balance = [Load_balance,...
        sum(x{k},2)+Wind_scenarios(:,k)-Wind_curtailed(:,k) == ones(scenarios,1)*Demand(k)-Load_curtailed(:,k)];

   % Generation limits:
    for i=1:num_Clusters
        Constraints_Gen_limits = [Constraints_Gen_limits,...
                                  y{k}.*(ones(scenarios,1)*Gen_limits(:,1)') <= x{k} <= y{k}.*(ones(scenarios,1)*Gen_limits(:,2)')];
    end

%         % Ramp limits:
%         if k>1

%                 Constraints_Ramp_limits = [Constraints_Ramp_limits,...
%                                            -tau*(ones(scenarios,1)*Ramp_limits(:,1)') <= x{k}-x{k-1} <= tau*(ones(scenarios,1)*Ramp_limits(:,2)')];

%         end

    %% Finally, define the nodal costs:
    Cost_node = horzcat(Cost_node,...
        sum((ones(scenarios,1)*stc').*startup_DV{k},2)... % Startup costs
        + tau*(sum((ones(scenarios,1)*NLHR').*y{k},2)... % fixed generation costs
        + sum((ones(scenarios,1)*HRS').*x{k},2)... % variable generation costs
        + VOLL*Load_curtailed(:,k))); % load shed cost

end
 
time.BuildingModel = toc;
    
tic
    
Objective = sum(sum(prob_nodes.*Cost_node));

Constraints = [Aux_constraints,...
               Load_balance,...
               Constraints_Gen_limits
               Constraints_Ramp_limits];

options = sdpsettings('solver','gurobi','gurobi.MIPGap',0.1e-2);

solution = optimize(Constraints,Objective,options)

time.Optimisation = toc;

%% Analyse results

tic

sol.Wind_curtailed = value(Wind_curtailed);
sol.Load_curtailed = value(Load_curtailed);
sol.Cost = [];
sol.Cost_StartUp = [];
sol.Cost_NLHR = [];
sol.Cost_HRS = [];
sol.Cost_VOLL = [];
sol.Check_Load_balance(scenarios,time_steps) = 0;

for k=1:time_steps
    sol.x{k} = value(x{k});
    sol.y{k} = value(y{k});
    sol.startup_DV{k} = value(startup_DV{k});
    sol.Cost = horzcat(sol.Cost,...
        sum((ones(scenarios,1)*stc').*sol.startup_DV{k},2)... % Startup costs
        + tau*(sum((ones(scenarios,1)*NLHR').*sol.y{k},2)... % fixed generation costs
        + sum((ones(scenarios,1)*HRS').*sol.x{k},2)... % variable generation costs
        + VOLL*sol.Load_curtailed(:,k)));
    sol.Cost_StartUp = horzcat(sol.Cost_StartUp,...
        sum((ones(scenarios,1)*stc').*sol.startup_DV{k},2));
    sol.Cost_NLHR = horzcat(sol.Cost_NLHR,...
        tau*(sum((ones(scenarios,1)*NLHR').*sol.y{k},2)));
    sol.Cost_HRS = horzcat(sol.Cost_HRS,...
        tau*(sum((ones(scenarios,1)*HRS').*sol.x{k},2)));
    sol.Cost_VOLL = horzcat(sol.Cost_VOLL,...
        tau*(VOLL*sol.Load_curtailed(:,k)));

    sol.Check_Load_balance(:,k) = sum(sol.x{k},2)+Wind_scenarios(:,k)-sol.Wind_curtailed(:,k)-(ones(scenarios,1)*Demand(k)-sol.Load_curtailed(:,k));
end

time.GetSolution = toc;

clearvars -except Wind_scenarios Demand options sol solution time

save('Solution.mat')

🎉3 参考文献

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

🌈4 Matlab代码实现

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

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

相关文章

【神经网络】tensorflow实验8--梯度下降法

1. 实验目的 ①掌握TensorFlow的可训练变量和自动求导机制 ②能够使用TensorFlow实现梯度下降法&#xff0c;求解一元和多元线性回归问题 2. 实验内容 下载波士顿房价数据集&#xff0c;使用线性回归模型实现对波士顿房价的预测&#xff0c;并以可视化的形式输出模型训练的过…

【Git】—— 版本控制(忽略文件、查看修改内容,撤销未提交的修改、查看历史提交记录)

目录 一、准备工作 二、忽略文件 三、查看修改内容 四、撤销未提交的修改 五、查看提交记录 前面学习了Git最基本的用法&#xff0c;包括安装Git、创建代码仓库以及提交本地代码。 下面将要学习版本控制。 一、准备工作 先选择一个项目&#xff0c;给它创建一个代码仓库&a…

Linux环境定时备份MySQL数据库

数据库备份常有&#xff0c;实现备份&#xff0c;大概需要3个步骤&#xff1a; 目录 1.创建数据库备份用户 2.创建数据库备份shell脚本 3.创建定时任务 1.创建数据库备份用户 为了数据安全&#xff0c;不建议使用root用户。举例&#xff1a;创建数据库备份用户 dump&#…

复现永恒之蓝[MS17_010]

目录 准备靶机 测试ping连通性 攻击漏洞 利用漏洞 准备靶机 1台kali&#xff0c;1台win7 win7系统可以在MSDN镜像网站里获取 注:将win7安装好&#xff0c;win7无法安装vmtools&#xff0c;若升级系统&#xff0c;可能会把永恒之蓝补丁打上&#xff0c;所以建议别升级系统 测试…

用Java创建可扩展的OpenAI GPT应用程序

ChatGPT 值得深入使用的方面之一是它的引擎&#xff0c;它不仅为基于Web的聊天机器人提供动力&#xff0c;还可以集成到Java应用程序中。 ▌Budget Journey App 想象一下&#xff0c;你想去一个城市旅行并且设置好了预算&#xff0c;你应该如何分配你的钱并让你的旅行难忘&am…

巧用千寻位置GNSS软件|逐点放样应用技巧

线路逐点放样是针对施工需要和设计要求&#xff0c;对线路 20、50、100间隔的整桩距或整桩号的特定桩位进行连续放样设定的程序。运用千寻位置GNSS软件如何快速实现线路逐点放样呢&#xff1f;让我们一探究竟吧&#xff01; 点击【测量】->【线路逐点放样】&#xff0c;选择…

CMake : Linux 搭建开发 - g++、gdb

目录 1、环境搭建 1.1 编译器 GCC&#xff0c;调试器 GDB 1.2 CMake 2、G 编译 2.1 编译过程 编译预处理 *.i 编译 *.s 汇编 *.o 链接 bin 2.2 G 参数 -g -O[n] -l、-L -I -Wall、-w -o -D -fpic 3、GDB 调试器 3.1 调试命令参数 4、CMake 4.1 含义 4.2…

npm全局包及项目包的讲解与方法

看图可知 安装全局包和项目包 我们通过npm install 命令来安装包&#xff0c;简单说就是把包从npm的官网&#xff08;或者是指定的镜像源&#xff09;下载到我们自己的电脑中。那具体这个包下载到哪里了&#xff0c;还是有一点讲究的。 分成两类&#xff1a; 全局安装: 包被…

IntelliJ IDEA 新建安卓项目失败,网上的各种教程都不管用的看向这里!!!

目录 1、出现的问题&#xff1a; 2、解决办法&#xff1a; 1&#xff09;新建项目 2&#xff09;修改设置 3、注意 备注&#xff1a; 目的&#xff1a;最近开发机器人远程控制需要一个安卓app&#xff0c;之前是自己做了个H5app来用的&#xff0c;H5不是很稳定&#xff0c;所…

Kotlin基础

Kotlin基础 一.Kotlin介绍1.诞生2.Kotlin与JVM3.为什么学习kotlin&#xff1f;4.Kotlin跨平台特性 二.变量常量类型条件语句函数1.声明变量2.内置数据类型3.只读变量4.类型推断5.编译时常量6.条件语句&#xff1a;表达式7.String模板8.函数 三.匿名函数函数类型高阶函数&#x…

关于OKD(OpenShift)中组件资源介绍和命令行操作的一些笔记

写在前面 参加考试&#xff0c;会陆续分享一些 OpenShift 的笔记博文内容为 openshift 常见 API 资源对象介绍&#xff0c;包括所特有的 Route&#xff0c;IS&#xff0c;DC&#xff0c;BC 等。学习环境为 openshift v3 的版本&#xff0c;有些旧这里如果专门学习 openshift &a…

第一节 ogre源码编译与安装

一. 电脑环境要求 本机使用的编译环境为&#xff1a;系统为Windows 10&#xff0c; Microsoft Visual Studio Enterprise 2019&#xff0c;版本 16.11.26&#xff0c;cmake-3.18.6-win64-x64 这些为基本的操作环境自己可以从网上下载安装。 二. 依赖环境下载 DirectX SDK &a…

Blade项目的IDE支持

Blade是一个C/C构建工具&#xff0c;详细介绍见Blade构建工具。虽然功能强大&#xff0c;但是缺少IDE支持。本文介绍如何在Blade项目中使用IDE的智能提示、自动补全、自动跳转等特性。 1.VSCode VSCode的C/C插件(ms-vscode.cpptools)提供了C/C代码的智能提示、自动补全和调试…

Java编程设计语言-集合类

API(application programming interface)是JDK的重要组成部分&#xff0c;API提供了Java程序与运行它的系统软件&#xff08;Java虚拟机&#xff09;之间的接口&#xff0c;可以帮助开发者方便、快捷地开发Java程序 集合在程序设计中是一种重要的是数据结构&#xff0c;Java中提…

数据湖Iceberg-FlinkSQL-kafka类型表数据无法成功写入(6)

数据湖Iceberg-简介(1) 数据湖Iceberg-存储结构(2) 数据湖Iceberg-Hive集成Iceberg(3) 数据湖Iceberg-SparkSQL集成(4) 数据湖Iceberg-FlinkSQL集成(5) 数据湖Iceberg-FlinkSQL-kafka类型表数据无法成功写入(6) 数据湖Iceberg-Flink DataFrame集成(7) 数据湖Iceberg-FlinkSQL-…

Linux离线状态下在anaconda中安装pytorch

1. 下载与安装说明 下载地址&#xff08;按安装方法选取&#xff09; bz2压缩包下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/?CM&ODwhl包下载 torch、torchversion、torchaudio下载地址&#xff1a;https://download.pytorc…

【OS】Linux Process Memory的探究

【OS】Linux Process Memory的探究 前言 刷B站刷到了南大OS的课程&#xff0c;不得不说酒吧舞的教育水平真滴高&#xff0c;狠狠的看了一些关于进程地址相关的课程。 进程地址空间 1.导言 先导入两个问题&#xff1a; 如下的程序会输出什么&#xff1f; #include<stdio…

axios的使用,axios的get请求、post请求方式、put请求方式

axios (发音&#xff1a;艾克C奥斯)是前端圈最火的、专注于数据请求的库。react/vue官方都推荐使用axios发送ajax请求&#xff0c;是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 中文官网地址&#xff1a;http://www.axios-js.com/ 英文官网地址&a…

快速下载VScode并配置Python运行环境【详细教程】

快速下载VScode并配置Python运行环境【详细教程】 博主&#xff1a;命运之光 目录 快速下载VScode并配置Python运行环境【详细教程】前言下载vscode第一步vscode官网下载第二步点击下载![请添加图片描述](https://img-blog.csdnimg.cn/1d76c427314b4ddcbd350e0a7e5449d5.png)第…

数据湖Iceberg-FlinkSQL集成(5)

文章目录 数据湖Iceberg-FlinkSQL集成环境准备**Flink与Iceberg的版本对应关系如下**jar包下载地址jar包上传到Flink lib目录下修改flink-conf.yaml配置 创建和使用Catalog创建语法说明Hive CatalogHadoop Catalog配置sql-client初始化文件 DDL语句创建数据库创建表创建分区表使…