sympy を使用して行列の疑似逆行列を計算するにはどうすればよいですか (行列にはシンボリック定数があり、シンボリックでも逆行列が必要なため、numpy を使用しないでください)。sympy では、正方行列以外では法線inv()
が機能しません。たとえば、M = Matrix(2,3, [1,2,3,4,5,6]), pinv(M)
与える必要がある場合
-0.9444 0.4444
-0.1111 0.1111
0.7222 -0.2222
これはすべて記号的なものなので、線形代数のクラスで教えられている教科書の公式を使用しても問題ないと思います (たとえば、Moore-Penrose pseudoinverseに関するウィキペディアの記事の特殊なケースのリストを参照してください)。数値評価pinv
では、代わりに特異値分解 (svd) を使用します。
線形に独立した行 (完全な行ランク) があるため、「正しい」逆の式を使用できます。
>>> import sympy as sy
>>> M = sy.Matrix(2,3, [1,2,3,4,5,6])
>>> N = M.H * (M * M.H) ** -1
>>> N.evalf(4)
[-0.9444, 0.4444]
[-0.1111, 0.1111]
[ 0.7222, -0.2222]
>>> M * N
[1, 0]
[0, 1]
完全な列ランクの場合、M を MH に置き換え、結果を転置し、単純化して「左」逆数の次の式を取得します。
>>> M = sy.Matrix(3, 2, [1,2,3,4,5,6])
>>> N = (M.H * M) ** -1 * M.H
>>> N.evalf(4)
[-1.333, -0.3333, 0.6667]
[ 1.083, 0.3333, -0.4167]
>>> N * M
[1, 0]
[0, 1]