2017-12-21 70 views
1

[python 2.7とnumpy v1.11.1]行列の条件数を調べていて、関数np.linalg.cond()を使わずに行列の条件数を計算しようとしています。numpyを使った行列の条件番号

numpyのドキュメントに基づいて、行列の条件番号の定義は、「xのノルムのノルムはxの逆数のノルム」となります。

|| X || * || X^-1 ||行列のため

a = np.matrix([[1, 1, 1], 
       [2, 2, 1], 
       [3, 3, 0]]) 

print np.linalg.cond(a) 

1.84814479698e + 16

print np.linalg.norm(a) * np.linalg.norm(np.linalg.inv(a)) 

2.027453660713377e + 17私の計算に誤りがある

ありがとうございます!

+0

行列特異値0 det、inf逆など – hpaulj

+0

再生できません。私のPython/Numpyは、 'inv(a)'を呼び出すと 'LinAlgError("特異行列 ")'を生成します。 – Pavel

答えて

1

あなたはフロベニウスノルムの定義を使用して条件を計算しようとしています。これは、条件計算に対するオプションのパラメータです。

print(np.linalg.norm(a)*np.linalg.norm(np.linalg.inv(a))) 
print(np.linalg.cond(a, p='fro')) 

はnumpyのcond()

2.02745366071e+17 
2.02745366071e+17 
+0

これは動作します。ありがとう! – jeffalltogether

3

normはcondが2ノルムを使用する場合、デフォルトでは行列のためのフロベニウスノルムを使用しています。

In [347]: np.linalg.cond(a) 
Out[347]: 38.198730775206172 

In [348]:np.linalg.norm(a,2)*np.linalg.norm(np.linalg.inv(a),2) 
Out[348]: 38.198730775206243 

In [349]: np.linalg.norm(a)*np.linalg.norm(np.linalg.inv(a)) 
Out[349]: 39.29814570824248 
+0

'np.linalg.norm'が演算子の規範を理解しているのを知らなかった! (+1) –

+0

ありがとう、説明はとても役に立ちました!しかし、私は 'np.linalg.cond(a、2)= np.linalg.norm(a、2)* np.linalg.norm(np.linalg.inv(a)、2)!= np.linalg .cond(a) ' – jeffalltogether

+1

丸め問題。おそらく操作は同じ順序で正確に行われるわけではありません。 –

1

を生成し、現在バグがあります。これを修正する時が来ますが、今のところ線形方程式解でこれを行っているのであれば、SciPy linalg.solveを使うことができます。正確な特異点に対してエラーが発生するか、逆数条件数が閾値以下であれば警告が出ます。配列は可逆です。

関連する問題