用python求解非线性方程组

时间:2014-03-03 20:27:33

标签: python python-2.7 mathematical-optimization polynomial-math

我可以用python中的参数来解决非线性方程组吗?有示例或教程吗?我可以很容易地用枫木做到这一点,但我的特定系统的表达式非常大,复制它们非常困难。

示例:

sigma*(y-x) = 0
x*(rho-z)-y = 0
x*y-beta*z = 0

你应该得到解决方案:

[[x = 0, y = 0, z = 0], [x = sqrt(beta*rho-beta), y = sqrt(beta*rho-beta), z = rho-1],
[x = -sqrt(beta*rho-beta), y = -sqrt(beta*rho-beta), z = rho-1]]

我问的原因是:我有一个庞大的非线性ODE系统。我想解决固定点(这是可行的,它是用枫木完成的,但它们很大而且很难看)。我想从固定点创建更多表达式,然后在scipy中使用优化包。我宁愿在python中做这一切,也不是来回翻译事物,因为效率非常低,可以犯错误。

3 个答案:

答案 0 :(得分:6)

重申@ Russ的回答,这可以在sympy中轻松完成。例如:

In [1]: import sympy as sp
In [2]: x, y, z = sp.symbols('x, y, z')
In [3]: rho, sigma, beta = sp.symbols('rho, sigma, beta')
In [4]: f1 = sigma * (y - x)
In [5]: f2 = x * (rho - z) - y
In [6]: f3 = x * y - beta * z
In [7]: sp.solvers.solve((f1, f2, f3), (x, y, z))
Out[7]: 
[(0, 0, 0),
 (-sqrt(beta*rho - beta), -sqrt(beta*(rho - 1)), rho - 1),
 (sqrt(beta*rho - beta), sqrt(beta*(rho - 1)), rho - 1)]

其中输出格式是(x, y, z)的可能值的3个可能元组。

答案 1 :(得分:1)

SymPy可能有所帮助;我不知道解决非线性方程有多好:http://scipy-lectures.github.io/advanced/sympy.html#id23

您应该能够执行类似的代码(以下链接的示例):

from sympy import *
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
beta = Symbol('beta')
rho = Symbol('rho')
sigma = Symbol('sigma')

solve([sigma*(y-x), x*(rho-z)-y, x*y-beta*z], [x, y, z])

我没有测试它是否有效(我没有把它用在这台机器上)。

答案 2 :(得分:1)

警告我是Sage开发者,所以我可能不会中立。

我不知道如何在纯Python中执行此操作,但我建议使用其接口在Python中的Sage system(实际上命令行是一个专门配置的IPython)并允许执行以下操作:

+--------------------------------------------------------------------+
| Sage Version 5.10, Release Date: 2013-06-17                        |
| Type "notebook()" for the browser-based notebook interface.        |
| Type "help()" for help.                                            |
+--------------------------------------------------------------------+
sage: var("sigma y x rho beta z")
(sigma, y, x, rho, beta, z)
sage: sys = [sigma*(y-x), x*(rho-z)-y, x*y-beta*z]
sage: solve(sys, x, y, z)
[[x == sqrt(beta*rho - beta), y == (beta*rho - beta)/(sqrt(rho - 1)*sqrt(beta)), z == rho - 1], [x == -sqrt(beta*rho - beta), y == -(beta*rho - beta)/(sqrt(rho - 1)*sqrt(beta)), z == rho - 1], [x == 0, y == 0, z == 0]]

通常更容易使用:

sage: solve(sys, x, y, z, solution_dict=True)
[{z: rho - 1,
  x: sqrt(beta*rho - beta),
  y: (beta*rho - beta)/(sqrt(rho - 1)*sqrt(beta))},
 {z: rho - 1,
  x: -sqrt(beta*rho - beta),
  y: -(beta*rho - beta)/(sqrt(rho - 1)*sqrt(beta))},
 {z: 0, x: 0, y: 0}]

主要缺点是Sage是数学软件的完整发行版,它提供了自己的Python解释器(以及用C / C ++,Cython,lisp,fortran等多种语言编写的大量其他内容),并且出了名的很难要安装,如果你想使用自己的口译员。

对于你的问题来说,一个好消息是Scipy已经附带了sage。