ヤコビ法(連立方程式)
ヤコビ法をやってみた。固有値を求める方ではなく連立方程式を解く方の。
次のサイトを参考にした。
・http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal2/node13.html
import math def jacobi(a, b, oldx): newx = [0.0,0.0,0.0,0.0] d = len(oldx) count = 0 check = 1.0e-20 while True: error = [] if count == 10000: #収束しなかった場合はここでループを抜ける print('Error.') break for j in range(d): newx[j] = b[j] for k in range(d): if k != j: newx[j] -= a[j][k] * oldx[k] newx[j] = newx[j] / a[j][j] for j in range(d): error.append(math.fabs(oldx[j] - newx[j])) #それぞれの誤差をリストにまとめる oldx[j] = newx[j] count += 1 if max(error) < check: #リスト内で一番大きいのが設定値より低くなったら計算終了 print('Count: %d' % count) return def main(): a = [[9.0,2.0,1.0,1.0],[2.0,8.0,-2.0,1.0],[-1.0,-2.0,7.0,-2.0],[1.0,-1.0,-2.0,6.0]] #係数行列 b = [20,16,8,17] #各式の解 ans = [0.0, 0.0, 0.0, 0.0] #結果を入れるリスト jacobi(a, b, ans) print ans if __name__ == '__main__': main()
実行結果はこちら。
Count: 48 [1.0, 2.0, 3.0, 4.0]