離散時間で軌道最適化のためにGekkoを使う方法 -- optimization フィールド と battery フィールド と gekko フィールド と discrete フィールド 関連 問題

How to use Gekko for trajectory optimization in discrete time












3
vote

問題

日本語

電池のエネルギー貯蔵システムの充電(DIS)を最適化するためにGekkoを使用しようとしています。 1時間あたりの電力価格<コード> EP 、ソーラーパネルからのエネルギー生産<コード> PV 、エネルギー需要<コード> Dem <コード>は、地平線全体(0-24H)全体にわたって検討されています。合計コストの削減<コード> TC 。バッテリが(<コード> Pgrid_in )にバッテリ( Pgrid_in )の間(<コード> Pgrid_in ; Pgrid_in )。 > Pgrid_out )最適な瞬間に。

ほとんどの例のオンラインとは対照的に、問題は状態空間モデルとして定式化されていませんが、大部分は価格、消費、生産のための外因データに依存しています。 3つの具体的な問題Gurobiを参照した具体的な問題は以下に概説されていますが、次のエラーをもたらすコード全体がこの投稿の下部にあります。

<事前> <コード> Exception: @error: Inequality Definition invalid inequalities: z > x < y at0x0000016c6b214040> STOPPING . . .
  1. 目的関数は、地平線全体のグリッドへの電気を売買することによるコストの合計です。この方法で特定のタイムステップで、特定のタイムステップで操作された変数(<コード> PowerGridOut )への参照を可能にするGurobiに慣れています([T])。
  2. <事前> <コード> PV1

    これは北京でも可能ですか、あるいはこの総和は一体としてリキャストされるべきですか?次のコードは正しいですか?

    <事前> <コード> PV2
    1. Gurobiは、電池の充電状態の変化に対する制約のこの定式化を可能にします:
    2. <事前> <コード> PV3

      似たような問題に関する石造りフローに関する質問に基づいて、私はこれを継続的に改革しました:

      <事前> <コード> PV4
      1. 最終キー制約は電力のバランスが必要です。ここで、 PV5 &amp。 Pgrid_in16 は外因的なベクトルであり、他の変数は<コード> 998877617
      2. です。 <事前> <コード> PV8

        残念ながら、これまでにはこれまでには機能していません。誰かが私にいくつかのヒントを与えることができれば私はそれを高く評価するでしょう。理想的には、客観的な関数と拘束の両方を離散用語で策定したいと思います。

        コード全体

        <事前> <コード> PV9
英語

I am trying to use Gekko to optimize (dis)charging of a battery energy storage system. Electricity prices per hour EP, energy production from solar panels PV, and energy demand Dem are considered over the entire horizon (0-24h) to minize total costs TC. Arbitrage should take place as the battery is (dis)charged (Pbat_ch & Pbat_dis) to/from the grid (Pgrid_in & Pgrid_out) at the optimal moments.

As opposed to most of the examples online, the problem is not formulated as a state-space model, but mostly relies on exogenous data for price, consumption and production. 3 specific issues with reference to Gurobi are outlined below, the entire code which results in the following error, can be found at the bottom of this post.

Exception:  @error: Inequality Definition  invalid inequalities: z > x < y  at0x0000016c6b214040>  STOPPING . . . 
  1. The objective function is the sum of the costs resulting from buying/selling electricity to the grid over the entire horizon. I am used to Gurobi, which allows references to Manipulated Variables (PowerGridOut and PowerGridIn = m.MV(...)) at specific timesteps in this manner ([t]).
m.Obj(sum(ElectricityPrice[t]*PowerGridOut[t] - ElectricityPrice[t]*PowerGridIn[t]) for t in range(25)) 

Is this also possible in Gekko, or should this summation be recast as an integral? Is the following code correct?

ElectricityPrice = m.Param([..]) . . . TotalCosts = m.integral(ElectricityPrice*(PowerGridOut - PowerGridIn)) m.Obj(TotalCosts) m.options.IMODE = 6 m.solve() 
  1. Gurobi allows this formulation of the constraint to the change in state of charge of the battery:
