如何用NumPy/LinAlg区分线性方程组无解与无穷多解
区分线性方程组无解与无穷多解的方法
当系数矩阵行列式为0时,要区分方程组是无解还是有无穷多解,核心是比较系数矩阵的秩和增广矩阵的秩:
- 若两者秩相等,方程组存在无穷多解
- 若系数矩阵秩小于增广矩阵秩,方程组无解
原代码
import numpy as np from sympy import * from scipy.linalg import solve a = float(input("Enter coefficient a: ")) b = float(input("Enter coefficient b: ")) c = float(input("Enter coefficient c: ")) d = float(input("Enter coefficient d: ")) e = float(input("Enter coefficient e: ")) f = float(input("Enter coefficient f: ")) g = float(input("Enter coefficient g: ")) h = float(input("Enter coefficient h: ")) i = float(input("Enter coefficient i: ")) j = float(input("Enter coefficient j: ")) k = float(input("Enter coefficient k: ")) l = float(input("Enter coefficient l: ")) A = np.array([[a, b, c], [e, f, g], [i, j, k]]) b = np.array([d, h, l]) if (np.linalg.det(A)) != 0: print(np.linalg.solve(A, b)) elif (np.linalg.det(A)) == 0: print("Infinite or no solutions")
修改后的代码
利用np.linalg.matrix_rank计算秩,同时处理浮点数精度问题,避免误判:
import numpy as np # 输入12个系数 a = float(input("Enter coefficient a: ")) b = float(input("Enter coefficient b: ")) c = float(input("Enter coefficient c: ")) d = float(input("Enter coefficient d: ")) e = float(input("Enter coefficient e: ")) f = float(input("Enter coefficient f: ")) g = float(input("Enter coefficient g: ")) h = float(input("Enter coefficient h: ")) i = float(input("Enter coefficient i: ")) j = float(input("Enter coefficient j: ")) k = float(input("Enter coefficient k: ")) l = float(input("Enter coefficient l: ")) A = np.array([[a, b, c], [e, f, g], [i, j, k]]) b_vec = np.array([d, h, l]) # 处理浮点数精度,用绝对值判断行列式是否接近0 det_A = np.linalg.det(A) tolerance = 1e-9 if abs(det_A) > tolerance: print("方程组有唯一解:", np.linalg.solve(A, b_vec)) else: # 构造增广矩阵 augmented_matrix = np.column_stack((A, b_vec)) # 计算系数矩阵与增广矩阵的秩 rank_A = np.linalg.matrix_rank(A, tol=tolerance) rank_augmented = np.linalg.matrix_rank(augmented_matrix, tol=tolerance) if rank_A == rank_augmented: print("方程组有无穷多解") else: print("方程组无解")
关键说明
- 浮点数精度处理:直接判断
det(A) == 0会因浮点数计算误差出错,改用绝对值与小容差(如1e-9)比较 - 秩的计算:
np.linalg.matrix_rank支持指定容差,确保秩的计算不受微小数值误差干扰 - 增广矩阵构造:用
np.column_stack将系数矩阵和常数项列合并,得到完整的增广矩阵
内容的提问来源于stack exchange,提问作者Thrylin
相关产品推荐
相关产品推荐

