簡體   English   中英

用python求解非線性方程組

[英]Solving system of nonlinear equations with python

我可以用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中完成所有工作而不是來回翻譯,因為它效率很低而且可以犯錯誤。

重申@ 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個可能元組。

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

我沒有測試它是否有效(我沒有把它用在這台機器上)。

警告我是一個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已經附帶了鼠尾草。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM