python - 在 Python 中查找矩阵变为奇异的值

标签 python numpy matrix linear-algebra

让我们采用以下方阵:

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(或任何给定方阵)有效变为奇异的所有值 (A[0,0],A[0,1],...)(我使用大型矩阵)?非常感谢。

最佳答案

诀窍是使用拉普拉斯展开式来计算行列式。公式为

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'

关于python - 在 Python 中查找矩阵变为奇异的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68843130/

相关文章:

python - 外积作为字符串?

python - 生成给定开始和停止数组的范围

matlab - 查找矩阵每行中所有最大值的行/列

python - 关于 numpy 数组在 Python 中如何存储的一些困惑

matrix - 如何对矩阵中选项卡的结果进行排序

java - 编程挑战扫雷帮助 : How to check for a "*" in a 2D string array?

python - 列表数组中超出范围的列表赋值索引

python - fatal error : 'mymodule.h' file not found - Cython compile fails to find header

python - 如何定义Fabric推送到GitHub的主机?

Python:简化许多 if 语句