主要内容

电力发电机优化调度:具体问题具体分析

这个例子展示了如何安排两个燃气发电机最优,意义最收入减去成本。虽然并不完全真实的例子,但是它展示了如何考虑成本取决于决策时机。

solver-based的方法这个问题,看到的电力发电机优化调度:Solver-Based

问题定义

电力市场在不同的时间有不同的价格。如果你有发电机提供电力,您可以利用这个可变定价时调度操作发电机价格很高。假设您控制两个发电机。每个发电机有三个功率(低,和高)。每个发电机都有一个指定的燃料消耗率和电力生产在每个功率。燃料消耗是0当发电机。

你可以分配一个每个发电机功率每半个小时的时间间隔在一天(24小时,所以每隔48)。根据历史记录,假设你知道收入每兆瓦(兆瓦),在每个时间间隔你收到。这个例子的数据是澳大利亚能源市场的运营商https://www.nemweb.com.au/REPORTS/CURRENT/在2013年代中期,在他们的条件下使用https: //www。aemo。com。非盟/privacy-and-legal-notices /copyright-permissions

负载dispatchPrice;%得到poolPrice,收入/千瓦时栏(poolPrice。5) xlim([5, 48.5])包含(在每个时期的价格/千瓦时)

图包含一个坐标轴对象。坐标轴对象包含价格每兆瓦时在每个时期都包含一个酒吧类型的对象。

成本开始后一个发电机。同时,有一个限制的最大燃料使用。这个约束的存在,因为你买燃料提前一天的时间,所以你可以只使用你刚买了什么。

问题的符号和参数

你可以制定调度问题作为二进制整数规划问题。定义索引,j,k,和一个二进制调度向量y,如下所示:

  • nPeriods48 =数量的时期,在这种情况下。

  • < = =一个时间段,1< = 48。

  • j< = =一个发电机指数,1j对于这个例子< = 2。

  • y (i, j, k) = 1当时间、发电机j在功率运行吗k。让低功率k = 1,高功率k = 2。当发电机sum_k y (i, j, k) = 0

决定当一个发电机开始后。为此,定义辅助二进制变量z (i, j)表明是否收费打开发生器j在期

  • z (i, j) = 1当发电机j在期,但在时间我+ 1z (i, j) = 0否则。换句话说,z (i, j) = 1sum_k y (i, j, k) = 0sum_k y (i + 1, j, k) = 1

您需要一种方法来设置z自动设置的基础上y。一个线性约束下处理此设置。

你也需要成本的参数问题,代水平对于每个发电机,发电机的消费水平,和燃料。

  • poolPrice(我)——在区间收入以美元/千瓦时

  • 创(j, k)——MW发电机所产生的j在功率k

  • 燃料(j, k)——燃料使用的发电机j在功率k

  • totalFuel——可用的燃料在一天之内

  • startCost——成本以美元开始后一个发电机

  • fuelPrice——成本单位的燃料

你有poolPrice当你执行加载dispatchPrice;。设置其他参数如下。

fuelPrice = 3;totalFuel = 3.95 e4;nPeriods =长度(poolPrice);% 48期ngen = 2;%两个发电机创= (61152;50150);%发生器1低= 61 MW,高= 152兆瓦燃料= (427806;325765);%为发电机燃料消耗2 = 325低,高= 765startCost = 1 e4;%成本开始后一个发电机

发电机效率

检查两台发电机的效率两个操作点。

效率= /燃料将军;%计算电力单位燃料使用rr =效率”;%的策划h =酒吧(rr);h (1)。FaceColor =‘g’;h (2)。FaceColor =“c”;传奇(h,发电机1的,《发电机2》,“位置”,“NorthEastOutside”甘氨胆酸)ax =;斧子。XTick = [1, 2];斧子。XTickLabel = {“低”,“高”};ylim ([1, 2]) ylabel (“效率”)

图包含一个坐标轴对象。坐标轴对象2 ylabel效率包含对象类型的酒吧。这些对象代表发电机,发电机2。

注意发电机2比发电机更有效1对应的操作点(高低),但发电机1的高操作点是更有效的比其低操作发电机2点。

变量的解决方案

