【问题标题】:Determinate of a Singular 4x4 matrix is non zero using numpy det使用 numpy det 的奇异 4x4 矩阵的行列式不为零
【发布时间】:2020-09-06 17:10:48
【问题描述】:

我正在尝试使用 np.linalg.det([A]) 计算 (4x4) 矩阵 A 的行列式

这里的A定义如下

    import numpy as np
    A = np.array([
            [1, 3, 1, 2],
            [5, 8, 5, 3],
            [0, 4, 0, 0],
            [2, 3, 2, 8]
        ], dtype=np.float_)

如果我运行这个

np.linalg.det([A])

我得到的值是array([-4.4408921e-15]),这在我看来似乎是错误的。 因为从我对奇异矩阵的理解来看,矩阵 A 的第 1 列和第 3 列是相同的,如果列相同,我应该将 det 值设为 0,但在这里我得到一个非零值,我错过了什么?

【问题讨论】:

  • 根据您的系统,4e-15 非常小,可以算作精度错误。
  • 是这样..因为当我采取 dtype=int32/16 时我仍然得到 -4.4408921 x 10^-15 ,我希望这是正常的。
  • 行列式不是整数运算,无论你的数据类型是什么,它都会被转换为浮点数。
  • 从来没有这样想过,感谢您的洞察力,这回答了我的问题。

标签: python python-3.x numpy matrix


【解决方案1】:

这可能是因为准确性。试试float64

import numpy as np

A = np.array([
        [1, 3, 1, 2],
        [5, 8, 5, 3],
        [0, 4, 0, 0],
        [2, 3, 2, 8]
    ], dtype=np.float64)

np.linalg.det([A])

【讨论】:

    【解决方案2】:

    #编写一个客户函数来查找确定性

    def det_mat(m1): 
        if (len(m1)!=len(m1[0])): 
            return "Error this is not a square matrix"
         elif (len(m1) == 2):
            return (m1[0][0]*m1[1][1] - m1[0][1]*m1[1][0])
         elif (len(m1) == 3):
          # | m00 m01 m02|          
          # | m10 m11 m12 | 
          # | m20 m21 m22 |
              a=  m1[0][0]* (m1[1][1]* m1[2][2] - m1[2][1]* m1[1][2]) 
              b=  m1[0][1]* (m1[1][0]* m1[2][2] - m1[2][0]*m1[1][2]) 
              c=  m1[0][2]* (m1[1][0]* m1[2][1] - m1[2][0]*m1[1][1])                     
              return(a-b+c)     
        elif (len(m1) == 4):
         # |m00 m01 m02 m03|          
         # |m10 m11 m12 m13| 
         # |m20 m21 m22 m23|
         #| m30 m31 m32 m33|
            a1=0
            a2=0
            a3=0 
            a4=0   
            a1= m1[0][0]* (m1[1][1]* (m1[2][2]* m1[3][3] - m1[3][2]* m1[2][3]) - m1[1][2]* (m1[2][1]* m1[3][3] - m1[3][1]*m1[2][3])+  m1[1][3]* (m1[2][1]* m1[3][2] - m1[3][1]*m1[2][2]))
         print(a1)   
            a2= m1[0][1]* (m1[1][0]* (m1[2][2]* m1[3][3] - m1[3][2]* m1[2][3]) - m1[1][2]* (m1[2][0]* m1[3][3] - m1[3][0]*m1[2][3])+ m1[1][3]* (m1[2][0]* m1[3][2] - m1[3][0]*m1[2][2])) 
         #print(a2)   
            a3= m1[0][2]* (m1[1][0]* (m1[2][1]* m1[3][3] - m1[3][1]* m1[2][3]) - m1[1][1]* (m1[2][0]* m1[3][3] - m1[3][0]*m1[2][3])+  m1[1][3]* (m1[2][0]* m1[3][1] - m1[3][0]*m1[2][1])) 
          #print(a3)   
            a4= m1[0][3]* (m1[1][0]* (m1[2][1]* m1[3][2] - m1[3][1]* m1[2][2]) - m1[1][1]* (m1[2][0]* m1[3][2] - m1[3][0]*m1[2][2])+  m1[1][2]* (m1[2][0]* m1[3][1] - m1[3][0]*m1[2][1]))
         #print(a4)
         return a1-a2+a3-a4   
    

    【讨论】:

    • bb = [[1, 3, 1, 2], [5, 8, 5, 3], [0, 4, 0, 0], [2, 3, 2, 8] ]
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多