ガウス・ザイデル法

今回はガウス・ザイデル法をやった。ヤコビ法を改良した感じ。次のサイトを参考にした。
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

ヤコビ法より反復回数が半分近く減っている。