cod*_*key -1 python numpy pycharm
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
Run Code Online (Sandbox Code Playgroud)
为什么这会抛出错误?我的同事使用了不同的 IDE(我使用 PyCharm,他们使用 Anaconda),程序运行没有问题。此错误与 IDE 相关吗?
这不依赖于 IDE。您的A矩阵是奇异的,其奇异值之一等于零。这意味着它的行列式等于零。当你乘以A得到B的矩阵也是奇异的,然后你乘以C得到E。这意味着它E也是奇异的(如果将两个矩阵相乘并且至少其中一个是奇异的,则结果始终是奇异的)。E我们可以通过查看的奇异值来确认这一点
print(np.linalg.svd(E)[1])
Run Code Online (Sandbox Code Playgroud)
在我的机器上打印
[3.14537743e+03 9.15629385e-01 9.92880407e-17]
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个奇异值基本上为零。
然后你尝试求解系统Ex = D,但由于E是奇异的,你会得到错误numpy.linalg.LinAlgError: Singular matrix。请注意,由于E是 3x3,因此您正在尝试求解 3x3 线性方程组。由于只有 2 个不同于零的奇异值,因此矩阵秩为 2。这意味着相应的线性系统有 3 个变量,但只有两个方程。因此你没有唯一的解决方案并且np.linalg.solve失败了。
你的线性系统实际上有无限的解。虽然您不能取 的逆E,但您仍然可以求解该系统以找到解决方案之一。一种常见的方法是使用最小二乘法。不是用Ex = D最小二乘法求解,而是找到x最小化 的平方范数 2 的Ex - D。您可以使用 numpy 计算为
[3.14537743e+03 9.15629385e-01 9.92880407e-17]
Run Code Online (Sandbox Code Playgroud)
我们无法确认这是一种解决方案
print(E@x)
Run Code Online (Sandbox Code Playgroud)
打印
[[1.]
[2.]
[3.]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13864 次 |
| 最近记录: |