【问题标题】:Writing a program that calculates the determinant of an nxn matrix recursively编写一个递归计算nxn矩阵行列式的程序
【发布时间】:2021-09-20 03:47:48
【问题描述】:

所以我编写了一个 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 函数,问题肯定不存在

【问题讨论】:

    标签: python numpy matrix determinants


    【解决方案1】:

    问题是你在det 函数中对d 做了什么。删除它后(我还冒昧删除了 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 中的 det 函数之一进行比较

    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)
    

    作为具有最高相对误差的那个。我的猜测实际上是您的答案更好,因为原始矩阵仅包含整数,因此行列式应该是整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      相关资源
      最近更新 更多