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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

解決済

2回答

4428閲覧

pythonで逆行列を作成したいです。

murazun

総合スコア11

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2017/10/19 14:45

###前提・実現したいこと
初めての質問です。
jupyterにてpython2を使用して逆行列を作成し、元の行列と掛け算を行い、単位行列を作成するプログラムを作成しました。
2*2行列を作成し、例として[[1,2],[3,4]]を動かしました。

###発生している問題
実行したところ以下の結果が得られました。

A= [[-2. 1. ] [ 1.5 -0.5]] array([[ 1.00000000e+00, 0.00000000e+00], [ 8.88178420e-16, 1.00000000e+00]])

しかし、[[1,2],[3,4]]以外の行列ではできるのですが、この行列と逆行列の計算だけはできません。

###該当のソースコード

import numpy as np from numpy.linalg import inv A=np.array([[1,2],[3,4]]) inv_A=inv(A) print "A=" print inv_A # check np.dot(A,inv_A)

###試したこと
他の行列では逆行列と掛け算はできました。

###補足情報(言語/FW/ツール等のバージョンなど)
今まではC言語を使用していて、pythonでプログラムを動かすのは初めてです。細かい部分の指摘をもらえると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

8.88178420e-16は、8.8割る10の16乗のことで、計算誤差とみなしてよいかと思います。
結果を丸めてしまっていいんじゃないでしょうか。

Python

1import numpy as np 2from numpy.linalg import inv 3 4A = np.array([[1, 2], [3, 4]]) 5inv_A = inv(A) 6print "A=" 7print inv_A 8 9# check 10dot_A = np.dot(A, inv_A) 11dot_A = np.round(dot_A, decimals=5) 12print dot_A 13 14"""実行結果 15A= 16[[-2. 1. ] 17 [ 1.5 -0.5]] 18[[ 1. 0.] 19 [ 0. 1.]] 20"""

細かい部分の指摘をもらえると幸いです。

問題点を強いて言うなら、逆行列が存在しないときはエラーになってしまうことです。

Python

1>>> A = np.array([[1, 2], [2, 4]]) 2>>> inv_A = inv(A) 3Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5 File "C:...\numpy\linalg\linalg.py", line 513, in inv 6 ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj) 7 File "C:...\numpy\linalg\linalg.py", line 90, in _raise_linalgerror_singular 8 raise LinAlgError("Singular matrix") 9numpy.linalg.linalg.LinAlgError: Singular matrix

前もって階数をチェックしておくのがよいかと思います。
行列式も判断材料にはなりますが、こちらにも計算誤差の問題が発生するので。


あと、全然細かい指摘ではありませんが...
特に2.7を使い続ける理由がなければPython3への乗り換えをお勧めします。

投稿2017/10/19 14:57

編集2017/10/19 15:03
LouiS0616

総合スコア35660

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

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

murazun

2017/10/19 15:22

分かりやすい回答ありがとうございます! 丸め誤差を考慮したところ、求めることができました。 juryter notebook内ではpython2しかないため仕方のないことかなと思っています。。。
LouiS0616

2017/10/19 15:32

日頃Jupyter notebookを使わないので細かいアドバイスは出来ないのですが、Python3も利用できるみたいですよ。https://qiita.com/sasaki77/items/bfa53828c973ba46e34d これ以外にも、『Jupyter notebook Python3』とか調べると山ほど出てきます。 多少面倒ではありますが、その手間をかける充分な価値があるかと思います。
murazun

2017/10/19 16:12

細かいところまでありがとうございます! 自分でもう少し調べてみようかなと思います!
guest

0

#計算ライブラリ「numpy」を導入

import numpy as np

A=np.array([[1,2],[3,4]])
print(A)
Ainv=np.linalg.inv(A)
print(Ainv)
E=A.dot(Ainv)
print(E)
============出力結果
[[1 2]
[3 4]]
[[-2. 1. ]
[ 1.5 -0.5]]
[[1.00000000e+00 1.11022302e-16]
[0.00000000e+00 1.00000000e+00]]
*これがいやですね!

*下が丸め処理です。
E=np.round(E,decimals=5)<--通常は5で間に合うようです。
print(E)
====出力結果
[[1. 0.]
[0. 1.]]

投稿2018/07/05 08:06

jyunpei

総合スコア44

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問