2016-11-09 88 views
1

該函數可以準確地計算1x1,2x2和3x3行列式,但它會給出高階行列式的錯誤值。我在思考函數中的部分存在問題,我稱之爲函數(遞歸)來解決低階行列式作爲解決方案的一部分。如何解決我設計的解決決定因素的功能?

我懷疑它與變量局部性有關,但我不確定爲什麼這會是一個問題,因爲我認爲局部性是自動的。

順便說一句,這是Python 2。

代碼:

def is_Det(matrix): 
    isdet = True 
    if not isinstance(matrix,list): # Is this actually a list? 
     isdet = False 
    for i in matrix: 
     if isinstance(i,list): # Things in matrix are lists? 
      if len(i) == len(matrix): # Square shape? 
       for j in i: # All numbers? 
        try: 
         j = float(j) 
        except ValueError: 
         isdet = False 
      else: 
       isdet = False 
     else: 
      isdet = False 
    return isdet 

def det_Disp(matrix): 
    if is_Det(matrix): 
     pass 
    else: 
     print "Error: Input not a determinant, cannot display" 

def det_Eval(matrix): 
    print matrix 
    except StandardError: 
     print "No such value" 
    if is_Det(matrix): 
     if len(matrix) == 1: # 1x1 determinant 
      print matrix[0][0] 
      return matrix[0][0] 
     elif len(matrix) == 2: # 2x2 determinant 
      print matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] 
      return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] 
     else: 
      longdet = matrix # Expands higher-order determinant 
      for row1 in longdet: 
       for col1 in range(0,len(matrix)-1): 
        row1.append(row1[col1]) 
      value = 0 
      for col2 in range(0,len(matrix)): # Recurse determinant value 
       subdet = [] 
       for row2 in range(1,len(matrix)): 
        subsubdet = [] 
        for col3 in range(col2+1,col2+len(matrix)): 
         subsubdet.append(longdet[row2][col3]) 
        '''print "Subsubdet:", 
        print subsubdet #***************************''' 
        subdet.append(subsubdet) 
        '''# print "Subdet", 
        print "Subdet:", 
        print subdet #***************************''' 
       value += longdet[0][col2] * det_Eval(subdet) 
       ##########print value 
       '''#print longdet[1][col2], 
       #print det_Eval(subdet), 
       #print value 
      # print longdet''' 
      return value 
    else: 
     print "Error: Input not a determinant, cannot evaluate" 

#print det_Eval([[2,3],[4,9]]) 
#print det_Eval([[6,1,8],[9,9,9],[9,7,4]]) 
print det_Eval([[8,9,2,3],[4,6,1,8],[9,9,9,9],[1,9,7,4]]) 
+0

請確保您的代碼實際上是正確的:'StandardError:'除外的行將失敗。 – Evert

+2

有什麼理由你不使用'numpy.linalg.det()'? – Evert

+0

對不起,我從代碼中刪除了這一行,但我想我在我發佈它時意外地將它留在了這裏。 –

回答

2

在這一行處理未成年人:

value += longdet[0][col2] * det_Eval(subdet) 

你不採取標誌考慮 - sign depends on parity of index of the first line element(COL2)

+0

等一下,但我認爲公式中的符號更改僅適用於刪除列並試圖評估留下的未成年人?爲什麼我不能表達未成年人作爲將採取積極係數的決定因素? –

+0

在wiki中查看3x3示例 – MBo