ガウス・ザイデル法
今回はガウス・ザイデル法をやった。ヤコビ法を改良した感じ。次のサイトを参考にした。
・dfltweb1.onamae.com – このドメインはお名前.comで取得されています。
import math def g(matrix, dim): count = 0 check = 1.0e-10 oldx = [] for i in range(dim): oldx.append(0.0) #解の初期値。とりあえず0に設定する。 newx = oldx[:] while True: error = [] if count == 10000: print('Error.') break for i in range(dim): newx[i] = matrix[i][-1] for j in range(dim): if j != i: #この辺がヤコビ法と違うところ。 if j < i: newx[i] -= matrix[i][j] * newx[j] else: newx[i] -= matrix[i][j] * oldx[j] newx[i] /= matrix[i][i] for i in range(dim): error.append(math.fabs(oldx[i] - newx[i])) count += 1 if max(error) < check: print('Count: %d' % count) return newx oldx = newx[:] 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 print('Dimensions: %d' % dim) ans = g(matrix, dim) for i in ans: print(i) if __name__ == '__main__': main()
matrix.txtの中身。
1 -1 1 5 1 2 0 1 2 0 3 9
実行結果。
Dimensions: 3 Count: 16 3.0 -1.0 0.999999999997
同じ方程式をを解の初期値はすべて0、誤差は1.0e-10未満と設定(今回の例と同じ)してヤコビ法で解くと、
Dimensions: 3 Count: 30 2.99999999999 -1.00000000001 0.999999999983
ヤコビ法より反復回数が半分近く減っている。