電力の最適なディスパッチ
この例では、2 つのモデル (コストを最小化するモデルと利益を最大化するモデル) を使用して電力の生成とディスパッチを最適化する方法を示します。これらのモデルには次の特性があります。
5 つの電力技術: 陸上風力、洋上風力、太陽光、ガス燃焼ボイラー、小型原子力発電機
1 年に四季があり、電力要件 (需要) が異なる
1 日に 4 つの時間帯 (1 つの時間帯あたり 6 時間) があり、時間帯と季節ごとに電力要件が固定されている
電力要件 (需要) は、時間帯と季節のみに依存する定数です (確率的ではありません)。風力発電と太陽光発電の 2 種類を利用できるかどうかは、季節と時間帯によって確定的に決まります。
初期データ
問題の時間帯と技術を設定します。
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);負荷制限コストは各季節と時間帯で同じです。このコストは KWh あたりのコストです。
LoadShedCost = 1200*ones(nSeasons,nPeriods);
風力発電と太陽光発電のコストは、初期投資後はゼロです。ガス発電と原子力発電のコストは発電量に比例し、発電されるキロワットあたりのコストは次のとおりです。
OperCost = zeros(nSeasons,nPeriods,nTechnologies); OperCost(:,:,4) = 57; % Gas OperCost(:,:,5) = 3.19; % Nuclear
各技術の投資コストは、発電容量の MWh あたり次のようになります。
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 手法を使用して) 各技術の容量を購入するためのコストや、特定の期間にわたってガス発電機と原子力発電機を運用するためのコストが挙げられます。
この例では、1 年間の運用コストを、1 年 364 日 (日数を四季で均等に分割するため) あたりのコストを 1 年の四季で除算した値としてモデル化します。
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 kW から 820 kW までの多大な需要に対処します。ガス発電機はほぼ半分の時間非アクティブで、アクティブ時には 10 kW から 640 kW までに対処します。
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 を超えています。
まとめ
エネルギー投資と電力ディスパッチの確定的な問題は、線形計画法を使用して定式化し、解くことができます。問題ベースのアプローチでは、シンボリック形式の変数を利用できるため、問題を簡単に定式化できます。
これらのモデルはいくつかの方法で一般化できます。たとえば、最大容量にすぐに到達できない発電機を考慮したランプ制約を追加したり、充電制約とエネルギー損失を考慮して電力を貯蔵できる蓄電池を用意したりできます。