連立一次方程式


プログラム


  1. 連立一次方程式の解法

    def fe(a):                               # a は係数と右辺値を並べたもの
      for i in range(0, len(a)):
        prepare(a,i,i)                       # a[i][i] を 1 にする 
        for j in range(i + 1, len(a)):
          erase(a, j, i)                     # a[j][i] を消去
    
    def prepare(a, k, i):                    # a[k][i] を 1 にする
      factor = a[k][i]                       # 割る数を覚えておく
      for j in range(0, len(a[k])):
        a[k][j] = a[k][j] / factor
    
    def erase(a,j,i):                        # a[j][i] を消去 
      factor = a[j][i]                       # 掛ける数を覚えておく
      for k in range(0, len(a[j])):
        a[j][k] = a[j][k] - factor * a[i][k]
    
    import ita
    
    def bs(a):                               # a は前進消去後を想定
      n = len(a[0])-1                        # n 変数
      result = ita.array.make1d(n)
      for i in range(0, n):
        calc_result(result, a, n - i - 1)    # 後ろからi行目を使って解を計算 
      return result
    
    def calc_result(res, a, k):              # k 個目の変数値を求める
      res[k] = a[k][len(a[0]) - 1]           # まず右辺値を代入
      for j in range(k + 1, len(res)):
        res[k] = res[k] - res[j] * a[k][j]   # 既知の変数の結果を反映
    
    def solve(a):                            # a は係数と右辺値を並べたもの
      fe(a)
      return bs(a)
    
  2. 連立一次方程式のピボット選択付き前身消去

    def fe(a):                               # a は係数と右辺値を並べたもの
      for i in range(0,len(a)):
        swap(a, i, maxrow(a, i))
        prepare(a, i, i)                     # a[i][i] を 1 にする 
        for j in range(i + 1, len(a)):
          erase(a, j, i)                     # a[i][j] を消去
    

2021年12月26日作成
伊知地 宏
Copyright (C) Hiroshi Ichiji, 2021. All rights reserved.