Sympy中两种矩阵求逆方法结果不一致的问题排查
关于Sympy中数值矩阵求逆的异常问题
尝试在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 ⎦
- 使用伴随矩阵除以行列式(
A_MATRIX_M.adjugate() / A_MATRIX_M.det())得到的结果:
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⎦
问题核心原因
两种方法得到的结果完全不同且均无效,本质原因是该矩阵为病态/近乎奇异矩阵:
- 近乎奇异矩阵的行列式值极小,伴随矩阵除以行列式时,极小的除数会直接放大数值,导致结果出现1e+38量级的极大值;
.inv()方法返回的极小值矩阵是数值计算对奇异矩阵的近似处理,并非真正有效的逆矩阵;- 这类矩阵本身不存在有效的逆矩阵,任何求逆操作都会因数值不稳定产生无意义的结果。
内容的提问来源于stack exchange,提问作者Joseph Farah
相关产品推荐
相关产品推荐

