主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

电力调度优化

本例演示了如何利用两个模型优化电力生产与调度:一个模型旨在最小化成本,另一个模型则致力于最大化利润。这些模型具有以下特点:

  • 电力领域的五项核心技术:陆上风能、海上风能、光伏(太阳能)、燃气锅炉及小型核电机组。

  • 一年四季,每个季节的电力需求(负荷)不同。

  • 每天分为四个时段,每个时段为六小时,每个时段和季节均有固定的电力需求。

电力需求(需求量)是仅取决于时间段和季节(而非随机)的常量。两种类型的风能和太阳能的可用性在确定性条件下取决于季节和时间段。

初始数据

设定问题的时间段和技术。

Seasons = ["winter";"spring";"summer";"fall"];
Periods = ["t1";"t2";"t3";"t4"];
Techs = ["wind on";"wind off";"solar";"gas";"nuclear"];

nSeasons = numel(Seasons);
nPeriods = numel(Periods);
nTechnologies = numel(Techs);

% Length of each period in hours
periodLength = 24/nPeriods;

需求

电力需求随季节和时间段以确定性方式变化。demand(i,j) 表示第 i 个季节第 j 个时段的电力需求。

% Demand by season and by period
demand = [280, 600, 720, 350
          250, 640, 820, 500 
          880, 640, 640, 880 
          600, 640, 420, 500];

优化变量与能量平衡

定义问题的优化变量。对于每个季节和时间段,创建按技术分类的调度功率变量以及按技术分类的弃电功率(需求但未供应的功率)变量。首先,创建优化问题。

costMinProblem = optimproblem;

创建优化变量。

% Dispatch for each technology by season and by period
loadDispatch = optimvar("loadDispatch",Seasons,Periods,Techs,LowerBound=0);
% Load shed by season and by period
loadShed = optimvar("loadShed",Seasons,Periods,LowerBound=0);

创建能量平衡约束,规定弃电量等于需求减去调度电量。分配的功率是所有技术中 loadDispatch 的总和。换句话说,调度功率可以小于需求功率,任何需求功率但未被调度功率满足的部分将被弃用(未满足)。

costMinProblem.Constraints.EnergyBalance = loadShed == demand - sum(loadDispatch,3);

电容量与成本

在此问题中,您需要确定每种技术的产能,以满足需求并最小化成本或最大化利润。创建优化变量,用于表示每种技术的容量。

capacity = optimvar("capacity",Techs,LowerBound=0);

负荷削减成本在每个季节和时段内保持一致。成本按每千瓦时计算。

LoadShedCost = 1200*ones(nSeasons,nPeriods);

风能和太阳能发电的成本在初始投资后为零。天然气和核能发电的成本与发电量成正比,每千瓦时发电的成本如下:

OperCost = zeros(nSeasons,nPeriods,nTechnologies);
OperCost(:,:,4) = 57; % Gas
OperCost(:,:,5) = 3.19; % Nuclear

每种技术的投资成本如下,按每兆瓦时发电容量计算。

GenInvestCost = [1489000; 3689000; 1502000; 1606000; 8936000]; % $/MWh

可用性

每种风能和太阳能的可用性取决于季节和时间段。例如,太阳能发电在夜间不可用,但夜间时段因季节而异。天然气发电和核电在每个季节和时间段的可用性均为 1。

Availability = ones(nSeasons,nPeriods,nTechnologies);
% Onshore wind
Availability(:,:,1) = [0.50  0.10  0.5 0.5; 
                          0.2  0.50  0.75 0.2;
                          0.2  0.50  0.75 0.2;
                          0.5  0.50  0.75 0.75];
% Offshore wind
Availability(:,:,2) = [0.50  0.75  0.5 0.5; 
                          0.3  0.75  0.85 0.5;
                          0.3  0.75  0.85 0.5;
                          0.5  0.50  0.85 0.85];
% Solar
Availability(:,:,3) = [0.00  0.6  0.6 0.00; 
                          0.00  0.7  0.75 0.0;
                          0.00  0.8  1.00 0.5;
                          0.00  0.50  0.75 0.2];

每个季节和时间段的可用功率是该季节和时间段的容量与可用性的乘积。创建一个包含此容量限制的约束表达式。

capLimit = optimconstr(nSeasons,nPeriods,nTechnologies);
% For each generator
for gen = 1:nTechnologies
    capLimit(:,:,gen) = loadDispatch(:,:,gen) <= periodLength*capacity(gen).*Availability(:,:,gen);
end

costMinProblem.Constraints.CapacityLimit = capLimit;

等效年成本 (EAC)

为了计算工程技术投资所使用的资本成本,采用等值年限成本 (EAC) 技术。假设所有技术的使用寿命均为 N 年,利率为固定利率,税收和折旧可忽略不计。以每年 K 美元支付、年利率为 r 的年金的现值为

V=K+K1+r++K(1+r)N-1=Kr(1-1(1+r)N).

EAC 技术将技术的成本除以 V(与 K=1 一起)以得出技术的等效年成本。

假设每项技术的使用寿命为 20 年,固定利率为 5%。

r = 0.05;
N = 20;
divFactor = 1/r*(1 - 1/((1 + r)^N));

成本最小化问题

第一个问题是尽量降低系统运营成本,包括每种技术容量的采购成本(采用 EAC 方法计算)以及在整个时间段内运营天然气和核发电机的成本。

在此示例中,一年的运营成本被建模为每日成本乘以一年中的 364 天(以便将天数均匀分配到四个季节)再除以一年中的四个季节。

