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

#python #pyomo

#python #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 /#!тема/pyomo-форум/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 .

Ответ №1:

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

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

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

Комментарии:

1. привет @BethanyNicholson, это было исправлено в новой версии pyommo?

2. Да, эта ошибка исправлена в последнем выпуске Pyomo

3. Итак, как мне преобразовать интегралы в дифференциальные уравнения? @BethanyNicholson, есть предложения по этому поводу?

4. Для этого нет автоматической инфраструктуры, вам придется переформулировать вашу модель вручную. Посмотрите здесь: gauravtiwari.org/2014/12/20/integral-differential-equations

Ответ №2:

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

Комментарии:

1. Возможно, вы можете показать мне пример допустимого интегрального выражения? Откуда вы знаете, что это ошибка?

2. Извините, у меня нет примеров, которые используют Integral . Возможно, один из сопровождающих pyomo.dae подключится позже.

3. Однако я уверен, что Integral компонент неправильно вызывает конструктор базового класса, поэтому вам следует открыть тикет, чтобы убедиться, что разработчик этого пакета знает о проблеме.