SciPy - 求解线性系统
在线性代数中,求解线性系统 指的是求解一个线性方程组的解。一个线性系统可以表示为如下形式 −
A . x = b
其中 −
- A 是系数矩阵。
- x 是变量向量(未知量)。
- b 是常数向量。
在 SciPy 中,求解线性系统 使用多种方法,具体取决于矩阵 A 的类型和性质。SciPy 提供了高度优化的函数,可以直接求解线性系统,或通过矩阵分解(如 LU、Cholesky、QR 等)来求解。
SciPy 求解线性系统的函数
SciPy 中求解线性系统的主要函数是 scipy.linalg.solve()。该函数用于计算方程组 Ax=b 的解 x,其中 A 是系数矩阵,b 是常数向量。
语法
以下是用于求解线性系统的函数 scipy.linalg.solve() 的语法 −
scipy.linalg.solve( a, b, sym_pos=False, lower=False, overwrite_a=False, overwrite_b=False, check_finite=True )
- a(array_like): 系数矩阵 A,必须是方阵,即行数 = 列数,在大多数情况下是非奇异的,即可逆的。
- b(array_like): 右端向量或矩阵,即 b,必须与矩阵 A 具有相同的行数。
- sym_pos(bool, optional): 如果为 True,则表示矩阵 A 是对称正定的。在这种情况下,函数会使用更高效的算法,如 Cholesky 分解。
- lower(bool, optional): 如果为 True,则表示矩阵 A 是下三角矩阵。这将降低计算成本。
- overwrite_a(bool, optional): 如果为 True,则允许在内存中覆盖输入矩阵 A 以节省空间,从而进行更快的计算,但会改变原始矩阵。
- overwrite_b(bool, optional): 如果为 True,则允许在内存中覆盖输入向量 b。
- check_finite(bool, optional): 如果为 True,则函数会检查 A 和 b 是否只包含有限数。这有助于避免数值问题,但可能会带来一些开销。
该函数返回解向量或矩阵,即满足线性系统 Ax=b 的变量值。
求解线性系统的示例
以下是使用 scipy.linalg.solve() 函数求解形状为 2 x 2 的线性方程组的示例 −
import numpy as np
from scipy.linalg import solve
# 定义矩阵 A (2x2)
A = np.array([[3, 2],
[1, 2]])
# 定义向量 b (2x1)
b = np.array([5, 5])
# 求解 Ax = b 中的 x
x = solve(A, b)
print("Solution x:", x)
以上代码的输出如下 −
Solution x: [0. 2.5]
求解非方阵的线性系统
在本示例中,我们有一个超定系统,即方程数多于未知数,我们使用最小二乘法来求解 −
import numpy as np
from scipy.linalg import solve
# 定义超定矩阵 A (3x2 矩阵)
A = np.array([[1, 2],
[2, 3],
[3, 4]])
# 定义右端向量 b
b = np.array([5, 6, 7])
# 使用最小二乘法求解
x = solve(A.T @ A, A.T @ b)
print("Least-squares solution x:", x)
以上代码的输出如下 −
Least-squares solution x: [-3. 4.]
求解奇异系统
以下示例中,我们有一个奇异矩阵,即系统没有唯一解 x + y = 1 和 x + y = 2 −
import numpy as np
from scipy.linalg import solve
# 定义一个奇异矩阵 A(行线性相关)
A = np.array([[1, 1],
[1, 1]])
# 定义右端向量 b
b = np.array([1, 2])
# 尝试求解系统 A * x = b
try:
x = solve(A, b)
print("Solution x:", x)
except Exception as e:
print(f"Error: {e}")
以上代码的输出如下 −
Error: Matrix is singular.