yearFactor = 364/nSeasons;
costMinProblem.Objective = sum(yearFactor*sum(loadShed.*LoadShedCost +...
    sum(loadDispatch.*OperCost,3),2)) + dot(GenInvestCost,capacity)/divFactor;

通过调用 solve 求解问题。

[soln,fval] = solve(costMinProblem)
Solving problem using linprog.

Optimal solution found.
soln = struct with fields:
        capacity: [5×1 double]
    loadDispatch: [4×4×5 double]
        loadShed: [4×4 double]

fval = 
4.9417e+07
soln.capacity
ans = 5×1

  200.0000
         0
         0
  106.6667
         0

dot(GenInvestCost,soln.capacity)/divFactor
ans = 
3.7642e+07

为了以最低成本运行该系统,您需要投资 dot(GenInvestCost,soln.capacity)/divFactor = $3.7642e+07,以获得 200 兆瓦的陆上风电容量和 106.6667 兆瓦的燃气发电机组容量。

soln.loadDispatch
ans = 
ans(:,:,1) =

  280.0000  120.0000  600.0000  350.0000
  240.0000  600.0000  820.0000  240.0000
  240.0000  600.0000  640.0000  240.0000
  600.0000  600.0000  420.0000  500.0000


ans(:,:,2) =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0


ans(:,:,3) =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0


ans(:,:,4) =

         0  480.0000  120.0000         0
   10.0000   40.0000         0  260.0000
  640.0000   40.0000         0  640.0000
         0   40.0000         0         0


ans(:,:,5) =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

陆上风力发电机组承担了大部分的电力需求,功率范围从 120 千瓦到 820 千瓦。气体发生器大约有一半时间处于非活动状态,而在活动状态下,其处理能力范围为 10 千瓦至 640 千瓦。

soln.loadShed
ans = 4×4

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

采用最优调度方案,不会发生负荷切除。然而,这个结果取决于确定性模型,该模型未考虑现实中的随机波动,而是将风能和太阳能的可用性作为总量的确定性比例来建模。一个更现实的模型可能会显示出一些脱落负载。

利润最大化问题

现在考虑一个相关问题:为了最大化利润(不考虑负荷卸除成本),你应该购买哪些发电机组?该问题涉及通过优化不同技术的调度和规模配置,以实现利润最大化。假设发电价格按照固定时间表进行调整。

% Price of energy by season and by period $
GenPrice = [137.5 145 100 90
            38    45  60  65
            121   138 150 180
            63    65  70  40 ];
GenPrice = yearFactor.*0.8.*GenPrice;

创建一个名为 profitMaxExpandProb 的新优化问题。

profitMaxExpandProb = optimproblem;

对每项技术的安装容量设定上界。

capacity.UpperBound = [100; 200; 150; 100; 300];

确定要最大化的利润,其中包括等效年成本分配系数。

weightedDispatchProfit = GenPrice./yearFactor - OperCost;
profitMaxExpandProb.Objective = sum(yearFactor.* ...
    sum( sum( weightedDispatchProfit .*loadDispatch, 3), 2) ) - ...
    dot(GenInvestCost,capacity)/divFactor;
profitMaxExpandProb.ObjectiveSense = "maximize";

在问题中设置容量的边界条件并解决问题。

profitMaxExpandProb.Constraints.CapacityLimit = capLimit;
[solProfitExpand,totalProfit] = solve(profitMaxExpandProb)
Solving problem using linprog.

Optimal solution found.
solProfitExpand = struct with fields:
        capacity: [5×1 double]
    loadDispatch: [4×4×5 double]

totalProfit = 
7.1655e+07

查看每项技术的最佳容量。

solProfitExpand.capacity
ans = 5×1

   100
   200
   150
   100
     0

所有最佳产能均已达到上限,核能除外,其产能为 0(未利用)。查看每种技术已分配的功率。

solProfitExpand.loadDispatch
ans = 
ans(:,:,1) =

  300.0000   60.0000  300.0000  300.0000
  120.0000  300.0000  450.0000  120.0000
  120.0000  300.0000  450.0000  120.0000
  300.0000  300.0000  450.0000  450.0000


ans(:,:,2) =

   1.0e+03 *

    0.6000    0.9000    0.6000    0.6000
    0.3600    0.9000    1.0200    0.6000
    0.3600    0.9000    1.0200    0.6000
    0.6000    0.6000    1.0200    1.0200


ans(:,:,3) =

         0  540.0000  540.0000         0
         0  630.0000  675.0000         0
         0  720.0000  900.0000  450.0000
         0  450.0000  675.0000  180.0000


ans(:,:,4) =

   600   600   600   600
     0     0     0     0
   600   600   600   600
     0     0     0     0


ans(:,:,5) =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

陆上和海上风能(矩阵 1 和 2)被广泛应用,太阳能(矩阵 3)在可利用时段内也被大量采用。气体(矩阵 4)仅在冬季和夏季使用,用于第 1 行和第 3 行。计算长期平均调度负荷。

avload = mean(solProfitExpand.loadDispatch,[1,2])
avload = 
avload(:,:,1) =

  277.5000


avload(:,:,2) =

  731.2500


avload(:,:,3) =

   360


avload(:,:,4) =

   300


avload(:,:,5) =

     0

在问题区域,陆上风电、太阳能和天然气处理的长期平均功率均接近 300。海上风电的平均值超过 700。

结论

确定性能源投资与电力调度问题可通过线性规划进行建模与求解。问题导向方法通过提供符号变量,简化了问题的表述。

您可以通过多种方式对这些模型进行概括,例如添加斜坡约束,以考虑发电机无法立即达到最大容量的情况,或者为具有充电约束和能量损失的电力提供可用的存储空间。

另请参阅

主题