2017-02-26 102 views
2

我试图通过使用LU分解来解决Ax = b,但不知何故,我无法通过乘以L * U来获得A。这是代码和结果;LU分解的矩阵乘法问题?

A = array([2,3,5,4]).reshape(2,2) 
b = array([4,3]) 
P,L, U = lu(A) 

而结果对于L和U

L: 

array([[ 1. , 0. ], 

     [ 0.4, 1. ]]) 

U: 

array([[ 5. , 4. ], 

     [ 0. , 1.4]]) 

结果对于L * U

dot(L,U): 

array([[ 5., 4.], 

     [ 2., 3.]]) 

所以代替((2,3),(5,4)), ((5.,4。),(2.,3.))。结果,我无法解决Ax = b。获得这种L * U结果的原因是什么?

回答

4

哦,好像我完全忘记了置换矩阵P.乘以P的逆与L * U解决了这个问题;

dot(inv(P),dot(P,A)): 

array([[ 2., 3.], 
     [ 5., 4.]]) 
+1

或者你可以使用,而不是'L,U = scipy.linalg.lu(A,permute_l = TRUE)' 。然后'L.dot(U)'是预期的。 –

1

根据WikiPedia:PA = LU。

所以,如果你想A = LU,您可以添加到permute_l=True功能lu

(ins)>>> a = np.array([2,3,5,4]).reshape(2,2) 
(ins)>>> l,u = scipy.linalg.lu(a, permute_l=True) 
(ins)>>> l.dot(u) 
array([[ 2., 3.], 
     [ 5., 4.]])