当前位置: 首页 > 图灵资讯 > 行业资讯> 如何利用Python NumPy的linalg子模块求解线性方程组?

如何利用Python NumPy的linalg子模块求解线性方程组?

来源:图灵python
时间: 2026-08-11 21:57:44
应优先使用 np.linalg.solve(A, b) 解决线性方程组 $Ax = b$,因为它是基于带主元的 LU 分解,比 np.linalg.inv(A) @ b 更快、更稳定;要求 A 为方阵而满,b 形状需要匹配,否则抛出 LinAlgError。

numpy.linalg.solve 是求解形如 Ax = b 线性方程组最直接、最推荐的前提是 A 是方阵,不奇怪(可逆)。不要使用它。 inv 手动计算逆矩阵-慢,数值不稳定,也容易出错。

该用什么时候? numpy.linalg.solve

你手头有一个清晰的系数矩阵 Andarray,形状为 (n, n))常数向量和右侧 b(形状为 (n,)(n, 1)),目标是寻求唯一的解决方案 x。这是最常见、最干净的场景。

  • A 必须是二维、方阵;b 必须是一维或列向量(shape == (n,)(n, 1)
  • 如果 A 接近奇怪(条件数很大),solve 会发出 LinAlgWarning,但不会报错——结果可能严重失真,必须自行检查 np.linalg.cond(A)
  • 它内部调用 LAPACK 的 dgesv(双精度)等例程,比手动 np.linalg.inv(A) @ b 快 2–3 倍,精度也更高
遇到 LinAlgError: Singular matrix 怎么办?

说明 A 不可逆转,方程组没有唯一的解决方案:要么没有解决方案,要么有无限的解决方案。此时, solve 直接抛异常,不要给你模糊的结果。

  • 先用 np.linalg.matrix_rank(A) 看秩序;再比较一下 A.shape[0] —— 如果秩序不足,就不会满足方阵
  • 想要最小的二乘解(即使不满),改用 np.linalg.lstsq(A, b, rcond=None),它返回解,残差,秩,奇异值
  • 若确定为欠定(变量大于方程),并且想要一个特定的解决方案(如范数最小),lstsq 默认情况下返回最小二乘最小范数解;也可以使用 np.linalg.pinv(A) @ b,但更慢
np.linalg.solvenp.linalg.lstsq 参数有什么区别?

这两种输入看起来很相似,但语义和默认行为不同,混用时容易误解结果。

Python 3.14.2

Python 3.14.2是Python编程语言于2025年12月5日发布的稳定版本,属于3.14系列的第二次维护更新。该版本包含18个修复项目,重点解决多过程、数据和正则表达模块的回归问题,修复CVE-2025-12084等安全漏洞。这个版本标志着Python发展的一个重要里程碑,即自由线程模式(删除GIL)正式得到官方支持。

下载

立即学习“Python免费学习笔记(深入);

  • solve(A, b):严格要求 A 可逆,只回到唯一的解决方案 xb 必须能够广播成匹配的形状
  • lstsq(A, b, rcond=None):不要求 A 方阵或满秩;回到四元组,第一个是解;rcond 控制奇异值截断,默认情况下 None(即机器精度),设置为 -1 可禁用警告
  • A 正好方阵满了,两者的结果在数值误差内是一致的;但是 lstsq 多一步 SVD 分解,成本更高

实际编写代码时,先使用 solve;报错后再切 lstsq 并检查返回的秩序和残差。不要一开始就默认使用 lstsq——它解决了更广泛的问题和更高的成本。