各行にコメントを付けつつ、一行づつの理解に務めましたが、意味が分かりませんでした。
ガウスの消去法を利用して行列式と逆行列を求めるコードのはずで、実行した所、動作はしています。
Python
1# Taken from https://rosettacode.org/wiki/Gaussian_elimination#Python 2# which includes examples of how to run, including how to do this with fractions instead of floating point 3# The 'gauss' function takes two matrices, 'a' and 'b', with 'a' square, and it return the determinant of 'a' and a matrix 'x' such that a*x = b. 4# If 'b' is the identity, then 'x' is the inverse of 'a'. 5 6import copy 7from fractions import Fraction 8from pprint import pprint 9 10# first, what are the inputs to this? Matrix a&b 11# what are the outputs? det(a),x ...a*x=b if b=I you can invert a 12# what assumptions are made? A is regular, the number of rows of A, and that of B is the same. 13def gauss(a, b): 14 a = copy.deepcopy(a) 15 b = copy.deepcopy(b) 16 n = len(a)# row (=column) number of A 17 p = len(b[0]) # column number of B 18 det = 1 19 #phase 1:make this into row echelon from 20 #doing row operation on both a and b as we go 21 for i in range(n - 1): #0~最後から2番めまでの各列について 22 k = i 23 for j in range(i + 1, n): 24 if abs(a[j][i]) > abs(a[k][i]): 25 k = j # k <=i行の(i,i)よりしたの行の絶対値が最も大きいもの行数 26 if k != i: # 絶対値(i,i)が最大ではなかった場合 27 a[i], a[k] = a[k], a[i] # 絶対値(i,i)を最大にする 28 b[i], b[k] = b[k], b[i] #スワップ 29 det = -det #det 1 => -1 => 1 30 # woke down a column, creating zeros 31 for j in range(i + 1, n): #i+1行以降のある行(「J」とおく) 32 t = a[j][i]/a[i][i] #I列のI行でJ行を割る 33 for k in range(i + 1, n): #(以降はJ行について)i列以降の各列(kとおく)について 34 a[j][k] -= t*a[i][k] #AのJ行i+1以降各列から引く(内容:t*a[i][k])i行K列×t 35 for k in range(p): 36 b[j][k] -= t*b[i][k] #BのJ行各列から引く(内容:t*b[i][k]) 37 38 for i in range(n - 1, -1, -1):# 逆range (全範囲) 39 for j in range(i + 1, n): 40 t = a[i][j] 41 for k in range(p): 42 b[i][k] -= t*b[j][k] 43 t = 1/a[i][i] 44 det *= a[i][i] 45 for j in range(p): 46 b[i][j] *= t 47 return det, b
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/29 17:51
2021/08/18 14:33