メインコンテンツへ

蓄電池シミュレーション

背景

蓄電池は、太陽光発電プロジェクトの収益性と取引に大きな影響を与えます。当社のシミュレーターでは、ヒューリスティックに基づいた蓄電池のディスパッチ最適化を採用しており、プラントの寿命にわたる蓄電池の運転を迅速にシミュレートできます。 このスケジューリングアルゴリズムは、運転中に使用される最適化(蓄電池制御を参照)とは異なります。これは、分析的な最適化モデルを実行することが数十年にわたる運転では非現実的であるためです。このため、長期シミュレーションでは、ヒューリスティックに基づいた簡略化された蓄電池スケジューラーを使用します。これは、ほとんど常に真実である簡略化された仮定であるため、分析モデルが見つけるものとほぼ同じ近似値が得られます。たとえば、近似では、蓄電池が1日に1回完全に充放電されるとします。これは常に当てはまるわけではありませんが、分析的なアプローチとほぼ同じ結果が得られるのに十分な近似値です。

以下のヒューリスティックモデルは、DiOrio et al., 2020DOI:10.1016/j.apenergy.2019.114465)に基づいています。

計算ロジック

命名法

注:全ての測定値は、単一のスロットを指します。

プロジェクト特性

MnomM_{nom} : メーター交換定格(kWh*) SmaxS_{max} : 最大太陽光インバーター(kWh) BmaxB_{max} : 最大蓄電池交換(kWh) EmaxE_{max} : 最大蓄電池エネルギー(kWh) VnomV_{nom} : 公称電圧(V) γ\gamma : 年間劣化(単位なし) CcycleC_{cycle} : 蓄電池サイクルコスト(円/kWh) ηcharge,ηdischarge\eta_{charge},\eta_{discharge} : 充電効率と放電効率(単位なし) SoCmin,SoCmax,SoCstart\text{SoC}_{min},\text{SoC}_{max},\text{SoC}_{start} : 最小、最大、初期充電状態(kWh)

入力値

p(t)p(t) : 時刻ttの価格予測(円/kWh) g(t)g(t) : 時刻ttの太陽光発電予測(kWh) c(t)c(t) : 時刻ttの出力抑制レベルの予測([0,1]\in [0,1])(単位なし) mmax(t)m_{max}(t) : 時刻ttの最大メーター交換(kWh) hh : ホライズン(スロット数)(単位なし)

蓄電池状態

qmax(t)q_{max}(t) : 時刻ttの最大充電(C) q(t)q(t) : 時刻ttの充電(C)

意思決定変数

efill(t)e_{fill}(t) : 蓄電池に残っているエネルギー容量(kWh) eclipped(t)e_{clipped}(t) : クリッピングのために予約されたエネルギー(kWh) echarge(t)e_{charge}(t) : 蓄電池に残っている有効なエネルギー容量(クリッピングのためにスペースを予約する)(kWh) pclipped(t)p_{clipped}(t) : 蓄電池なしでクリッピングされる電力(kWh) pdischarge(t)p_{discharge}(t) : 放電する電力(kWh) pclipcharge(t)p_{clipcharge}(t) : クリップされた太陽光から充電する電力(kWh) ppvcharge(t)p_{pvcharge}(t) : クリップされていない太陽光から充電する電力(kWh)

バイナリ意思決定変数

bdischarge(t)b_{discharge}(t) : 放電決定 bhighvaluedischarge(t)b_{highvaluedischarge}(t) : 高価値放電時間 bclipcharge(t)b_{clipcharge}(t) : クリップされた太陽光発電を充電する時間 bpvcharge(t)b_{pvcharge}(t) : 太陽光発電から充電する決定

設定点

ptarget(t)p_{target}(t) : 予備電力目標(kWh) peffective(t)p_{effective}(t) : 制約後の有効電力目標(kWh)

出力値