设置问题,你需要编码问题中的所有问题数据和约束形式。的变量y (i, j, k)代表问题的解决方案,辅助变量z (i, j)表明是否收费打开一个发电机。y是一个nPeriods-by-nGens-by-2数组,并z是一个nPeriods-by-nGens数组中。所有的变量是二进制。

y = optimvar (“y”nPeriods ngen, {“低”,“高”},“类型”,“整数”,下界的0,“UpperBound”1);z = optimvar (“z”nPeriods ngen,“类型”,“整数”,下界的0,“UpperBound”1);

线性约束条件

确保功率没有多个分量等于1,设置一个线性不等式约束。

powercons = y (:,:“低”)+ y (:,:“高”)< = 1;

每个周期运行成本的燃料成本。为发电机j操作的级别k的成本是fuelPrice *燃料(j, k)

创建一个表达式fuelUsed占所有的燃料使用。

yFuel = 0 (nPeriods ngen 2);yFuel(:, - 1, - 1) =燃料(1,1);%燃料使用发电机1在低设置yFuel(:, 1, 2) =燃料(1、2);%发电机1的燃料的使用在高设置yFuel(: 2 1) =燃料(2,1);%燃料使用发电机2低设置yFuel(: 2 2) =燃料(2,2);%燃料使用发电机2在高设置fuelUsed =总和(总和(sum (y。* yFuel)));

约束条件是,使用的燃料是不超过可用的燃料。

fuelcons = fuelUsed < = totalFuel;

设置发电机启动指示器变量

你怎么能得到解算器设置z变量自动匹配的活动/关闭时间y变量?回想一下,条件满足z (i, j) = 1什么时候sum_k y (i, j, k) = 0sum_k y (i + 1, j, k) = 1

请注意,sum_k (- y (i, j, k) + y (i + 1 j k)) > 0什么时候你想要z (i, j) = 1

因此,包括这些线性不等式约束问题公式化。

sum_k (- y (i, j, k) + y (i + 1 j k) - z (i, j) < = 0

此外,包括z目标函数中的变量成本。与z变量目标函数,求解程序试图降低值,这意味着它试图让他们都等于0。当一台发电机,但是对于那些间隔线性不等式部队z (i, j)等于1。

创建一个辅助变量w代表y (i + 1 j k) - y (i, j, k)。代表了发电机启动不平等的w

w = optimexpr (nPeriods ngen);%分配widx = 1:(nPeriods-1);w (idx:) = y (idx + 1:“低”)- y (idx:,“低”)+ y (idx + 1:“高”)- y (idx:,“高”);w (nPeriods:) = y (1:“低”)- y (nPeriods:,“低”)+ y (1:“高”)- y (nPeriods:,“高”);switchcons = w - z < = 0;

定义目标

目标函数包括运行发电机的燃料成本,收入从发电机运行,启动发电机的成本。

generatorlevel = 0(大小(yFuel));generatorlevel(:, - 1, - 1) =创(1,1);%填写水平generatorlevel(:, 1, 2) =创(1、2);generatorlevel(: 2 1) =创(2,1);generatorlevel(: 2 2) =创(2,2);

传入的收入= y* generatorlevel。* poolPrice

收入= optimexpr(大小(y));2 = 1:nPeriods收入(ii):,:) = poolPrice (ii) * y (ii):,:)。* generatorlevel (ii):,:);结束

燃料总成本=fuelUsed * fuelPrice

fuelCost = fuelUsed * fuelPrice;

发电机启动成本=z * startCost

startingCost z = * startCost;

利润=传入的收入- - - - - -燃料总成本- - - - - -启动成本。

利润=总和(sum (sum(收入)))- fuelCost总和(sum (startingCost));

解决这个问题

创建一个优化问题,包括目标和约束。

调度= optimproblem (“ObjectiveSense”,“最大化”);调度。目标=利润;dispatch.Constraints。switchcons = switchcons;dispatch.Constraints。fuelcons = fuelcons;dispatch.Constraints。powercons = powercons;

为了节省空间,抑制迭代显示。

选择= optimoptions (“intlinprog”,“显示”,“最后一次”);

解决这个问题。

