所以我写了一个python程序来计算nxn矩阵的行列式。 它适用于 3x3 矩阵,但是当我尝试输入 4x4 矩阵时,它给了我疯狂的值,甚至不接近正确的值,所以我想知道您是否可以告诉我我的代码哪里错了
import numpy as np
n = int(input('size:'))
mat = np.zeros((n,n))
d = 0
ep = 0
for i in range(n):
for j in range(n):
ep = int(input('mat[{},{}]='.format(i,j)))
mat[i,j] = ep
def submat(l,i,p):
m = []
sub = np.zeros((np.shape(l)[0]-1,np.shape(l)[0]-1))
for j in range(np.shape(l)[0]):
for k in range(np.shape(l)[0]):
if k == p or j == i:
continue
else:
m.append(l[j][k])
for j in range(np.shape(sub)[0]):
for k in range(np.shape(sub)[0]):
sub[j][k] = m[0]
m.remove(m[0])
return sub
def det(l,d):
if np.shape(l) == (2,2):
return l[0,0]*l[1,1] - l[1,0]*l[0,1]
elif np.shape(l) == (1,1):
return l[0,0]
else:
for i in range(np.shape(l)[0]):
print(d)
d += l[i][0]*((-1)**(i))*det(submat(l,i,0),d)
return d
p.s : 我检查了我写的 submat 函数,问题肯定不存在
答案 0 :(得分:0)
问题在于您对 d
函数中的 det
做了什么。删除它后(我也冒昧删除了 2x2 特例,因为拉普拉斯扩展也适用于此)我有
def det(l):
d = 0
if np.shape(l) == (1,1):
return l[0,0]
else:
for i in range(np.shape(l)[0]):
d += l[i][0]*((-1)**(i))*det(submat(l,i,0))
return d
现在我将您的结果与 numpy.linalg
maximum = 0
argmax = None
for _ in range(10**4):
n = 4
mat = np.random.randint(100,10000,n**2).reshape(n,n)
relative_error = np.abs((det(mat)-np.linalg.det(mat))/np.linalg.det(mat))
if relative_error > maximum:
maximum = relative_error
argmax = mat
maximum,np.linalg.det(argmax)-det(argmax),np.linalg.det(argmax),det(argmax)
并得到
(1.5070856755023637e-12, -0.24884033203125, 165113593789.75116, 165113593790.0)
作为相对误差最高的那个。我的猜测实际上是您的答案更好,因为原始矩阵仅包含整数,因此行列式应该是整数。