M X =Nのような線形連立方程式があります。M
多くの要素がゼロの 21x21 行列です。この系を で解こうとするとX = np.linalg.solve(M, N)
、次のエラーが表示されます。
numpy.linalg.linalg.LinAlgError: Singular matrix
ここでの問題は、によって返される値np.linalg.det(M)
が 0.0 であることです。マトリックスを生成するために 2 つの異なる方法を試しM
ましたが、その時点で奇妙な動作に遭遇しました。
i)の非ゼロ要素はM
、コードの別の場所で計算されます。これらの要素はすべて float であり、 として示されm_1, m_2, ... , m_21
ます。最初に、生成するために次のコードを試しましたM
。
M = np.zeros([21,21])
M[0,0] = m_1
M[0,1] = m_2
M[1,0] = m_3
M[1,4] = m_2
M[2,2] = m_2
M[2,3] = m_1
M[3,3] = m_3
M[3,5] = m_2
M[4,4] = m_4
M[4,5] = m_5
M[5,8] = m_6
M[5,13] = m_7
M[6,9] = m_6
M[6,14] = m_7
M[7,11] = m_6
M[7,12] = m_7
M[8,8] = m_8
M[8,9] = m_9
M[8,11] = m_10
M[9,6] = m_11
M[9,8] = m_12
M[9,20] = m_13
M[10,5] = m_11
M[10,10] = m_12
M[10,19] = m_13
M[11,19] = m_14
M[11,20] = m_15
M[12,8] = m_15
M[12,10] = m_14
M[13,16] = m_4
M[13,17] = m_17
M[14,7] = m_15
M[14,17] = m_16
M[15,16] = m_18
M[15,18] = m_7
M[16,17] = m_19
M[16,18] = m_20
M[17,4] = m_14
M[17,16] = m_16
M[18,11] = m_12
M[18,15] = m_13
M[19,12] = m_20
M[19,15] = m_21
M[20,7] = m_19
M[20,13] = m_20
M[20,20] = m_21
によって計算されるこの行列の行列式np.linalg.det(M)
はゼロです。
ii)次に、非ゼロ要素 ( m_1, ... , m_21
) を対応する数値に置き換えて、行列式が変化するかどうかを確認しました。コードは次のとおりです。
M = np.matrix([[-88.89714245, 33.72326786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #1
[-139.63175129, 0, 0, 0, 33.72326786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],#2
[0,0,33.72326786, -88.89714245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #3
[0, 0, 0, -139.63175129, 0, 33.72326786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],#4
[0, 0, 0, 0, 98.58344885, 55.0147276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #5
[0, 0, 0, 0, 0, 0, 0, 0, 114.92510983, 0, 0, 0, 0, 66.13785145, 0, 0, 0, 0, 0, 0, 0], #6
[0, 0, 0, 0, 0, 0, 0, 0, 0, 114.92510983, 0, 0, 0, 0, 66.13785145, 0, 0, 0, 0, 0, 0], #7
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114.92510983, 66.13785145, 0, 0, 0, 0, 0, 0, 0, 0], #8
[0, 0, 0, 0, 0, 0, 0, 0, 28.52149986, -96.35068993, 0, 67.82919006, 0, 0, 0, 0, 0, 0, 0, 0, 0], #9
[0, 0, 0, 0, 0, 0, 83.66136319, 0, 95.15580459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178.81716778], #10
[0, 0, 0, 0, 0, 83.66136319, 0, 0, 0, 0, 95.15580459, 0, 0, 0, 0, 0, 0, 0, 0, -178.81716778, 0], #11
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89.26005554, 67.6481946], #12
[0, 0, 0, 0, 0, 0, 0, 0, 67.6481946, 0, 89.26005554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], #13
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,98.58344885, -153.59817645, 0, 0, 0], #14
[0, 0, 0, 0, 0, 0, 0, 67.6481946, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156.90825014, 0, 0, 0], #15
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181.06296128, 0,66.13785145, 0, 0], #16
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -153.11049424, 35.89577791, 0, 0], #17
[0, 0, 0, 0, 89.26005554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156.90825014, 0, 0, 0, 0], #18
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95.15580459, 0, 0, 0, -178.81716778, 0, 0, 0, 0, 0], #19
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35.89577791, 0, 0, 117.21471633, 0, 0, 0, 0, 0], #20
[0, 0, 0, 0, 0, 0, 0, -153.11049424, 0, 0, 0, 0, 0, 35.89577791, 0, 0, 0, 0, 0, 0, 117.21471633]]) #21
この場合、np.linalg.det(M)
-9504863423.43 を返します。行列式が 0.0 でも -9504863423.43 でもないことは確かです。なぜなら、MATLAB といくつかのオンライン計算機で同じ行列式を -3.8108e+019 として計算したからです。
また、LU 分解を実行し、mpmath で行列式を計算しようとしましたが、どちらも機能しませんでした。これら 2 つのケースが異なる値を返す可能性があるのはなぜですか? 行列式を正しく計算する方法はありますか?
32 ビットの Win7 オペレーティング システムで Python(x,y) 2.7.6.1 を使用しています。