부분 피벗을 사용하여 자체 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
이 줄을 어디에 넣을 지 정확하게 지정할 수 있습니까? 나는 당신의 코드를 테스트했고 L 행렬에 문제가있다. – CTZStef
'P ([k r], :) = P ([r k], :); – BRabbit27