Отклик с задержкой в ​​Pyomo - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь смоделировать систему DAE с несколькими ODE, одна из которых (контроллер) показывает огромную задержку во времени по сравнению с шкалой времени моделирования. Как мне реализовать это в Pyomo (не считая других пакетов, уже реализованных с Gekko, но поскольку исходный код apm.exe не выпущен как открытый исходный код, более не учитывая пакет для моих приложений).

В настоящее время я заявил проблема как:

odeu = lambda m, t: tau * m.dudt[t] - (m.spu[t] - m.u[t]) == 0
model.odeu = Constraint(model.t, rule=lambda m, t: odeu(m, t))

И то, что я пытаюсь создать, выглядит примерно так: В настоящее время я сформулировал проблему как:

odeu = lambda m, t: tau * m.dudt[t] - (m.spu[t-tde] - m.u[t]) == 0
model.odeu = Constraint(model.t, rule=lambda m, t: odeu(m, t))

Проблема в том, что Pyomo дискретизирует уравнения и использовать странную индексацию с плавающей запятой вместо локальных оценок (что требуется для оптимизации, конечно, только странная для меня индексация с плавающей запятой), поэтому индекс t-tde не существует.

Я считал поиск на каждом шаге индекса, ближайшего к этой точке, но это экспоненциально увеличит время моих вычислений.

Спасибо!

1 Ответ

0 голосов
/ 20 июня 2020

Пара очков ...

Во-первых, это неверный код. Я не уверен, что такое последний сегмент, но вы не можете добавить позиционный аргумент после названных, и неясно, что вы пытаетесь сделать с t:ode(m, t):

Constraint(model.t, rule=lambda m, t: odeu(m, t))

Pyomo выполняет вычисление выражений для индексов набора, и пока он попадает в набор, вы GTG. Я не совсем понимаю, что вы имеете в виду под «индексированием с плавающей запятой». Я думаю, вы ищете что-то вроде этого, где у вас есть временной индекс и некоторое смещение, которое вам нужно использовать в некоторых ограничениях:

# set with lag

from pyomo.environ import * 

mdl = ConcreteModel()    
mdl.t = Set(initialize=range(5))    # a set index for time    
mdl.x = Var(mdl.t)                  # a toy variable

tde = 2                             # some offset

# make constraint
def c1(mdl, t):
    if t - tde < 0:                 # out of bounds
        return Constraint.Skip
    return mdl.x[t - tde] <= 10
mdl.c1 = Constraint(mdl.t, rule=c1)

mdl.pprint()

дает модель с соответствующими ограничениями ...

1 Set Declarations
    t : Dim=0, Dimen=1, Size=5, Domain=None, Ordered=False, Bounds=(0, 4)
        [0, 1, 2, 3, 4]

1 Var Declarations
    x : Size=5, Index=t
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          0 :  None :  None :  None : False :  True :  Reals
          1 :  None :  None :  None : False :  True :  Reals
          2 :  None :  None :  None : False :  True :  Reals
          3 :  None :  None :  None : False :  True :  Reals
          4 :  None :  None :  None : False :  True :  Reals

1 Constraint Declarations
    c1 : Size=3, Index=t, Active=True
        Key : Lower : Body : Upper : Active
          2 :  -Inf : x[0] :  10.0 :   True
          3 :  -Inf : x[1] :  10.0 :   True
          4 :  -Inf : x[2] :  10.0 :   True

3 Declarations: t x c1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...