SciPy 怎么求解线性方程组?

文章导读
Previous Quiz Next 在线性代数中,求解线性系统 指的是求解一个线性方程组的解。一个线性系统可以表示为如下形式 −
📋 目录
  1. SciPy 求解线性系统的函数
  2. 求解线性系统的示例
  3. 求解非方阵的线性系统
  4. 求解奇异系统
A A

SciPy - 求解线性系统



Previous
Quiz
Next

在线性代数中,求解线性系统 指的是求解一个线性方程组的解。一个线性系统可以表示为如下形式 −

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 = 1x + 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.