Я пытаюсь оптимизировать выбор двигателя для данной задачи, т. е. качания двойного маятника. Кажется, что 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: Error evaluating constraint 1011: can't evaluate pow'(0,0.8).





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