La décomposition LU avec pivot partiel Matlab
Je suis en train de mettre en place mes propres décomposition LU avec pivot partiel. Mon code est ci-dessous et, apparemment, fonctionne très bien, mais pour certaines matrices, il donne des résultats différents lors de la comparaison avec le haut- [L, U, P] = lu(A)
fonction dans matlab
Peut quelqu'un endroit où est-ce mal?
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
Voici les deux matrices j'ai testé avec. La première est la bonne, alors que le second a quelques éléments inversé.
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];
Mise à JOUR
J'ai vérifié mon code et la correction de certains bugs, mais encore il manque quelque chose, avec le pivot partiel. Dans la première colonne les deux dernières lignes sont toujours inversées (à comparer avec la suite de lu() dans matlab)
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
OriginalL'auteur BRabbit27 | 2013-03-08
Vous devez vous connecter pour publier un commentaire.
J'ai oublié que Si il y avait un swap dans la matrice P j'ai dû swap aussi la matrice L. Donc, il suffit d'ajouter la ligne suivante après la après la permutation P et tout fonctionne super.
Doit être juste après
P([k r],:) = P([r k],:);
OriginalL'auteur BRabbit27
Les deux fonctions ne sont pas correctes.
Ici est la bonne.
OriginalL'auteur panch
Ma réponse est ici:
OriginalL'auteur Dr Karatay