Как исправить ошибку уравнения Python Gekko "SyntaxError: ключевое слово не может быть выражением"? - PullRequest
3 голосов
/ 27 октября 2019

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

enter image description here

from gekko import GEKKO
m = GEKKO()
x = m.Var()
y = m.Var()
m.Equation(x**2+y**2=1)
m.Equation(x=y)
m.solve()

Когда я собираю уравнения, этодает другую ошибку SyntaxError: invalid syntax.

from gekko import GEKKO
m = GEKKO()
x = m.Var()
y = m.Var()
m.Equations([x**2+y**2=1,x=y])
m.solve()

Я могу получить решение, включив уравнения в качестве целевой функции, но решающий IPOPT сообщит x=0, y=0, если я дам это начальное предположение. Когда я угадываю x=1, y=1, это дает одно из правильных решений как x=0.707, y=0.707. Я хотел бы, чтобы решатель применял эти жесткие (не мягкие) ограничения.

m.Obj((x**2+y**2-1)**2)
m.Obj((x-y)**2)

Что я могу сделать, чтобы решить эту проблему с Python Gekko?

1 Ответ

2 голосов
/ 27 октября 2019

Используйте == в своих уравнениях, как упоминал Дэвид.

from gekko import GEKKO
m = GEKKO()
x = m.Var()
y = m.Var()
m.Equation(x**2+y**2==1)
m.Equation(x==y)
m.solve()

Распространенной ошибкой при написании уравнений является использование одного знака равенства (=) вместо двойного знака равенства (==). (=) Присваивает количество справа переменной слева. (==) является оператором сравнения и используется в Gekko для построения ограничений равенства. Вы также можете использовать другие операторы, такие как (<=), (<), (>) и (> =). Не равен (! =) Не поддерживается в Gekko.

Еще одна вещь, которую следует учитывать для вашей проблемы, это то, что вы начинаете с x=0 и y=0, когда вы не даете начальное предположениес x=m.Var() и y=m.Var(). Вы можете найти одно или другое решение, начав ближе к решению, например x=m.Var(1) и y=m.Var(1), или добавив ограничения, чтобы ограничить пространство поиска как x=m.Var(lb=0) и y=m.Var(lb=0).

...