下面有一个非线性方程的例子:
x+2y=0
x^2+y^2=1
很明显,等式有2个根。
但是,使用GEKKO我只能获得1个根,更改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]
如何同时获得所有根?
答案 0 :(得分:2)
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的Hedengren教授的电子邮件讨论组的答案。