m.addConstrs(SoC[t+1] == (SoC[t] - ((1/(DischargeEfficiency*BatteryCapacity)) * (PowerBattery Discharge[t+1]) * Delta_t - ChargeEfficiency/BatteryCapacity * (PowerBatteryCharge[t+1]) * Delta_t)) for t in range(24)) 

Based on a question on stackoverflow regarding a similar problem, I have reformulated this in a continuous manner as:

m.Equation(SoC.dt() == SoC - 1/(DischargeEfficiency*BatteryCapacity) * Pbattdis - (ChargeEfficiency/BatteryCapacity) * Pbattch) 
  1. The final key constraint should the power balance, where Demand[t] & PV[t] are exogenous vectors, while the other variables are m.MV():
m.Equation(((Demand[t] + Pbat_ch + Pgrid_in) == (PV[t] + Pgrid_out + Pbat_dis)) for t in range(25)) 

Unfortunately, all of this has not worked so far. I would highly appreciate it if someone could give me some hints. Ideally I would like to formulate both the objective function and constraints in discrete terms.

entire code

m       = GEKKO() # horizon m.time  = list(range(0,25)) # data vectors EP      = m.Param(list(Eprice)) Dem     = m.Param(list(demand)) PV      = m.Param(list(production)) # constants bat_cap = 13.5 ch_eff  = 0.94 dis_eff = 0.94 # manipulated variables Pbat_ch = m.MV(lb=0, ub=4) Pbat_ch.DCOST   = 0 Pbat_ch.STATUS  = 1 Pbat_dis = m.MV(lb=0, ub=4) Pbat_dis.DCOST  = 0 Pbat_dis.STATUS = 1 Pgrid_in = m.MV(lb=0, ub=3)     Pgrid_in.DCOST  = 0 Pgrid_in.STATUS = 1 Pgrid_out = m.MV(lb=0, ub=3)  Pgrid_out.DCOST  = 0 Pgrid_out.STATUS = 1 #State of Charge Battery SoC = m.Var(value=0.5, lb=0.2, ub=1) #Battery Balance m.Equation(SoC.dt() == SoC - 1/(dis_eff*bat_cap) * Pbat_dis - (ch_eff/bat_cap) * Pbat_ch) #Energy Balance m.Equation(((Dem[t] + Pbat_ch + Pgrid_in) == (PV[t] + Pbat_dis + Pgrid_out)) for t in range(0,25)) #Objective TC = m.Var() m.Equation(TC == sum(EP[t]*(Pgrid_out-Pgrid_in) for t in range(0,25))) m.Obj(TC) m.options.IMODE=6 m.options.NODES=3 m.options.SOLVER=3  m.solve() 
</div
           

回答リスト

0
 
vote
vote
ベストアンサー
 

素敵なアプリケーション! m.options.IMODE=3 であなた自身のすべての離散方程式をすべて書くことができます。そうします。そうします。目的または制約を含めると、指定したすべての時点に適用します。 m.options.IMODE=6 で、 [t] などのgekkoに設定インデックスを追加する必要はありません。これが単純化されたモデルです:

 <コード> from gekko import GEKKO import numpy as np  m       = GEKKO() # horizon m.time  = np.linspace(0,3,4) # data vectors EP      = m.Param([0.1,0.05,0.2,0.25]) Dem     = m.Param([10,12,9,8]) PV      = m.Param([10,11,8,10]) # constants bat_cap = 13.5 ch_eff  = 0.94 dis_eff = 0.94 # manipulated variables Pbat_ch = m.MV(lb=0, ub=4) Pbat_ch.DCOST   = 0 Pbat_ch.STATUS  = 1 Pbat_dis = m.MV(lb=0, ub=4) Pbat_dis.DCOST  = 0 Pbat_dis.STATUS = 1 Pgrid_in = m.MV(lb=0, ub=3)     Pgrid_in.DCOST  = 0 Pgrid_in.STATUS = 1 Pgrid_out = m.MV(lb=0, ub=3)  Pgrid_out.DCOST  = 0 Pgrid_out.STATUS = 1 #State of Charge Battery SoC = m.Var(value=0.5, lb=0.2, ub=1) #Battery Balance m.Equation(bat_cap * SoC.dt() == -dis_eff*Pbat_dis + ch_eff*Pbat_ch) #Energy Balance m.Equation(Dem + Pbat_ch + Pgrid_in == PV + Pbat_dis + Pgrid_out) #Objective m.Minimize(EP*Pgrid_in) # sell power at 90% of purchase (in) price m.Maximize(0.9*EP*Pgrid_out) m.options.IMODE=6 m.options.NODES=3 m.options.SOLVER=3  m.solve()   

