ガウスの消去法

# -*- coding: UTF-8 -*-
from math import *

############################################
# 線形連立方程式を解く(逆行列を求める)
#      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 range(0, n) :

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

			for i2 in range(m1, nm) :
				w[i1][i2] *= y1

			for i2 in range(0, n) :
				if i2 != i1 :
					for i3 in range(m1, nm) :
						w[i2][i3] -= (w[i2][i1] * w[i1][i3])

	return ind

----------------------------------

# -*- coding: UTF-8 -*-
import numpy as np
from function import gauss

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

			# データの設定
eps = 1.0e-10
n   = 2
m   = 2
w   = np.array([[2, 1, 1, 0], [1, 1, 0, 1]], np.float)
# w = np.array([[2.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 1.0]]) でもOK
# w = np.array([[2, 1, 1, 0], [1, 1, 0, 1]]) はだめ
# w = [[2, 1, 1, 0], [1, 1, 0, 1]] でもOK
			# 実行と出力
ind = gauss(w, n, m, eps)

print("ind = " + str(ind))
print("     " + str(w[0][2]) + " " + str(w[0][3]))
print("     " + str(w[1][2]) + " " + str(w[1][3]))