两种方式求Sympy矩阵逆的不一致

问题描述 投票:0回答:1

我正在尝试反转

Sympy
中的简单数值矩阵。我从一个矩阵开始:

In [56]: A_MATRIX_M
Out[56]: 
⎡0.174683794941032   0.174688696013867   0.174688696013957   0.174683794941032   0.174688696013867   0.174688696013957 ⎤
⎢                                                                                                                      ⎥
⎢0.152985639387222   0.153053070078189   0.153053070078123   0.152985677401143   0.153053070078189   0.153053070078123 ⎥
⎢                                                                                                                      ⎥
⎢0.122289719307085    0.12255894161074    0.12255894161075   0.122289780080333    0.12255894161074    0.12255894161075 ⎥
⎢                                                                                                                      ⎥
⎢0.0888623464387251  0.0894599879866164  0.0894599879864983  0.0888623905998649  0.0894599879866165  0.0894599879864984⎥
⎢                                                                                                                      ⎥
⎢0.0584375462953993  0.0593271595778474  0.0593271595779078  0.0584375753365935  0.0593271595778473  0.0593271595779078⎥
⎢                                                                                                                      ⎥
⎣0.034711924284652   0.0356325950288525  0.035632595028856   0.0347119415351321  0.0356325950288525  0.035632595028856 ⎦

我可以用

.inv()
得到逆:

In [59]: A_M_INV.inv()
Out[59]: 
⎡-4.20862006694537e-38  -3.64678015602041e-38  -4.89393679687261e-39  -5.26008046298975e-38  -1.29781892788192e-38  1.12107780599699e-37 ⎤
⎢                                                                                                                                        ⎥
⎢-1.19250990841802e-38  -1.17838767512258e-38  -5.49930182641769e-39  -1.79347381150519e-38  -3.76673961453884e-39  3.67594291864767e-38 ⎥
⎢                                                                                                                                        ⎥
⎢1.27521806859415e-38   1.38241733868129e-38   1.33016305680983e-39   1.89098712400354e-38   7.63333345652249e-39   -4.07574230117266e-38⎥
⎢                                                                                                                                        ⎥
⎢-3.71566091342595e-39  -3.69178932808298e-39  -1.37147644288023e-39  -4.68481431180264e-39  -3.97158856857654e-39  8.39451101073365e-39 ⎥
⎢                                                                                                                                        ⎥
⎢1.47794212524182e-38   1.21859956435038e-38   7.46216287435121e-40   2.08223967916098e-38   8.25097707225834e-39   -4.0465253879286e-38 ⎥
⎢                                                                                                                                        ⎥
⎣-2.5158985894826e-39   -3.62021834376681e-39  -3.99023376900161e-40   -5.881653010039e-39   -3.44892577031322e-39  6.50635833262352e-39 ⎦

但是,我还应该能够通过将辅助矩阵除以矩阵行列式来得到逆矩阵。然而,它给出了完全不同的答案:

In [57]: A_M_INV = A_MATRIX_M.adjugate() / A_MATRIX_M.det()

In [58]: A_M_INV
Out[58]: 
⎡-1.03014934740997e+38  9.76285991918083e+37   -2.61712726811554e+38  -2.91755290755826e+38  2.02091254231468e+37   8.60970411767247e+37 ⎤
⎢                                                                                                                                        ⎥
⎢-1.0350460657459e+38   1.09196345494244e+38   1.65391718422458e+38   -4.62921116834264e+37  -4.10946591995717e+38  -2.93534695043802e+38⎥
⎢                                                                                                                                        ⎥
⎢3.44664755653471e+37   -1.86912642859017e+38  -8.76351586189679e+37  -2.26077970623935e+38  -1.67328014514703e+37  1.00789976403353e+38 ⎥
⎢                                                                                                                                        ⎥
⎢1.82916593489888e+37   -8.10152924803704e+37  -1.33638262519626e+38  2.88888937621382e+38   1.19814518627368e+38   -3.22157029803083e+38⎥
⎢                                                                                                                                        ⎥
⎢6.14049097203001e+37   2.94210971355518e+37   5.88396356342516e+37   -2.59752889211905e+38   1.036688778158e+38    1.24211877586664e+38 ⎥
⎢                                                                                                                                        ⎥
⎣-4.62263666898771e+37  2.94055576923073e+37   -1.04165393746291e+38  -2.89791317977202e+37  -5.86035000752247e+37  -1.95539341633241e+38⎦

这是一个其他人使用此方法来反转矩阵的示例:

为什么

sympy.Matrix.inv
慢?

为什么它们不同?尝试使用这个逆矩阵来求解一个简单的方程表明,这两个方程似乎都不是正确的逆矩阵。我不确定可能出了什么问题;是因为描述矩阵需要很大的指数或精度吗?

提前感谢您的帮助!

编辑:在下面@Jared的帮助下,我做了更多的挖掘并发现了这个问题:逆矩阵结果在MATLAB和Python中不同现在我知道我的矩阵是病态的/本质上是奇异的,这使它无法具有明确定义的逆。

python matrix sympy inversion
1个回答
0
投票

以下是我作为答案发布的评论:

首先,请注意您的“逆矩阵”只是零矩阵。我创建了你的矩阵并计算了行列式,结果约为 0。

import sympy as smp

A = smp.Matrix([[0.174683794941032, 0.174688696013867, 0.174688696013957, 0.174683794941032, 0.174688696013867, 0.174688696013957],
                [0.152985639387222, 0.153053070078189, 0.153053070078123, 0.152985677401143, 0.153053070078189, 0.153053070078123],
                [0.122289719307085, 0.12255894161074, 0.12255894161075, 0.122289780080333, 0.12255894161074, 0.12255894161075],
                [0.0888623464387251, 0.0894599879866164, 0.0894599879864983, 0.0888623905998649, 0.0894599879866165, 0.0894599879864984],
                [0.0584375462953993, 0.0593271595778474, 0.0593271595779078, 0.0584375753365935, 0.0593271595778473, 0.0593271595779078],
                [0.034711924284652, 0.0356325950288525, 0.035632595028856, 0.0347119415351321, 0.0356325950288525, 0.035632595028856]])

print(A.det())  # -9.86673942982700e-57

当你用第二种方法计算倒数时,你会得到很大的数字,因为你除以一个很小的数字。你的矩阵是病态的并且本质上是奇异的(即它没有逆矩阵)。

请记住,在这种情况下,您正在使用浮点值,因此 sympy 计算出的行列式值大约为 0,is 0。我不确定为什么 sympy 不认为该矩阵是奇异的并返回一个逆(我不知道它在幕后执行什么检查)。 Sympy 似乎认为它是可逆的(sympy 在检查时说它是满级的

A.rank()
),但结果似乎并非如此。

我们还可以检查矩阵的特征值。 (特征值是

Matrix.eigenvals()
返回的字典的键。)

print(A.eigenvals()) # {0.633575259554063: 1, 4.07013965394438e-9: 1, -6.35328826990267e-17: 1, -2.95260889975432e-15: 1, -3.59523027736480e-14: 1, 0.000542688212375667: 1}

请注意,其中 3 个(可以说是 4 个)本质上是 0。矩阵必须具有非零特征值才能可逆。

以下是矩阵可逆的条件列表:https://mathworld.wolfram.com/InvertibleMatrixTheorem.html.

© www.soinside.com 2019 - 2024. All rights reserved.