python - 在 Python 中查找矩阵变为奇异的值
问题描述
让我们采用以下方阵:
import numpy as np
A = np.array([[10.0, -498.0],
[-2.0, 100.0]])
如果 A 的行列式 (A[0,0]*A[1,1]-A[0,1]*A[1,0]) 为零,则 A 将是奇异的。例如,如果 A[0,1] 取值 -500.0(其他所有内容不变),则 A 将是单数:
from sympy import symbols, Eq, solve
y = symbols('y')
eq = Eq(A[0,0]*A[1,1]-y*A[1,0])
sol = solve(eq)
sol
如何找到所有值(A[0,0],A[0,1],...),其中 A(或任何给定的方阵)有效地变为奇异(我使用大型矩阵)?提前谢谢了。
解决方案
诀窍是使用拉普拉斯展开来计算行列式。公式是
det(A) = sum (-1)^(i+j) * a_ij * M_ij
所以要使矩阵奇异,你只需要使用上面的公式,将主题更改为 a_ij 并设置 det(A) = 0。可以这样做:
import numpy as np
def cofactor(A, i, j):
A = np.delete(A, (i), axis=0)
A = np.delete(A, (j), axis=1)
return (-1)**(i+j) * np.linalg.det(A)
def make_singular(A, I, J):
n = A.shape[0]
s = 0
for i in range(n):
if i != J:
s += A[I, i] * cofactor(A, I, i)
M = cofactor(A, I, J)
if M == 0:
return 'No solution'
else:
return -s / M
测试:
>>> M = np.array([[10.0, -498.0],
[-2.0, 100.0]])
>>> make_singular(M, 0, 1)
-500.0000000000002
>>> M = np.array([[10.0, -498.0],
[0, 100.0]])
>>> make_singular(M, 0, 1)
'No solution'