大学院情報処理演習 第 4 回 (行列の直接解法) 「部分 pivot 選択」 講義ノート目次

今までの例では、0 、あるいは 0 に近い小さな数で割らないような例を扱う場合だけであった(正則行列)。 pivot 行の先頭のある列全てが 0 の場合に計算を止め、また、 pivot にする行 a(k,k) をそれより下の列からなる部分列 (l,k)(l = k, .. , i) で最大の値を取るものを使用することに変更したい。 この際、本来 pivot にした行と、探し出した行を交換することにする。

選択的に大きな数で割るので、除算による誤差が少なくなる。

  
  pp = Array.new
  for l in i .. mat.length - 1
    pp << mat[l][i]
  end
  if pp.rindex(pp.sort.pop) != 0
    mat = r_mat(mat, i, pp.rindex(pp.sort.pop) + i)
  end