Write a Python function that calculates the determinant of a 4x4 matrix using Laplace’s Expansion method. The function should take a single argument, a 4x4 matrix represented as a list of lists, and return the determinant of the matrix. The elements of the matrix can be integers or floating-point numbers. Implement the function recursively to handle the computation of determinants for the 3x3 minor matrices.

Example:

  • Input:a = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
  • Output:0

这道题是使用拉普拉斯展开法来计算行列式。

比如有这样一个矩阵:

那么它的计算就是:

也就是随意选一行或一列,然后它可以展开为这一行(列)的元素,乘以去掉这一行(列)和任意一列(行)得到的cofactor的总和。而这个cofactor是相应的(n-1)方阵的行列式再乘以1或-1,也就是说它是带有方向的。

虽然有个解说,照着写代码就能解题,但还是要推一下,理解比较深刻。

4x4展开项太多,用3x3来推一下。

每一个可以拆开为3个矩阵的加和,这里按第一列来拆。然后根据行列式的平移不变性,可以把相应的行和列的其它位置变为0。

最后这三个矩阵呢,我们要对它进行平移,第一个矩阵不用平移,第二个矩阵平移一次,乘以-1,第三个矩阵平衡两次,乘以两次-1。这个乘以-1是由行列式的反对称性决定的。

所以这个行列式就变成了:

这就是这道解法给出的公式,而这个-1的几次方,就是平移了几次的操作。

所以求nxn方阵的行列式,展开后,就变成了求(n-1)x(n-1)方阵的行列式。这样子就可以用递归的形式来写。一个最基本的case,就是1x1的方阵,返回这个唯一的值即可。

import numpy as np  
  
def determinant(a):  
 m, n = a.shape  
 if m == 1:  
  return a[0,0]  
  
 res = 0  
  
 i = 0  
 b = np.delete(a, i, axis=0)  
 for j in range(n):  
  bb = np.copy(b)  
  bb = np.delete(bb, j, axis=1)  
  c = (-1)**(i+j) * determinant(bb)  
  res +=  a[i, j] * c  
    
 return res  
  
  
def determinant_4x4(matrix: list[list[int|float]]) -> float:  
 # Your recursive implementation here  
 return determinant(np.array(matrix))