質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1071閲覧

Pythonで行列式と逆行列を求めるコードの意味の全体像が理解できず困っております

qyoeku

総合スコア25

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/29 10:37

編集2021/05/29 10:39

各行にコメントを付けつつ、一行づつの理解に務めましたが、意味が分かりませんでした。
ガウスの消去法を利用して行列式と逆行列を求めるコードのはずで、実行した所、動作はしています。

Python

1# Taken from https://rosettacode.org/wiki/Gaussian_elimination#Python 2# which includes examples of how to run, including how to do this with fractions instead of floating point 3# The 'gauss' function takes two matrices, 'a' and 'b', with 'a' square, and it return the determinant of 'a' and a matrix 'x' such that a*x = b. 4# If 'b' is the identity, then 'x' is the inverse of 'a'. 5 6import copy 7from fractions import Fraction 8from pprint import pprint 9 10# first, what are the inputs to this? Matrix a&b 11# what are the outputs? det(a),x ...a*x=b if b=I you can invert a 12# what assumptions are made? A is regular, the number of rows of A, and that of B is the same. 13def gauss(a, b): 14 a = copy.deepcopy(a) 15 b = copy.deepcopy(b) 16 n = len(a)# row (=column) number of A 17 p = len(b[0]) # column number of B 18 det = 1 19 #phase 1:make this into row echelon from 20 #doing row operation on both a and b as we go 21 for i in range(n - 1): #0~最後から2番めまでの各列について 22 k = i 23 for j in range(i + 1, n): 24 if abs(a[j][i]) > abs(a[k][i]): 25 k = j # k <=i行の(i,i)よりしたの行の絶対値が最も大きいもの行数 26 if k != i: # 絶対値(i,i)が最大ではなかった場合 27 a[i], a[k] = a[k], a[i] # 絶対値(i,i)を最大にする 28 b[i], b[k] = b[k], b[i] #スワップ 29 det = -det #det 1 => -1 => 1 30 # woke down a column, creating zeros 31 for j in range(i + 1, n): #i+1行以降のある行(「J」とおく) 32 t = a[j][i]/a[i][i] #I列のI行でJ行を割る 33 for k in range(i + 1, n): #(以降はJ行について)i列以降の各列(kとおく)について 34 a[j][k] -= t*a[i][k] #AのJ行i+1以降各列から引く(内容:t*a[i][k])i行K列×t 35 for k in range(p): 36 b[j][k] -= t*b[i][k] #BのJ行各列から引く(内容:t*b[i][k]) 37 38 for i in range(n - 1, -1, -1):# 逆range (全範囲) 39 for j in range(i + 1, n): 40 t = a[i][j] 41 for k in range(p): 42 b[i][k] -= t*b[j][k] 43 t = 1/a[i][i] 44 det *= a[i][i] 45 for j in range(p): 46 b[i][j] *= t 47 return det, b

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こういうのはソースコードから理解するよりも、ガウスの消去法をよく理解してからコードを読むものです。

まず、ガウスの消去法による連立一次方程式の解き方を読みましょう。
ご質問のコードでいうと、
for i in range(n - 1): が前進消去
for i in range(n - 1, -1, -1): が後退代入です。

数学的にはこれで良いのですが、コンピュータの場合には浮動小数の精度(桁落ち)の問題があるので、絶対値の大きい行を選ぶというのをやります。これをピボッティングとかピボットといいます。
この処理をやっているのが、absを使っているあたりのループです。

以上を頭に入れて読めば分かるはずです。分からない場合は再度ガウスの消去法による連立一次方程式の解き方を読みましょう。

投稿2021/05/29 11:16

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qyoeku

2021/05/29 17:51

ありがとうございます。見てみます!
qyoeku

2021/08/18 14:33

ご返事遅くなってしまいすみません????いろいろ紆余曲折あったのですが、解決しました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問