如何在SymPy中求解线性方程组?

Ani*_*Vij 22 python math sympy

对不起,我对sympy和python很新.

我想解决以下欠定线性方程组:

x + y + z = 1 
x + y + 2z = 3
Run Code Online (Sandbox Code Playgroud)

Ami*_*mar 28

SymPy最近得到了一个新的线性系统求解器:linsolvesympy.solvers.solveset,你可以使用如下:

In [38]: from sympy import *

In [39]: from sympy.solvers.solveset import linsolve

In [40]: x, y, z = symbols('x, y, z')
Run Code Online (Sandbox Code Playgroud)

方程列表形式:

In [41]: linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
Out[41]: {(-y - 1, y, 2)}
Run Code Online (Sandbox Code Playgroud)

增强矩阵形式:

In [59]: linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))
Out[59]: {(-y - 1, y, 2)}
Run Code Online (Sandbox Code Playgroud)

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)}
Run Code Online (Sandbox Code Playgroud)

注意:解决方案顺序对应给定符号的顺序.

  • 应该注意,linsolve在任何版本中都不可用.目前只能通过开发版本访问. (3认同)

Pau*_*ong 11

除了@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))
Run Code Online (Sandbox Code Playgroud)

这给了我{z: 2, x: -y - 1}.再次,伟大的包,SymPy开发人员!


Ali*_*i80 11

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))
Run Code Online (Sandbox Code Playgroud)

这类似于@PaulDong 的回答,但有一些细微的变化

  1. 习惯不使用是一个好习惯import *(numpy 有很多类似的功能)
  2. 定义方程,sp.Eq()稍后会产生更清晰的代码

  • 添加进一步的解释将帮助读者理解为什么您的答案比其他答案更好,并使他们能够投票给您。使用 [edit] 功能扩展您的答案。 (2认同)

Azi*_*lto 5

矩阵线性系统方程的另一个例子,假设我们正在求解该系统:

\n\n

在此输入图像描述

\n\n

我们SymPy可以做这样的事情:

\n\n
>>> import sympy as sy\n... sy.init_printing()\n\n>>> a, b, c, d = sy.symbols(\'a b c d\')\n... A = sy.Matrix([[a-b, b+c],[3*d + c, 2*a - 4*d]])\n... A\n\n\xe2\x8e\xa1 a - b     b + c  \xe2\x8e\xa4\n\xe2\x8e\xa2                  \xe2\x8e\xa5\n\xe2\x8e\xa3c + 3\xe2\x8b\x85d  2\xe2\x8b\x85a - 4\xe2\x8b\x85d\xe2\x8e\xa6\n\n\n>>> B = sy.Matrix([[8, 1],[7, 6]])\n... B\n\n\xe2\x8e\xa18  1\xe2\x8e\xa4\n\xe2\x8e\xa2    \xe2\x8e\xa5\n\xe2\x8e\xa37  6\xe2\x8e\xa6\n\n\n>>> A - B\n\n\xe2\x8e\xa1 a - b - 8     b + c - 1  \xe2\x8e\xa4\n\xe2\x8e\xa2                          \xe2\x8e\xa5\n\xe2\x8e\xa3c + 3\xe2\x8b\x85d - 7  2\xe2\x8b\x85a - 4\xe2\x8b\x85d - 6\xe2\x8e\xa6\n\n\n>>> sy.solve(A - B, (a, b, c, d))\n{a: 5, b: -3, c: 4, d: 1}\n
Run Code Online (Sandbox Code Playgroud)\n