LU分解
そういえばLU分解やってなかった事に気づいたのでやってみた。つぎのサイトを参考にした。
・http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal1/node32.html
・LU分解 - [物理のかぎしっぽ]
import copy def lu(matrix, dim): up = copy.deepcopy(matrix) #元のmatrixを壊さないためにコピーする low = [] #下三角行列を作る(最初は対角成分のみ1で他は0) for i in range(dim): tmp = [] for j in range(dim): if i == j: tmp.append(1.0) else: tmp.append(0.0) low.append(tmp) for i in range(dim): #ここからLU分解 p = up[i][i] for j in range(i+1, dim): q = up[j][i] low[j][i] = q / p for k in range(dim): up[j][k] -= up[i][k] * q / p return up, low def main(): dim = 0 matrix = [] num = [] for line in open('matrix.txt'): item = line.split(' ') for i in item: num.append(float(i)) matrix.append(num) num = [] dim += 1 u, l = lu(matrix, dim) for i in u: print i print('\n') for i in l: print i if __name__ == '__main__': main()
例としてこんな感じのmatrix.txtを用意した。
1 1 0 3 2 1 -1 1 3 -1 -1 2 -1 2 3 -1
実行結果はこちら。
[1.0, 1.0, 0.0, 3.0] [0.0, -1.0, -1.0, -5.0] [0.0, 0.0, 3.0, 13.0] [0.0, 0.0, 0.0, -13.0] [1.0, 0.0, 0.0, 0.0] [2.0, 1.0, 0.0, 0.0] [3.0, 4.0, 1.0, 0.0] [-1.0, -3.0, 0.0, 1.0]
上半分が上三角行列、下半分が下三角行列。