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