掃き出し法

線形代数でおなじみ掃き出し法をやってみた。

def hakidashi(matrix, dim):
    for i in range(dim):
        num = matrix[i][i]
        for j in range(dim + 1):
            matrix[i][j] = matrix[i][j] / num
        for j in range(dim):
            if i == j:
                pass
            else:
                a = matrix[j][i]
                for k in range(i, dim + 1):
                    matrix[j][k] = matrix[j][k]- a * matrix[i][k]
        print matrix

def main():
    dim = 3    #次元
    matrix = []
    num = []
    for line in open('data.dat'):
        item = line.split(' ')
        for i in item:
            num.append(int(i))
        matrix.append(num)
        num = []
    hakidashi(matrix, dim)
    print matrix

if __name__ == '__main__':
    main()

例として使ったdata.datの中身はこんな感じ。

1 -4 3 -1
1 -5 2 2
1 -1 1 0

実行結果。

>>> 
[[1, -4, 3, -1], [0, -1, -1, 3], [0, 3, -2, 1]]
[[1, 0, 7, -13], [0, 1, 1, -3], [0, 0, -5, 10]]
[[1, 0, 0, 1], [0, 1, 0, -1], [0, 0, 1, -2]]
[[1, 0, 0, 1], [0, 1, 0, -1], [0, 0, 1, -2]]

見づらいけどうまくいっていることがわかる。
ちなみにピボットとかは考慮していない。