簡體   English   中英

每次迭代的 Pyomo 變量的動態下限/上限

[英]Dynamic lower/upper bound of Pyomo Variable for every iteration

我想根據另一個變量的結果調整三個 pyo.Var() 的下限和上限。 變量 model.inverter_power 應該在第 i 次迭代中大於 model.inverter_power[i].lb + model.fcr_power[i] 但也小於 model.inverter_power[i].ub - 88361688.9fcr_power)5我該如何實施? 不幸的是我的想法是行不通的....

        def fcr_inverter_reduction(model, i):
                return (model.inverter_power[i] >= model.inverter_power[i].lb + model.fcr_power[i],
                        model.inverter_power[i] <= model.inverter_power[i].ub - model.fcr_power[i])

        model.fcr_inverter_rule = pyo.Constraint(model.i, rule = fcr_inverter_reduction)

我嘗試了這段代碼的各種版本,不僅這段代碼不再是線性的,所以我使用 ipopt 作為求解器但沒有找到解決方案,我收到以下錯誤消息:

  File "D:\.conda\envs\PythonEnviromentV2\lib\site-packages\pyomo\opt\base\solvers.py", line 596, in solve
    raise ApplicationError(
pyomo.common.errors.ApplicationError: Solver (ipopt) did not exit normally

如果您稍微重新表述一下,這是非常可行的。 另外,我認為不可能像您對 function 所做的那樣返回 2 個約束的元組,因此您應該將其分解……它也更清晰。

您可能可以訪問上限/下限並在約束內使用它,因為它們相對於求解器是固定的/恆定的,但我認為將您的最小值/最大值分解為參數可能更清楚。 這個作品的一些變化。

(此外,在未來,如果您發布一個完全最小的可重現示例而不是僅僅 1 行,您更有可能獲得更好的幫助/結果。)

代碼:

import pyomo.environ as pyo

model = pyo.ConcreteModel()

model.I = pyo.Set(initialize=[1,2,3])

# power parameters...
model.min_inverter = pyo.Param(model.I, initialize={1:10, 2:15, 3:22})
model.max_inverter = pyo.Param(model.I, initialize={1:55, 2:45, 3:80})

# vars...
model.inverter_power = pyo.Var(model.I)
model.fcr_power = pyo.Var(model.I)

def fcr_inverter_min(model, i):
    return model.inverter_power[i] >= model.min_inverter[i] + model.fcr_power[i]
model.fcr_inverter_rule_min = pyo.Constraint(model.I, rule=fcr_inverter_min)

def fcr_inverter_max(model, i):
    return model.inverter_power[i] <= model.max_inverter[i] - model.fcr_power[i]
model.fcr_inverter_rule_max = pyo.Constraint(model.I, rule=fcr_inverter_max)

model.pprint()

Output:

1 Set Declarations
    I : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    3 : {1, 2, 3}

2 Param Declarations
    max_inverter : Size=3, Index=I, Domain=Any, Default=None, Mutable=False
        Key : Value
          1 :    55
          2 :    45
          3 :    80
    min_inverter : Size=3, Index=I, Domain=Any, Default=None, Mutable=False
        Key : Value
          1 :    10
          2 :    15
          3 :    22

2 Var Declarations
    fcr_power : Size=3, Index=I
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          1 :  None :  None :  None : False :  True :  Reals
          2 :  None :  None :  None : False :  True :  Reals
          3 :  None :  None :  None : False :  True :  Reals
    inverter_power : Size=3, Index=I
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          1 :  None :  None :  None : False :  True :  Reals
          2 :  None :  None :  None : False :  True :  Reals
          3 :  None :  None :  None : False :  True :  Reals

2 Constraint Declarations
    fcr_inverter_rule_max : Size=3, Index=I, Active=True
        Key : Lower : Body                                    : Upper : Active
          1 :  -Inf : inverter_power[1] - (55 - fcr_power[1]) :   0.0 :   True
          2 :  -Inf : inverter_power[2] - (45 - fcr_power[2]) :   0.0 :   True
          3 :  -Inf : inverter_power[3] - (80 - fcr_power[3]) :   0.0 :   True
    fcr_inverter_rule_min : Size=3, Index=I, Active=True
        Key : Lower : Body                                  : Upper : Active
          1 :  -Inf : 10 + fcr_power[1] - inverter_power[1] :   0.0 :   True
          2 :  -Inf : 15 + fcr_power[2] - inverter_power[2] :   0.0 :   True
          3 :  -Inf : 22 + fcr_power[3] - inverter_power[3] :   0.0 :   True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM