【问题标题】:numpy.linalg.LinAlgError: Singular matrix Error When Trying to Solvenumpy.linalg.LinAlgError:尝试求解时出现奇异矩阵错误
【发布时间】:2021-02-08 02:50:08
【问题描述】:
import numpy as np

A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
B = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
C = np.array([[1, 2, 3], [4, 5, 6]])
D = np.array([[1], [2], [3]])

prod_AB = np.matmul(A, B)
E = np.matmul(prod_AB, C)

x = np.linalg.solve(E, D)

Traceback (most recent call last):
  File "C:/Users/Owner.ASUS-DESKTOP/Documents/ENGR 102/Lab 10/test.py", line 11, in <module>
    x = np.linalg.solve(E, D)
  File "<__array_function__ internals>", line 5, in solve
  File "C:\Users\Owner.ASUS-DESKTOP\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\linalg\linalg.py", line 394, in solve
    r = gufunc(a, b, signature=signature, extobj=extobj)
  File "C:\Users\Owner.ASUS-DESKTOP\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\linalg\linalg.py", line 88, in _raise_linalgerror_singular
    raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix

为什么会抛出错误?我的同事使用了不同的 IDE(我使用的是 PyCharm,他们使用的是 Anaconda)并且程序运行没有问题。此错误是否与 IDE 相关?

【问题讨论】:

    标签: python numpy pycharm


    【解决方案1】:

    这不依赖于 IDE。您的 A 矩阵是奇异的,其中一个奇异值等于零。这意味着它的行列式等于零。当你将AB 相乘时,得到的矩阵也是奇异矩阵,然后你乘以C 得到E。这意味着E 也是单数(如果将两个矩阵相乘并且其中至少一个是单数,则结果始终是单数)。我们可以通过查看E 的奇异值来确认这一点

    print(np.linalg.svd(E)[1])
    

    在我的机器上打印

    [3.14537743e+03 9.15629385e-01 9.92880407e-17]
    

    注意最后一个奇异值基本上为零。

    然后您尝试解决系统Ex = D,但由于E 是单数,您会得到numpy.linalg.LinAlgError: Singular matrix 错误。请注意,由于E 是 3x3,因此您正在尝试求解 3x3 线性方程组。由于您只有 2 个不同于零的奇异值,因此矩阵秩为 2。这意味着您对应的线性系统有 3 个变量,但只有 两个方程。因此,您没有唯一的解决方案,np.linalg.solve 失败。


    你的线性系统实际上有无限解。虽然您无法取反 E,但您仍然可以求解系统以找到其中一个解决方案。一种常见的方法是使用least squares 的方法。最小二乘法不是求解Ex = D,而是找到使Ex - D 的平方范数2 最小化的x。你可以用 numpy as 计算

    x = np.linalg.lstsq(E, D, rcond=None)[0]
    

    我们无法确认这是一种解决方案

    print(E@x)
    

    打印出来的

    [[1.]
     [2.]
     [3.]]
    

    【讨论】:

    • 这很容易验证,因为 det(A . B) = det(A) 。检测(B)。如果第一个行列式为 0,则一直传播到最后。
    【解决方案2】:

    诊断的第一步是打印违规值,即E 及其行列式:

    [[ 290  400  510]
     [ 674  928 1182]
     [1058 1456 1854]]
    0.0
    

    矩阵是奇异的,所以不能求逆;要么没有解决方案,要么有无穷多个。

    我们无法回答为什么你的同学会得到不同的答案,因为你没有提供他们的解决方案数据。

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2019-02-20
      相关资源
      最近更新 更多