2017-12-14 9 views
1

私はSaul I. Gassの第5回リニアプログラミングの作業中です。Scipy linalg LUの分解は、私の教科書に異なる結果をもたらします。

彼与え、次のテキストおよび例: 「その後、n×nの正則行列が... ...私たちが許可すれば、製品 = LUとして表現することができる考えますU(又はL)の対角要素が1にすべて等しくなるよう、次いでLU分解が一意になり...」

A=LU

しかし、私はまだ何が起こっているかを言うことができないと、なぜLUされています

は、私は、このSO質問から見つかったこのコードで可逆低アッパー分解を得ることができました私の教科書とは違う。誰も私にこれを説明できますか?

ので、このコード:

import numpy as np 
import scipy.linalg as la 
a = np.array([[1, 1, -1], 
       [-2, 1, 1], 
       [1, 1, 1]]) 
(P, L, U) = la.lu(a) 

print(P) 
print(L) 
print(U) 

D = np.diag(np.diag(U)) # D is just the diagonal of U 
U /= np.diag(U)[:, None] # Normalize rows of U 
print(P.dot(L.dot(D.dot(U)))) # Check 

は、この出力を与える:

[[ 0. 1. 0.] 
[ 1. 0. 0.] 
[ 0. 0. 1.]] 
[[ 1. 0. 0. ] 
[-0.5 1. 0. ] 
[-0.5 1. 1. ]] 
[[-2. 1. 1. ] 
[ 0. 1.5 -0.5] 
[ 0. 0. 2. ]] 
[[ 1. 1. -1.] 
[-2. 1. 1.] 
[ 1. 1. 1.]] 
+0

。 – percusse

答えて

2

行列(LまたはU)選択肢がありますが対角線上のものを持っている必要があります。教科書の例ではUを選択しましたが、scipyの実装ではLを選択しました。これは違いを説明します。ポイントを説明するために

、我々は物事を好転することができます

(P, L, U) = la.lu(a.T) 

print(P.T) 
# [[ 1. 0. 0.] 
# [ 0. 1. 0.] 
# [ 0. 0. 1.]] 
print(L.T) 
# [[ 1.   1.   -1.  ] 
# [ 0.   1.   -0.33333333] 
# [ 0.   0.   1.  ]] 
print(U.T) 
# [[ 1. 0. 0.] 
# [-2. 3. 0.] 
# [ 1. 0. 2.]] 

他の行列が対角上のものを取得するように、私たちは基本的にULを入れ替え行列を転置することによって。それで、結果は教科書と同じです。

は(順列行列Pは何の単位行列ではなかった場合の結果は少し違うように見えることに注意してください。)あなたの教科書には規則を次のようされていない

関連する問題