m(t)m(t) : 時刻ttのメーター交換(kWh) fs2g(t)f_{s2g}(t) : エネルギーフロー(太陽光から系統)(kWh) fb2g(t)f_{b2g}(t) : エネルギーフロー(蓄電池から系統)(kWh) fs2b(t)f_{s2b}(t) : エネルギーフロー(太陽光から蓄電池)(kWh)

初期設定

当社の蓄電池スケジューリング最適化は、数十年以上にわたってプロジェクトを非常に高速にシミュレートできるヒューリスティックに基づいています。 このヒューリスティックは、蓄電池を簡略化された方法でシミュレートします。

ページ全体を通して、明確にするために、角かっこをアイバーソンブラケット表記法**として使用します。

まず、蓄電池の最大充電容量を次のように定義します。

qmax(0)=EmaxVnomq_{max}(0) = \frac{E_{max}}{V_{nom}}

蓄電池の初期充電を次のように定義します。

q(0)=qmax(0)SoCstartq(0) = q_{max}(0) \cdot \text{SoC}_{start}

30分ごとのスロットの劣化を次のように見つけます。

γslot=(1γ)1/(36548)\gamma_{slot} = (1 - \gamma)^{1 / (365 \cdot 48)}

各タイムステップで、実際のメーター交換制限は現在の出力抑制によって異なります。

mmax(t)=(1c(t))Mnomm_{max}(t) = (1-c(t)) \cdot M_{nom}

意思決定変数の決定

当社のスケジューリングシステムは、スケジューリングホライズンhhに基づいた意思決定変数に依存しています。 ホライズン期間中、電力を系統に販売できる最大価格は次のように定義できます。

csellmax(t)=maxi=tt+h(p(t))c_{sellmax} (t) = \max_{i=t}^{t+h}(p(t))

蓄電池の各使用法の相対的な(概算)収益ストリームを計算できます。 時刻ttに、PVからの充電によって得られる収益は、このエネルギーを販売できる最大価格から、今すぐエネルギーを販売する機会損失を差し引いたものによって異なります。

rpvcharge(t)=csellmax(t)ηdischargep(t)ηchargeCcycler_{pvcharge}(t) = c_{sellmax}(t) \cdot \eta_{discharge} - \frac{p(t)}{\eta_{charge}} - C_{cycle}

エネルギーがクリップされる場合に充電されるおおよその収益には、エネルギーはとにかく失われるため、機会費用はかかりません。

rclipcharge(t)=csellmax(t)ηdischargeCcycler_{clipcharge}(t) = c_{sellmax}(t) \cdot \eta_{discharge} - C_{cycle}

今すぐ放電することからの収益は、市場の現在の価格に依存します。

rdischarge(t)=p(t)ηdischargeCcycler_{discharge}(t) = p(t) \cdot \eta_{discharge} - C_{cycle}

また、バイナリ意思決定変数も計算します。これらは全て0または1であり、bbで示されます。 現在のタイムステップで価格が最小の場合(ホライズンと比較して)、これは蓄電池を充電するのに最適な瞬間です。

bhighvaluecharge(t)=[p(t)=mini=tt+h(p(i))]b_{highvaluecharge}(t) = [p(t) = \min_{i=t}^{t+h}(p(i))] % \begin{cases} % 1, & \text{if } p(t) = \min_{i=t}^{t+h}(p(i)) \\ % 0, & \text{otherwise} % \end{cases}

一方、現在のタイムステップで価格が最大の場合(ホライズンと比較して)、これは蓄電池を放電するのに最適な瞬間です。

bhighvaluedischarge(t)=[p(t)=maxi=tt+h(p(i))]b_{highvaluedischarge}(t) = [p(t) = \max_{i=t}^{t+h}(p(i))] % \begin{cases} % 1, & \text{if } p(t) = \max_{i=t}^{t+h}(p(i)) \\ % 0, & \text{otherwise} % \end{cases}

PVから充電するかどうかの決定は、3つの条件が全て真であるかどうかによって異なります。価格が最低で、PV充電からの収益がプラスで、太陽光発電量がプラスである場合:

