Как реализовать Math.pow () внутри оптимизации pyomo-ipopt?

Я пытаюсь оптимизировать выбор двигателя для данной задачи, т.е. качание двойного маятника. Кажется, что ipopt не решает проблему, потому что не распознает

Я пытался реализовать math.pow (), но делаю это

Код:

from math import pow

def _epsilon_max(M,n):
    return M.epsilon_max[n]* pow(M.ratio_motor[n],0.8) -1== 0   
m.epsilon_max_cons = Constraint(m.dofs,rule=_epsilon_max) 

Выход:

TypeError: неявное преобразование типа Pyomo NumericValue `ratio_motor [1] 'в число с плавающей запятой отключено. Эта ошибка часто является результатом использования компонентов Pyomo в качестве аргументов одной из функций встроенного математического модуля Python при определении выражений. Избегайте этой ошибки, используя математические функции, предоставляемые Pyomo.

Вместо использования реализованной функции pow работает только для целых чисел.

Код:

def _epsilon_max(M,n):
    return M.epsilon_max[n]*(M.ratio_motor[n])**0.8 -1== 0   
m.epsilon_max_cons = Constraint(m.dofs,rule=_epsilon_max)

Выход:

Ipopt 3.12.11: Ошибка при оценке ограничения 1011: невозможно оценить pow '(0,0.8).


person g.mazzaglia    schedule 30.01.2019    source источник


Ответы (1)


Проблема заключается в ошибке оценки модели, а не в том, что у вас не может быть дробной экспоненты. Вам нужно инициализировать M.ratio_motor[n] значением, отличным от 0. Вторая реализация с использованием функции pow, реализованной Pyomo, в остальном верна.

person Bethany Nicholson    schedule 30.01.2019