Как определить интеграл как целевую функцию в pyomo?

Я хочу иметь возможность определить интеграл в pyomo как часть целевой функции.

Я не могу понять, какое выражение нужно для интеграла.
Вот мое лучшее предположение:

model = ConcreteModel()
model.t = ContinuousSet(bounds = (0,1))
model.y = Var(model.t)
model.dydt = DerivativeVar(model.y, wrt=(model.t))

def myintegral(model,i):
    return model.dydt[i]

model.n = Integral(model.t, wrt=model.t, rule=myintegral)  # this line is the trouble

def myobjective(model):
     return model.n

model.obj = Objective(rule=myobjective)

Ошибка: TypeError: A callable type that is not a Pyomo expression can not be used to initialize an Expression object. Use 'rule' to initalize with function types.

Но я не понимаю, почему выражение внутри интеграла является проблемой, поскольку эти переменные кажутся полностью индексируемыми индексом model.t:

# but, this is totally fine:  
print model.dydt[0]
print model.dydt[1]

Я что-то неправильно понимаю в этом?

Вот некоторые ресурсы, с которыми я консультировался до сих пор:

https://groups.google.com/forum/#!topic/pyomo-forum/6RhEXEMDTPc https://software.sandia.gov/downloads/pub/pyomo/PyomoOnlineDocs.html#_parameters https://projects.coin-or.org/Coopr/browser/pyomo/trunk/examples/dae/Heat_Conduction.py?rev=9315

Я открыт для предложений/ссылок на другие ресурсы о pyomo.


person makansij    schedule 07.10.2016    source источник


Ответы (2)


Гейб прав, это действительно ошибка в классе Integral, и она была исправлена ​​в репозитории github. Еще одна ошибка в вашем примере модели — это спецификация компонента Objective. Вы должны использовать ключевое слово «rule» вместо «expr».

def myobjective(model):
     return model.n
model.obj = Objective(rule=myobjective)

Кроме того, я хочу повторить кое-что, упомянутое в онлайн-документации для pyomo.dae. Компонент Integral является прототипом и не полностью разработан. Я не рекомендую использовать его для сложных интегралов или моделей, требующих высокой точности решения. Класс Integral использует правило трапеций для численного интегрирования. Я бы рекомендовал преобразовать любые интегралы в вашей задаче в дифференциальные уравнения и решить их, используя предоставленные автоматические преобразования дискретизации.

person Bethany Nicholson    schedule 10.10.2016
comment
привет @BethanyNicholson, это было исправлено в новой версии pyommo? - person makansij; 29.05.2017
comment
Да, эта ошибка исправлена ​​в самой последней версии Pyomo. - person Bethany Nicholson; 30.05.2017
comment
Итак, как преобразовать интегралы в дифференциальные уравнения? @BethanyNicholson, есть предложения по этому поводу? - person makansij; 14.06.2017
comment
Для этого нет автоматической инфраструктуры, вам придется переформулировать модель вручную. Посмотрите здесь: gauravtiwari.org/2014/12/20/integral-дифференциал- уравнения - person Bethany Nicholson; 14.06.2017

Это похоже на ошибку. Вы должны открыть билет здесь: https://github.com/Pyomo/pyomo/issues

person Gabe Hackebeil    schedule 07.10.2016
comment
Может быть, вы можете показать мне пример действительного интегрального выражения? Откуда ты знаешь, что это ошибка? - person makansij; 07.10.2016
comment
Извините, у меня нет примеров, в которых используется Integral. Возможно, кто-то из сопровождающих pyomo.dae присоединится позже. - person Gabe Hackebeil; 07.10.2016
comment
Однако я уверен, что компонент Integral неправильно вызывает конструктор базового класса, поэтому вам следует открыть тикет, чтобы убедиться, что разработчик этого пакета знает о проблеме. - person Gabe Hackebeil; 07.10.2016