bpvcharge(t)=bhighvaluecharge(t)[rpvcharge(t)>0][g(t)>0]b_{pvcharge}(t) = b_{highvaluecharge}(t) \cdot [r_{pvcharge}(t) > 0] \cdot [g(t) > 0] % \begin{cases} % 1, & \text{if } [b_{highvaluecharge}(t)] * [r_{pvcharge}(t) > 0] * [g(t) > 0] \\ % 0, & \text{otherwise} % \end{cases}

クリップされた電力から充電するかどうかの決定は、収益がプラスであるかどうかにのみ依存します。

bclipcharge=[rclipcharge>0]b_{clipcharge} = [r_{clipcharge} > 0] % \begin{cases} % 1, & \text{if } r_{clipcharge} > 0 \\ % 0, & \text{otherwise} % \end{cases}

次に、時刻ttに蓄電池を放電する必要があるかどうかを判断できます。

bdischarge(t)=bhighvaluedischarge(t)[SoC(t)>SoCmin][mmax(t)>g(t)][rdischarge>0]b_{discharge}(t) = b_{highvaluedischarge}(t) \cdot [\text{SoC}(t) > \text{SoC}_{min}] \cdot [m_{max}(t) > g(t)] \cdot [r_{discharge} > 0]

これは、価格が良い瞬間であるかどうか、十分なSoCがあるかどうか、メーター交換制限が太陽光発電量よりも高いかどうか、および放電からの収益がプラスであるかどうかに依存します。

ヒューリスティック最適化

蓄電池を最適化するには、全ての意思決定変数を確認し、それらの値に応じて蓄電池の設定点を決定する必要があります。

予約エネルギー

各タイムステップttについて、最初に蓄電池内の様々なタスクのために予約されたエネルギー量を計算できます。これにより、蓄電池の利用に制限が設定されます。 まず、クリッピングされるエネルギーを吸収するために、蓄電池容量を予約します(たとえば、出力抑制イベントによって)。蓄電池なしでクリッピングされる電力量は、次のように計算できます。

pclipped(t)=max(0,g(t)mmax(t))p_{clipped}(t) = \max(0, g(t) - m_{max}(t))

理想的には、これら全てのクリップされたエネルギーを吸収したいと考えています。そうしないと、完全に無駄になります。クリップされたエネルギーを吸収するために蓄電池に保持する必要がある、各時点での予約エネルギーは、次のように計算できます。

eclipped=i=tt+h(pclipped)e_{clipped} = \sum_{i=t}^{t+h}(p_{clipped})

蓄電池内で各瞬間に充電できるエネルギーは、次のように定義されます。

efill(t)=Vnom(qmax(t)SoCmaxq(t))e_{fill}(t) = V_{nom} * (q_{max}(t) * \text{SoC}_{max} - q(t))

したがって、後でクリップされたエネルギーの容量を予約しながら、時刻ttに充電できるエネルギーは次のようになります。

echarge(t)=max(0,efill(t)eclipped(t))e_{charge}(t) = \max(0, e_{fill}(t) - e_{clipped}(t))

予備電力設定点

次に、蓄電池の電力量(設定点)を決定できます。これらは、実行不可能なソリューションになる可能性がある予備値になることに注意してください。これらの制約は後で解決されます。 放電電力は、bdischargeb_{discharge}がアクティブな場合にのみアクティブになり、蓄電池電力容量と太陽光発電後の残りのメーター容量によって制約されます(SoCに関連する制約は後で解決されます)。

pdischarge(t)=bdischarge(t)min(Bmax,mmax(t)g(t))p_{discharge}(t) = b_{discharge}(t) \cdot \min(B_{max},m_{max}(t) - g(t))

bdischargeb_{discharge}がアクティブでない(=0)場合、充電オプションを評価できます。 クリップされた電力がある場合は、それを使用して充電します。

pclipcharge(t)=bclipcharge(t)pclipped(t)p_{clipcharge}(t) = b_{clipcharge}(t) \cdot p_{clipped}(t)

