#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
компонент неправильно вызывает конструктор базового класса, поэтому вам следует открыть тикет, чтобы убедиться, что разработчик этого пакета знает о проблеме.