値が1.30562227696e-13
ととんでもなく0に近いので、どこかで計算誤差が生じています。
numpyのリファレンスを見てみましょう。
numpy.linalg.detには、次のような記述があります。
See also:
slogdet
Another way to representing the determinant, more suitable for large matrices where underflow/overflow may occur.
このアドバイスに従って、numpy.linalg.slogdetを使ってみます。
Python
1>>> np.linalg.slogdet(A)
2(1.0, -30.984227930851471)
リファレンスを見ると、この結果の捉え方がわかります。
In all cases, the determinant is equal to sign * np.exp(logdet).
つまり、行列式はnumpy.e**-31
と計算されたわけです。
slogdet
の力を借りても、正しく計算することは出来ませんでした。
でも、悲観する必要はありません。
解が不定であることを確かめるためには、階数を計算すればよいです。
Python
1>>> np.linalg.matrix_rank(A)
22
solve
を呼び出す前に階数を計算して分岐させましょう。
あるいは、次のような強引な方法も案外柔軟かもしれません。
Python
1try:
2 if np.linalg.matrix_rank(A) < A.shape[0]:
3 raise np.linalg.linalg.LinAlgError
4 else:
5 np.linalg.solve(A, b)
6except:
7 print('解は不定です')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/08 15:54