繁体   English   中英

使用 GEKKO 获取非线性方程的所有根

[英]Get all roots of nonlinear equations by using GEKKO

下面以非线性方程为例:

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

很明显方程有两个根。

方程的根

但是,我用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]

如何同时获得所有根?

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教授来自电子邮件讨论组的回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM