# -*- 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]))