Получите все корни нелинейных уравнений с помощью GEKKO

С примером нелинейных уравнений ниже:

x+2y=0
x^2+y^2=1

довольно очевидно, что уравнение имеет 2 корня.

Корни уравнений

Однако я могу получить только 1 корень с помощью GEKKO, изменение начального значения x,y может привести к другому.

from gekko import GEKKO
m = GEKKO()

# first solution
x,y = [m.Var(1) for i in range(2)]
m.Equations([x+2*y==0,x**2+y**2==1])
m.solve(disp=False)
print(x.value,y.value)

# second solution
x.value=-1
y.value=-1
m.solve(disp=False)
print(x.value,y.value)
Solutions:
[0.894427191] [-0.4472135955]
[-0.894427191] [0.4472135955]

Как получить все корни одновременно?


person Janus Yang    schedule 24.04.2019    source источник
comment
Не забудьте показать свой код, если у вас есть вопросы о коде, который не выполняет то, что вы думали.   -  person Mike 'Pomax' Kamermans    schedule 25.04.2019
comment
Добавлен пример кода и рисунок, чтобы показать множественные корни.   -  person John Hedengren    schedule 25.04.2019


Ответы (1)


У Gekko есть решатели, которые находят локальные минимумы. Решение, которое он найдет, зависит от того, с чего вы начнете. Это также относится к fsolve или другим программам решения уравнений. Единственным исключением являются символьные решения, доступные в SymPy, однако для этого необходимо, чтобы уравнения были достаточно простыми, чтобы генерировать аналитическое решение в замкнутой форме. Вот некоторые примеры:

http://apmonitor.com/che263/index.php/Main/PythonSolveEquations

Единый корень (числовое решение):

from gekko import GEKKO
m = GEKKO()
x,y,w = [m.Var(1) for i in range(3)]
m.Equations([x**2+y**2==20,y-x**2==0,w+5-x*y==0])
m.solve(disp=False)
print(x.value,y.value,w.value)

Множественные корни (аналитическое решение):

import sympy as sym
sym.init_printing()
x,y,z = sym.symbols('x,y,z')
c1 = sym.Symbol('c1')
f = sym.Eq(2*x**2+y+z,1)
g = sym.Eq(x+2*y+z,c1)
h = sym.Eq(-2*x+y,-z)
sym.solve([f,g,h],(x,y,z))

Ответ профессора Хеденгрена из BYU из группы обсуждения по электронной почте.

person Janus Yang    schedule 24.04.2019