太陽光発電から充電するのが良い場合は、残りの充電を太陽光発電に使用します。

ppvcharge(t)={min(max(echarge(t),pclipped)(t),g(t)pclipped(t)),if bclipcharge(t)g(t),otherwisep'_{pvcharge}(t) = \begin{cases} \min(\max(e_{charge}(t), p_{clipped})(t),g(t) - p_{clipped}(t)), & \text{if } b_{clipcharge}(t)\\ g(t), & \text{otherwise} \end{cases} ppvcharge(t)=bpvcharge(t)ppvcharge(t)p_{pvcharge}(t) = b_{pvcharge}(t) \cdot p'_{pvcharge}(t)

最後に、全ての寄与からの目標電力を計算できます。

ptarget(t)=pdischarge(t)bdischarge(t)(ppvcharge(t)bpvcharge(t)+pclipcharge(t)bclipcharge(t))p_{target}(t) = p_{discharge}(t) \cdot b_{discharge}(t) - (p_{pvcharge}(t) \cdot b_{pvcharge}(t) + p_{clipcharge}(t) \cdot b_{clipcharge}(t))

目標電力に基づいて、蓄電池状態を更新できます。 特に、時刻ttの(他の制約前の)仮説電流を次のように見つけることができます。

current(t)=ptarget(t)/Vnomcurrent(t) = p_{target}(t) / V_{nom}

これから、蓄電池のSoC制限によって制約された、蓄電池の新しい充電レベルを計算できます。

q(t+1)=max(min(q(t)current(t),qmax(t)SoCmax),qmax(t)SoCmin)q(t+1) = \max \Big( \min \big( q(t) - current(t), q_{max}(t) \cdot \text{SoC}_{max} \big) , q_{max}(t) \cdot \text{SoC}_{min} \Big)

新しい充電レベルに基づいて、交換される有効な電力(時刻tの実際の蓄電池設定点)を計算できます。

peffective(t)=(q(t)q(t+1))Vnomp_{effective}(t) = (q(t) - q(t+1)) \cdot V_{nom}

電力フロー

最後に、蓄電池、太陽光発電、および系統間の様々なフローとして結果を計算できます。

fb2g(t)=max(0,peffective(t))f_{b2g}(t) = \max(0, p_{effective}(t)) fs2b(t)=min(0,peffective(t))f_{s2b}(t) = -\min(0,p_{effective}(t)) fs2g(t)=min(g(t)fs2b(t),mmax(t))f_{s2g}(t) = \min(g(t) - f_{s2b}(t), m_{max}(t))

次に、蓄電池によって回避された出力抑制のレベルを次のように決定できます。

cavoided(t)=min(fs2b(t),cvirtual(t))c_{avoided}(t) = \min(f_{s2b}(t), c_{virtual}(t)) cvirtual(t)=max(0,g(t)mmax(t))c_{virtual}(t) = \max(0, g(t) - m_{max}(t))

ここで、cvirtual(t)c_{virtual}(t)は蓄電池なしでプラントが発生するであろう_仮想_出力抑制です。

上記で定義された蓄電池の劣化に基づいて、蓄電池容量を次のように更新します。

qmax(t+1)=qmax(t)γslotq_{max}(t+1) = q_{max}(t) \cdot \gamma_{slot}

* これはスロットあたりのkWhを指します。つまり、30分のスロット中に交換できる実際の最大エネルギーです。これは、kW定格を2で割った値に相当します。たとえば、1 kWのプラントは30分間隔で0.5 kWhを生成できます。他の変数にも同じ規則を使用します。

** アイバーソンブラケット表記法は次のように定義されます。

[P]={1,if P is true0,otherwise[P] = \begin{cases} 1, & \text{if $P$ is true} \\ 0, & \text{otherwise} \end{cases}

検証

ヒューリスティック最適化モデルを分析モデルで検証し、簡略化された仮定が導入する予想される誤差を理解します。