右側から<コード> SoC を削除するために微分方程式を修正しました。そうしないと、指数関数的に増加します。エネルギーバランス差動方程式は<コード> Accumulation=In-Out です。解決策を視覚化するためのいくつかの追加のコードがあります。

バッテリ充電の状態

 <コード> import matplotlib.pyplot as plt plt.subplot(3,1,1) plt.plot(m.time,SoC.value,'b--',label='State of Charge') plt.ylabel('SoC') plt.legend() plt.subplot(3,1,2) plt.plot(m.time,Dem.value,'r--',label='Demand') plt.plot(m.time,PV.value,'k:',label='PV Production') plt.legend() plt.subplot(3,1,3) plt.plot(m.time,Pbat_ch.value,'g--',label='Battery Charge') plt.plot(m.time,Pbat_dis.value,'r:',label='Battery Discharge') plt.plot(m.time,Pgrid_in.value,'k--',label='Grid Power In') plt.plot(m.time,Pgrid_in.value,':',color='orange',label='Grid Power Out') plt.ylabel('Power') plt.legend() plt.xlabel('Time') plt.show()   
 

Nice application! You can either write out all of your discrete equations yourself with m.options.IMODE=3 or else let Gekko manage the time dimension for you. When you include an objective or constraint, it applies them to all of the time points that you specify. With m.options.IMODE=6, there is no need to add the set indices in Gekko such as [t]. Here is a simplified model:

from gekko import GEKKO import numpy as np  m       = GEKKO() # horizon m.time  = np.linspace(0,3,4) # data vectors EP      = m.Param([0.1,0.05,0.2,0.25]) Dem     = m.Param([10,12,9,8]) PV      = m.Param([10,11,8,10]) # constants bat_cap = 13.5 ch_eff  = 0.94 dis_eff = 0.94 # manipulated variables Pbat_ch = m.MV(lb=0, ub=4) Pbat_ch.DCOST   = 0 Pbat_ch.STATUS  = 1 Pbat_dis = m.MV(lb=0, ub=4) Pbat_dis.DCOST  = 0 Pbat_dis.STATUS = 1 Pgrid_in = m.MV(lb=0, ub=3)     Pgrid_in.DCOST  = 0 Pgrid_in.STATUS = 1 Pgrid_out = m.MV(lb=0, ub=3)  Pgrid_out.DCOST  = 0 Pgrid_out.STATUS = 1 #State of Charge Battery SoC = m.Var(value=0.5, lb=0.2, ub=1) #Battery Balance m.Equation(bat_cap * SoC.dt() == -dis_eff*Pbat_dis + ch_eff*Pbat_ch) #Energy Balance m.Equation(Dem + Pbat_ch + Pgrid_in == PV + Pbat_dis + Pgrid_out) #Objective m.Minimize(EP*Pgrid_in) # sell power at 90% of purchase (in) price m.Maximize(0.9*EP*Pgrid_out) m.options.IMODE=6 m.options.NODES=3 m.options.SOLVER=3  m.solve() 

I modified your differential equation to remove SoC from the right hand side, otherwise you'll get an exponential increase. The energy balance differential equation is Accumulation=In-Out. Here is some additional code to visualize the solution.

Battery State of Charge

import matplotlib.pyplot as plt plt.subplot(3,1,1) plt.plot(m.time,SoC.value,'b--',label='State of Charge') plt.ylabel('SoC') plt.legend() plt.subplot(3,1,2) plt.plot(m.time,Dem.value,'r--',label='Demand') plt.plot(m.time,PV.value,'k:',label='PV Production') plt.legend() plt.subplot(3,1,3) plt.plot(m.time,Pbat_ch.value,'g--',label='Battery Charge') plt.plot(m.time,Pbat_dis.value,'r:',label='Battery Discharge') plt.plot(m.time,Pgrid_in.value,'k--',label='Grid Power In') plt.plot(m.time,Pgrid_in.value,':',color='orange',label='Grid Power Out') plt.ylabel('Power') plt.legend() plt.xlabel('Time') plt.show() 
</div
 
 
   
   

