Python入門教程: 計算范德蒙矩陣的行列式

我想, 這個教程不按照傳統的思路來寫, 畢竟實踐才是學習的最好途徑。這里在前面學習了基本的數據類型之后, 我直接跳到用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()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容