2013-03-08 2 views
3

부분 피벗을 사용하여 자체 LU 분해를 구현하려고합니다. 내 코드는 아래에 있으며 분명히 잘 작동하지만 일부 matrices의 경우 matlab에 내장 된 [L, U, P] = lu(A) 함수와 비교할 때 다른 결과를 제공합니다.부분 피벗을 사용하는 LU 분해

어디서 잘못 식별 할 수 있습니까?

function [L, U, P] = lu_decomposition_pivot(A) 
    n = size(A,1); 
    Ak = A; 
    L = zeros(n); 
    U = zeros(n); 
    P = eye(n); 
    for k = 1:n-1 
     for i = k+1:n 
      [~,r] = max(abs(Ak(:,k))); 

      Ak([k r],:) = Ak([r k],:); 
      P([k r],:) = P([r k],:); 

      L(i,k) = Ak(i,k)/Ak(k,k); 
      for j = k+1:n 
       U(k,j-1) = Ak(k,j-1); 
       Ak(i,j) = Ak(i,j) - L(i,k)*Ak(k,j); 
      end 
     end 
    end 
    L(1:n+1:end) = 1; 
    U(:,end) = Ak(:,end); 
return 

다음은 내가 테스트 한 두 행렬입니다. 첫 번째 것은 올바른 반면 두 번째는 반전 된 일부 요소가 있습니다.

A = [1 2 0; 2 4 8; 3 -1 2]; 

A = [0.8443 0.1707 0.3111; 
    0.1948 0.2277 0.9234; 
    0.2259 0.4357 0.4302]; 

UPDATE

내 코드를 확인하고 몇 가지 버그를 수정 만, 여전히 일부 회전에없는 무언가가 거기에있다. 첫 번째 열에서 마지막 두 열은 항상 반전 I 매트릭스 PI의 교체가 발생한 경우 그럼에도 매트릭스 L. 교체했다는 것을 잊어

function [L, U, P] = lu_decomposition_pivot(A) 
    n = size(A,1); 
    Ak = A; 
    L = eye(n); 
    U = zeros(n); 
    P = eye(n); 
    for k = 1:n-1 
     [~,r] = max(abs(Ak(k:end,k))); 
     r = n-(n-k+1)+r; 
     Ak([k r],:) = Ak([r k],:); 
     P([k r],:) = P([r k],:); 
     for i = k+1:n 
      L(i,k) = Ak(i,k)/Ak(k,k); 
      for j = 1:n 
       U(k,j) = Ak(k,j); 
       Ak(i,j) = Ak(i,j) - L(i,k)*Ak(k,j); 
      end 
     end 
    end 
    U(:,end) = Ak(:,end); 
return 

답변

2

(매트랩 LU()의 결과와 비교하여)되고 P를 바꾼 후 다음 줄을 추가하면 모든 것이 훌륭하게 작동합니다.

L([k r],:) = L([r k],:); 
+0

이 줄을 어디에 넣을 지 정확하게 지정할 수 있습니까? 나는 당신의 코드를 테스트했고 L 행렬에 문제가있다. – CTZStef

+0

'P ([k r], :) = P ([r k], :); – BRabbit27

0

내 대답은 여기에 있습니다 :

function [L, U, P] = LU_pivot(A) 
[n, n1] = size(A); L=eye(n); P=eye(n); U=A; 
for j = 1:n 
    [pivot m] = max(abs(U(j:n, j)));  
    m = m+j-1; 
    if m ~= j 
    U([m,j],:) = U([j,m], :); % interchange rows m and j in U 
    P([m,j],:) = P([j,m], :); % interchange rows m and j in P 
    if j >= 2; % very_important_point 
     L([m,j],1:j-1) = L([j,m], 1:j-1); % interchange rows m and j in columns 1:j-1 of L 
    end; 
    end 
    for i = j+1:n  
    L(i, j) = U(i, j)/U(j, j); 
    U(i, :) = U(i, :) - L(i, j)*U(j, :); 
    end 
end 
1

두 함수가 올바르지 않습니다. 올바른 것이 있습니다.

function [L, U, P] = LU_pivot(A) 
    [m, n] = size(A); L=eye(n); P=eye(n); U=A; 
    for k=1:m-1 
     pivot=max(abs(U(k:m,k))) 
     for j=k:m 
      if(abs(U(j,k))==pivot) 
       ind=j 
       break; 
      end 
     end 
     U([k,ind],k:m)=U([ind,k],k:m) 
     L([k,ind],1:k-1)=L([ind,k],1:k-1) 
     P([k,ind],:)=P([ind,k],:) 
     for j=k+1:m 
      L(j,k)=U(j,k)/U(k,k) 
      U(j,k:m)=U(j,k:m)-L(j,k)*U(k,k:m) 
     end 
     pause; 
    end 
end