电力调度优化
本例演示了如何利用两个模型优化电力生产与调度:一个模型旨在最小化成本,另一个模型则致力于最大化利润。这些模型具有以下特点:
电力领域的五项核心技术:陆上风能、海上风能、光伏(太阳能)、燃气锅炉及小型核电机组。
一年四季,每个季节的电力需求(负荷)不同。
每天分为四个时段,每个时段为六小时,每个时段和季节均有固定的电力需求。
电力需求(需求量)是仅取决于时间段和季节(而非随机)的常量。两种类型的风能和太阳能的可用性在确定性条件下取决于季节和时间段。
初始数据
设定问题的时间段和技术。
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 美元支付、年利率为 的年金的现值为
EAC 技术将技术的成本除以 (与 一起)以得出技术的等效年成本。
假设每项技术的使用寿命为 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。
结论
确定性能源投资与电力调度问题可通过线性规划进行建模与求解。问题导向方法通过提供符号变量,简化了问题的表述。
您可以通过多种方式对这些模型进行概括,例如添加斜坡约束,以考虑发电机无法立即达到最大容量的情况,或者为具有充电约束和能量损失的电力提供可用的存储空间。