如何在 SymPy 中求解线性方程组?
How can I solve system of linear equations in SymPy?
抱歉,我对 sympy 还很陌生,python 总的来说。
我想求解以下欠定线性方程组:
x + y + z = 1
x + y + 2z = 3
SymPy 最近得到了一个新的线性系统求解器:linsolve
in sympy.solvers.solveset
,您可以按如下方式使用它:
In [38]: from sympy import *
In [39]: from sympy.solvers.solveset import linsolve
In [40]: x, y, z = symbols('x, y, z')
方程式列表:
In [41]: linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
Out[41]: {(-y - 1, y, 2)}
增广矩阵形式:
In [59]: linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))
Out[59]: {(-y - 1, y, 2)}
A*x = b 表格
In [59]: M = Matrix(((1, 1, 1, 1), (1, 1, 2, 3)))
In [60]: system = A, b = M[:, :-1], M[:, -1]
In [61]: linsolve(system, x, y, z)
Out[61]: {(-y - 1, y, 2)}
注意:解的顺序对应给定符号的顺序。
你可以用矩阵形式求解Ax=b
(在这种情况下是一个欠定系统,但我们可以使用solve_linear_system
):
from sympy import Matrix, solve_linear_system
x, y, z = symbols('x, y, z')
A = Matrix(( (1, 1, 1, 1), (1, 1, 2, 3) ))
solve_linear_system(A, x, y, z)
{x: -y - 1, z: 2}
或重写为(我的编辑,不是同情):
[x]= [-1] [-1]
[y]= y[1] + [0]
[z]= [0] [2]
对于正方形 A
我们可以定义 b
并使用 A.LUsolve(b)
.
除了@AMiT Kumar 和@Scott 给出的出色答案之外,SymPy 1.0 还添加了更多功能。对于欠定的线性方程组,我在下面尝试并在不深入 sympy.solvers.solveset
的情况下让它工作。话虽这么说,如果好奇心引导你去那里。
from sympy import *
x, y, z = symbols('x, y, z')
eq1 = x + y + z
eq2 = x + y + 2*z
solve([eq1-1, eq2-3], (x, y,z))
这给了我 {z: 2, x: -y - 1}
。
再一次,很棒的软件包,SymPy 开发人员!
关于矩阵线性系统方程的另一个例子,假设我们正在求解这个系统:
在 SymPy
中我们可以这样做:
>>> import sympy as sy
... sy.init_printing()
>>> a, b, c, d = sy.symbols('a b c d')
... A = sy.Matrix([[a-b, b+c],[3*d + c, 2*a - 4*d]])
... A
⎡ a - b b + c ⎤
⎢ ⎥
⎣c + 3⋅d 2⋅a - 4⋅d⎦
>>> B = sy.Matrix([[8, 1],[7, 6]])
... B
⎡8 1⎤
⎢ ⎥
⎣7 6⎦
>>> A - B
⎡ a - b - 8 b + c - 1 ⎤
⎢ ⎥
⎣c + 3⋅d - 7 2⋅a - 4⋅d - 6⎦
>>> sy.solve(A - B, (a, b, c, d))
{a: 5, b: -3, c: 4, d: 1}
import sympy as sp
x, y, z = sp.symbols('x, y, z')
eq1 = sp.Eq(x + y + z, 1) # x + y + z = 1
eq2 = sp.Eq(x + y + 2 * z, 3) # x + y + 2z = 3
ans = sp.solve((eq1, eq2), (x, y, z))
这与@PaulDong 的回答类似,只是做了一些小改动
- 习惯不使用
import *
(numpy 有很多类似的功能)是个好习惯
- 使用
sp.Eq()
定义等式会在以后产生更清晰的代码
抱歉,我对 sympy 还很陌生,python 总的来说。
我想求解以下欠定线性方程组:
x + y + z = 1
x + y + 2z = 3
SymPy 最近得到了一个新的线性系统求解器:linsolve
in sympy.solvers.solveset
,您可以按如下方式使用它:
In [38]: from sympy import *
In [39]: from sympy.solvers.solveset import linsolve
In [40]: x, y, z = symbols('x, y, z')
方程式列表:
In [41]: linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
Out[41]: {(-y - 1, y, 2)}
增广矩阵形式:
In [59]: linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))
Out[59]: {(-y - 1, y, 2)}
A*x = b 表格
In [59]: M = Matrix(((1, 1, 1, 1), (1, 1, 2, 3)))
In [60]: system = A, b = M[:, :-1], M[:, -1]
In [61]: linsolve(system, x, y, z)
Out[61]: {(-y - 1, y, 2)}
注意:解的顺序对应给定符号的顺序。
你可以用矩阵形式求解Ax=b
(在这种情况下是一个欠定系统,但我们可以使用solve_linear_system
):
from sympy import Matrix, solve_linear_system
x, y, z = symbols('x, y, z')
A = Matrix(( (1, 1, 1, 1), (1, 1, 2, 3) ))
solve_linear_system(A, x, y, z)
{x: -y - 1, z: 2}
或重写为(我的编辑,不是同情):
[x]= [-1] [-1]
[y]= y[1] + [0]
[z]= [0] [2]
对于正方形 A
我们可以定义 b
并使用 A.LUsolve(b)
.
除了@AMiT Kumar 和@Scott 给出的出色答案之外,SymPy 1.0 还添加了更多功能。对于欠定的线性方程组,我在下面尝试并在不深入 sympy.solvers.solveset
的情况下让它工作。话虽这么说,如果好奇心引导你去那里。
from sympy import *
x, y, z = symbols('x, y, z')
eq1 = x + y + z
eq2 = x + y + 2*z
solve([eq1-1, eq2-3], (x, y,z))
这给了我 {z: 2, x: -y - 1}
。
再一次,很棒的软件包,SymPy 开发人员!
关于矩阵线性系统方程的另一个例子,假设我们正在求解这个系统:
在 SymPy
中我们可以这样做:
>>> import sympy as sy
... sy.init_printing()
>>> a, b, c, d = sy.symbols('a b c d')
... A = sy.Matrix([[a-b, b+c],[3*d + c, 2*a - 4*d]])
... A
⎡ a - b b + c ⎤
⎢ ⎥
⎣c + 3⋅d 2⋅a - 4⋅d⎦
>>> B = sy.Matrix([[8, 1],[7, 6]])
... B
⎡8 1⎤
⎢ ⎥
⎣7 6⎦
>>> A - B
⎡ a - b - 8 b + c - 1 ⎤
⎢ ⎥
⎣c + 3⋅d - 7 2⋅a - 4⋅d - 6⎦
>>> sy.solve(A - B, (a, b, c, d))
{a: 5, b: -3, c: 4, d: 1}
import sympy as sp
x, y, z = sp.symbols('x, y, z')
eq1 = sp.Eq(x + y + z, 1) # x + y + z = 1
eq2 = sp.Eq(x + y + 2 * z, 3) # x + y + 2z = 3
ans = sp.solve((eq1, eq2), (x, y, z))
这与@PaulDong 的回答类似,只是做了一些小改动
- 习惯不使用
import *
(numpy 有很多类似的功能)是个好习惯 - 使用
sp.Eq()
定义等式会在以后产生更清晰的代码