ガウスの消去法

############################################
# 線形連立方程式を解く(逆行列を求める)
#      w : 方程式の左辺及び右辺
#      n : 方程式の数
#      m : 方程式の右辺の列の数
#      eps : 逆行列の存在を判定する規準
#      return : =0 : 正常
#               =1 : 逆行列が存在しない
#      coded by Y.Suganuma
############################################

def gauss(w, n, m, eps)

	nm  = n + m;
	ind = 0

	for i1 in 0 ... n

		y1 = 0.0
		m1 = i1 + 1
		m2 = 0
					# ピボット要素の選択
		for i2 in i1 ... n
			y2 = w[i2][i1].abs()
			if y1 < y2
				y1 = y2
				m2 = i2
			end
		end
					# 逆行列が存在しない
		if y1 < eps
			ind = 1
			break
					# 逆行列が存在する
		else   # 行の入れ替え
			for i2 in i1 ... nm
				y1        = w[i1][i2]
				w[i1][i2] = w[m2][i2]
				w[m2][i2] = y1
			end
						# 掃き出し操作
			y1 = 1.0 / w[i1][i1]

			for i2 in m1 ... nm
				w[i1][i2] *= y1
			end

			for i2 in 0 ... n
				if i2 != i1
					for i3 in m1 ... nm
						w[i2][i3] -= (w[i2][i1] * w[i1][i3])
					end
				end
			end
		end
	end

	return ind
end

############################################
# 逆行列の計算
#      例: 2 1
#           1 1
#      coded by Y.Suganuma 
############################################

			# データの設定
eps = 1.0e-10
n   = 2
m   = 2
w   = Array[[2.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 1.0]]
			# 実行と出力
ind = gauss(w, n, m, eps)

printf("ind = %d\n", ind)
printf("     %f %f\n", w[0][2], w[0][3])
printf("     %f %f\n", w[1][2], w[1][3])