美文网首页python 入门
Python入门教程: 计算范德蒙矩阵的行列式

Python入门教程: 计算范德蒙矩阵的行列式

作者: 破旧的大卡车 | 来源:发表于2017-11-05 16:40 被阅读22次

    我想, 这个教程不按照传统的思路来写, 毕竟实践才是学习的最好途径。这里在前面学习了基本的数据类型之后, 我直接跳到用Python来计算一个方块矩阵的行列式。题目中说的范德蒙矩阵在数学上是非常经典的范例之一, 但本程序对一般的方块矩阵也可计算。

    数学知识自动略过, 不懂的话wiki下。例如啥叫范德蒙矩阵?如何按行/列展开计算一个矩阵的行列式。

    范德蒙矩阵的生成

    我们这里给出生成范德蒙行列式的一个方法, 其中用到了list of list(即2维array)这一数据结构。

    dim = 3
    # generate Vamdemon matrix of given dim
    M = [[ (j + 1)**i for i in range(dim) ] for j in range(dim) ]
    

    看到了吗?是不是很简单?其实这里i是列标, j是行标, range(3)产生list:[0,1,2], 每个[]里用一个for循环产生相应的(i,j)元素
    [图片上传失败...(image-a379b5-1510020402646)]^i)
    故上面生成的矩阵就是:
    [图片上传失败...(image-b796f5-1510020402646)]

    矩阵维数、子矩阵、行列式

    完整的源码见后, 为了按行或列计算行列式, 我们需要:

    • subM函数, 输入一个矩阵, 以及行,列位置, 返回去掉该行该列的子矩阵
    • detM函数, 计算行列式。
      其中, 第一个ifdimM这个矩阵维数检测函数, 判断是不是一个方块矩阵。然后用一个if实行递归调用。中间有好几个注释, 都是我在写的过程中方便调试而保留的。同样, 我还用了一个sys.exit()来忽略所有它之后的代码。

    cal_det.py

    # -*- coding: utf-8 -*-
    import sys
    dim = 3
    # generate Vamdemon matrix of given dim
    M = [[ (j + 1)**i for i in range(dim) ] for j in range(dim) ]
    
    def printM(M):
        for row in M:
            for col in row:
                print(col, end=' ')
            print('\n')
    
    def dimM(M):
        dim=[1,len(M[0]),len(M[0])]
        for i in range(len(M)):
            dim[0]=len(M)
            dim[1]=min(dim[1], len(M[i]))
            dim[2]=max(dim[2], len(M[i]))
        if dim[1] == dim[2]:
            return dim[0:2]
        else:
            return dim
    
    def subM(M, row, col ):
        #return the submatrix of M by removing (row,col)
        sM=[rM.copy() for rM in M]
        del sM[row]
        for rM in sM:
            del rM[col]
        return [elm for elm in sM if elm !=[] ]
    
    def detM( M ):
        if dimM(M)[0] != dimM(M)[1] or len(dimM(M)) != 2:
            return 'Please give a square matrix!'
        if len(M) ==1:
            return M[0][0]
        else:
            expandM=0
            for i in range(len(M)):
                # print('The matrix is:\n')
                # printM(M)
                # print('(row, col)=: ',(i+1,1), '\nSub Matrix of ', (i+1,1), ': \n')
                # printM(subM(M,i,0))
                expandM +=(-1)**(i)*M[i][0]*detM(subM(M, i, 0))
            return expandM
    
    #print(dimM(M))
    #print(subM(M, 1,1))
    printM(M)
    print('The determinate of above matrix is:')
    print(detM(M))
    print('Test of the error detection (must square matrix):')
    print(detM([[1],[1,2]]))
    sys.exit()
    

    相关文章

      网友评论

        本文标题:Python入门教程: 计算范德蒙矩阵的行列式

        本文链接:https://www.haomeiwen.com/subject/bsxhmxtx.html