[dispatchsol, fval exitflag、输出]=解决(调度,“选项”、选择);
使用intlinprog解决问题。找到最优解。Intlinprog停止因为客观价值差距公差内的最优值,选择。RelativeGapTolerance = 0.0001。在宽容intcon变量是整数,选项。IntegerTolerance = 1 e-05。

检查解决方案

策划解决方案作为时间的函数。

次要情节(1,1)栏(dispatchsol.y(:, 1, 1) *创(1,1)+ dispatchsol.y(:, 1, 2) *创(1、2),5,‘g’)xlim ([5, 48.5]) ylabel (“MWh”)标题(“发电机1的最优计划”,“FontWeight”,“大胆”次要情节(3、1、2)酒吧(dispatchsol.y(:, 2, 1) *(2, 1)一代+ dispatchsol.y(:, 2, 2) *创(2,2),5,“c”)标题(“发电机2最优计划”,“FontWeight”,“大胆”)xlim ([5, 48.5]) ylabel (“MWh”次要情节(3,1,3)酒吧(poolPrice。5) xlim([5, 48.5])标题(能源价格的,“FontWeight”,“大胆”)包含(“时间”)ylabel (“美元/千瓦时”)

图包含3轴对象。坐标轴对象1与标题发电机最优时间表,ylabel MWh包含一个对象类型的酒吧。坐标轴对象2与标题发电机最优时间表,ylabel MWh包含一个对象类型的酒吧。坐标轴对象3标题能源价格,包含时期,ylabel美元/千瓦时包含一个对象类型的酒吧。

发电机2运行超过发电机1,您所期望的,因为它是更有效率。2发电机运行时的高功率水平。发电机1运行主要是高功率水平,但向下一次低功率单元。每个发电机运行一组连续的时间每天,和,因此,导致只有一个每天启动成本。

检查z变量是1的时候发电机启动。

开始时间=找到(圆(dispatchsol.z) = = 1);%使用圆noninteger结果(年度变化平均数低于thegenerator] = ind2sub(大小(dispatchsol.z),开始时间)
年度变化平均数低于=2×123日16
thegenerator =2×11 2

发电机启动时的时间匹配块。

比较低的处罚启动

如果你指定一个较低的值startCost,解决方案涉及多个代时期。

startCost = 500;%为启动发电机选择较低的处罚startingCost z = * startCost;利润=总和(sum (sum(收入)))- fuelCost总和(sum (startingCost));调度。目标=利润;[dispatchsolnew, fvalnew exitflagnew outputnew] =解决(调度,“选项”、选择);
使用intlinprog解决问题。找到最优解。Intlinprog停止因为客观价值差距公差内的最优值,选择。RelativeGapTolerance = 0.0001。在宽容intcon变量是整数,选项。IntegerTolerance = 1 e-05。
次要情节(1,1)栏(dispatchsolnew.y(:, 1, 1) *创(1,1)+ dispatchsolnew.y(:, 1, 2) *创(1、2),5,‘g’)xlim ([5, 48.5]) ylabel (“MWh”)标题(“发电机1的最优计划”,“FontWeight”,“大胆”次要情节(3、1、2)酒吧(dispatchsolnew.y(:, 2, 1) *(2, 1)一代+ dispatchsolnew.y(:, 2, 2) *创(2,2),5,“c”)标题(“发电机2最优计划”,“FontWeight”,“大胆”)xlim ([5, 48.5]) ylabel (“MWh”次要情节(3,1,3)酒吧(poolPrice。5) xlim([5, 48.5])标题(能源价格的,“FontWeight”,“大胆”)包含(“时间”)ylabel (“美元/千瓦时”)

图包含3轴对象。坐标轴对象1与标题发电机最优时间表,ylabel MWh包含一个对象类型的酒吧。坐标轴对象2与标题发电机最优时间表,ylabel MWh包含一个对象类型的酒吧。坐标轴对象3标题能源价格,包含时期,ylabel美元/千瓦时包含一个对象类型的酒吧。

开始时间=找到(圆(dispatchsolnew.z) = = 1);%使用圆noninteger结果(年度变化平均数低于thegenerator] = ind2sub(大小(dispatchsolnew.z),开始时间)
年度变化平均数低于=3×122日16 45
thegenerator =3×11 2 2

相关的话题