ガウス・ザイデル法備忘録 [数値解析]

特徴

ガウス・ザイデル法ではk+1回目の反復時の解の算出にk回目に算出された解を用いる. 例えばxの3行目を解を出す時は1,2行目までに算出された解を反復式に代入するイメージ.

f:id:takaishi78:20191108165014j:plain

ヤコビ法との違い

ヤコビ法では右辺の解は更新されてないが,ガウス・ザイデル法では上記の理由で右辺の解が更新されていることが違う点

プログラム

また下のコードだとi=0の時はまだ解(x[0], x[1], x[2])は更新されてない.i=1になるとx[0]がk+1番目の解に更新されている

#Gauss-Seidel
coef_mat = np.array([[3,2,1],[1,4,1],[2,2,5]])
y = np.array([10, 12, 21])
convergence_value = 10 ** -16
dim = len(y)

x = np.zeros(dim)
before_x = np.zeros(dim)
loss_sum = 0
count = 0


while True:
  for i in range(dim):
    before_x[i] = x[i]
    x[i] = (y[i] - coef_mat[i][(i+1)%dim]*x[(i+1)%dim] - coef_mat[i][(i+2)%dim]*x[(i+2)%dim]) / coef_mat[i][i]

  loss_sum = 0.0
  
  
  for i in range(dim):
    loss_sum += abs(before_x[i] - x[i])
  
  if loss_sum < convergence_value:
    break
  
  print("No."+str(count))
  count+=1
  for i in range(dim):
    print(x[i])

具体的なイメージ

数学的というよりかは現実世界での事柄に合わせて自分のイメージでガウス・ザイデル法とヤコビ法の違いを説明する.なにか事件が起きた際に犯人を特定するみたいなことがある.それに対してガウス・ザイデル法では一人の探偵かなんかが怪しい人を調査していってその情報を元に次に怪しいやつを探して最終的に犯人(解)にたどり着くって感じ.それに対してヤコビ法では複数人の探偵で別々に怪しい人を探しいてその日の晩にみんなでミーティングして次の日また怪しいやつを探してみたいな感じで犯人(解)を特定するみたいな感じ.この説明がわかりやすいかわかりにくかは知らない...