我正在為矩陣類創建一個函式,用于使用高斯消除來查找逆矩陣,該函式在大多數情況下都可以正常作業,它會出現成對出現的隨機警告,看起來像這樣
RuntimeWarning: invalid value encountered in double_scalars
RuntimeWarning: divide by zero encountered in double_scalars
問題在于我將同一行中的所有內容除以常數的行。但是,函式的第一部分已經確保矩陣中的所有樞軸元素都不會為零。我也進行了很多測驗,問題不是來自樞軸元素為零,樞軸元素是唯一用于除法的元素,所以我不明白錯誤來自哪里
def inverse(self):
if self.row != self.col:
raise ValueError("Inverse Matrices only possible with square matrices")
det = self.determinant()
if det == 0:
raise ValueError("The provided matrix does not have an Inverse")
# Makes sure that the pivot elements are not zero
inverse = Matrix.identity(self.row)
placeHolder = [[self.matrix[i, j] for j in range(self.col)] for i in range(self.row)]
for i in range(self.col):
if self.matrix[i, i] == 0:
for j in range(self.row):
if self.matrix[j, i] != 0:
for k in range(self.col):
self.matrix[i, k] = self.matrix[j, k]
inverse.matrix[i, k] = inverse.matrix[j, k]
break
# Row operations
for i in range(self.row):
constant = self.matrix[i, i]
for j in range(self.col):
self.matrix[i, j] /= constant
inverse.matrix[i, j] /= constant
row = i
while row != 0:
constant = self.matrix[row-1, i]
for j in range(self.col):
self.matrix[row-1, j] -= self.matrix[i, j] * constant
inverse.matrix[row-1, j] -= inverse.matrix[i, j] * constant
row -= 1
row = i
while row != self.row - 1:
constant = self.matrix[row 1, i]
for j in range(self.col):
self.matrix[row 1, j] -= self.matrix[i, j] * constant
inverse.matrix[row 1, j] -= inverse.matrix[i, j] * constant
row = 1
self.set(placeHolder)
return inverse
uj5u.com熱心網友回復:
雖然最初您檢查矩陣的對角元素是否非零,但這些元素會在您執行行操作時被修改,并且它們可能會變為零。矩陣行縮減的一個常見步驟是在使用它修改其他行之前檢查樞軸位置的元素是否非零,因為這無法事先確定。
作為旁注,我不知道計算行列式的函式是如何實作的,但由于浮點運算不精確,即使矩陣是奇異的,通常行列式的計算也可以給出非零值。同樣的問題也適用于矩陣的行縮減:由于舍入誤差,這些計算可能會給出錯誤的結果,奇異矩陣看起來是非奇異的,反之亦然。在數值分析中,有很多處理這些問題的考慮和方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429035.html