関連する質問

3  離散時間で軌道最適化のためにGekkoを使う方法  ( How to use gekko for trajectory optimization in discrete time ) 
電池のエネルギー貯蔵システムの充電(DIS)を最適化するためにGekkoを使用しようとしています。 1時間あたりの電力価格<コード> EP 、ソーラーパネルからのエネルギー生産<コード> PV 、エネルギー需要<コード> Dem <コード>は、地平線全体(0-...

0  Simulinkを使用した離散最小磁極配置コントローラを作成する  ( Creating a discrete minimum degree pole placement controller using simulink ) 
Simulinkで離散的な最低磁極配置コントローラを実装しようとしています。コントロール則U(t)= T / R(U_C(t)) - S / R(y(t))の表現を導き出しました。 ここで、t(z)= t0 z ^ 2 + T1 z + T2、 s(z)...

0  離散選択実験 - Rの特定の組み合わせを禁止しながら最適な設計  ( Discrete choice experiment optimal designing while prohibiting certain combina ) 
製品の概念をテストし、消費者の選択を理解するために、離散選択実験(選択ベースのコンジョイント分析)。以下は属性とそのレベルです。 属性A:1,2 属性B:1,2,3,4,5 属性C:1,2,3 属性D:1,2,3,4,5,6 属性E...

1  GGPLOT2のカテゴリカル変数の特定の値をズームインする方法は?  ( How to zoom in on a specific range of values for a categorical variable in ggplo ) 
================================================================================ Error executing action `install` on resource 'pa...

0  Pythonにおける非線形ビンパッキング最適化問題の解決  ( Solving nonlinear bin packing optimization problem in python ) 
は、よく知られているビンパッキング問題から導き出された問題を解決するための直接前方の方法(例えば、一般的に使用されているソルバーを持つモジュール)です(例えば、 https://en.wikipedia.org/wiki/bin_packing_problem...

1  この離散数学の課題をどのように証明できますか?  ( How can i prove this discrete math challenge ) 
20人の質問をしたテストが300人に適用されました。私たちは少なくとも8つの質問があったことを知っています 100ヒットと少なくとも200回のヒット。何人かの学生が少なくとも11の質問権を得たことを証明してください。 ...

0  N相関Bernoulli変数の分布は何ですか?  ( What is the distribution of n correlated bernoulli variables ) 
独立したBernoulli X_1、X_2、...、X_N、最大配布はです。 y = max {x_1、x_2、ξ、x_n} ~bernoulli(1 - π_(i = 1)^n∈(1 - p_i)) しかし、ベルヌーイの相関関係のために、最大配布は何...

0  R:MLOGITを使用して、非可変の個々の代替固有の属性変数を分析できますか?  ( R can i analyze non varying across individual alternative specific attribute va ) 
私は離散選択モデリングに慣れているので、私は分析の基本的な側面を誤解しているのであれば私の謝罪。 個人固有の変数とi が代替特有の属性変数であると考えられているのは離散的な選択分析を実行したいと思います。 MLogit Vignetteから、個々の特定の変数は...

0  AnyLogicは、特定の条件に基づいてプールからのリソースをつかみます  ( Anylogic seize resource from pool based on certain conditions ) 
質問は前に尋ねられて回答されました、 AnyLogic - リソースの動的仕様をつかむために。しかし、stackoverflowの複数のトロールは私に再び同じ質問をするように要求しました。 - それを尋ねると、「答え」と見なされ、「質問」ではありません。 ...

0  離散変数の標準化または正規化?  ( Standardizing or normalizing discrete variable ) 
年齢、病気の葉の数、病気の葉の数、家族の数、子供の数、バイナリ結果を持つ予測モデルを作成したいデータフレーム内の欠席数は、これらの変数を含めて大丈夫です。他の数値連続変数を標準化または正規化プロセスにするか? またはこれらの個別変数をカテゴリ変数に分類し、それ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有