使用Python解决非线性方程组问题

8

我可以在Python中解决带有参数的非线性方程组吗?是否有示例或教程?在maple中,我可以轻松地完成这个任务,但是我的特定系统表达式相当复杂,复制它们非常困难。

示例:

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系统。我想求解它的稳定点(这是可行的,maple已经做过了,但它们很庞大且难以理解)。我想从这些稳定点创建更多的表达式,然后使用scipy中的优化包。因为翻译回去和翻译回来非常低效且容易出错,所以我宁愿在python中完成所有操作。

3个回答

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)


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])

我还没有测试它是否有效(我手头没有这台机器)。

1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - Mike Mertsock
1
添加了一些相关的代码,以便即使链接失效,答案也能够自立。 - Russ Ennis
这个方法可行。我确实是按照这种方式做的,本来还想编辑我的帖子。 - Islands

1

警告 我是Sage开发人员,所以我可能不会保持中立。

我不知道如何在纯Python中实现这一点,但我建议使用Sage系统,其界面是用Python编写的(实际上命令行是一个特别配置的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一起提供。

我不会使用Sage,但感谢您的回复。 - Islands
实际上,我认为Sage正在使用Scipy来解决这个方程。所以你最好直接使用Scipy。 - hivert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接