Fattorizzazione LU

di il
29 risposte

Fattorizzazione LU

Salve a tutti, il pivoting di questa fattorizzazione mi sta facendo impazzire, eppure sembra così semplice... sta di fatto che non mi da le stesse matrici LU di matlab. Credo che l'errore sia solo nella permutazione perché la LU classica non mi da problemi. Riuscite a vedere cosa sto sbagliando?
function [ L,U,P ] = fattorizzaLU( A )
%Fattorizzazione LU di una matrice A = LU, con matrice di permutazione
%   IMPUT:
%         A--> Matrice dei coefficienti
%   OUTPUT:
%         L,U--> matrici triangolari della fattorizzazione

[n,m] = size (A);
if n ~= m 
    error ('la matrice deve essere quadrata')
end

L = eye(n);
P = eye(n);
t = A(:,1);
for i= 1:n-1
 
 %     Inizio permutazione
        for j = 1:length (t)
            if t(j) == max (abs(t))
                k = j;
            end
        end
        if A(k,i)==0
            error ('la matrice é singolare')
        end
        v = P(i,:);
        P(i,:) = P (k,:);
        P(k,:) = v; 
        w = A(i,i:n); 
        A(i,i:n) = A(k,i:n);
        A(k,i:n) = w;
 %    fine permutazione
    
g = [zeros(i,1); A(i+1:n,i)]/A(i,i);
L(i+1:n,i) = g(i+1:n);
A(i+1:n,i) = 0;
A(i+1:n,i+1:n) = A(i+1:n,i+1:n)-g(i+1:n)*A(i,i+1:n);


t = [zeros(i+1,1) ; A(i:n,i)];

end
U = A;


end
praticamente dovrei scambiare la riga i-esima con riga k-esima nella matrice di permutazione P che all'inizio è l'identità, la stessa cosa va fatta nella matrice A, solo che non va scambiata l'intera riga ma solo dalla colonna i-esima in poi...

29 Risposte

  • Re: Fattorizzazione LU

    Non ho matlab a portata di mano... lunedì controllo il codice.
  • Re: Fattorizzazione LU

    Apposto ho risolto, dopo due interi pomeriggi a buttarci il sangue, adesso funziona.



    function [ L,U,P ] = fattorizzaLU( A )
    %Fattorizzazione LU di una matrice A = LU, con matrice di permutazione
    %   IMPUT:
    %         A--> Matrice dei coefficienti
    %   OUTPUT:
    %         L,U--> matrici triangolari della fattorizzazione
    
    [n,m] = size (A);
    if n ~= m 
        error ('la matrice deve essere quadrata')
    end
    
    P = eye(n);
    L = eye(n);
    % p = [1:n];
    for i= 1:n-1
       %    Inizio permutazione
           [~,k] = max(abs(A(i:n,i)));
            k=k+i-1;
            if A(k,i)==0
                error ('la matrice é singolare')
            end
              h = p(i);
              p(i)= p(k);
              p(k)= h;
            v = P(i,:);
            P(i,:) = P (k,:);
            P(k,:) = v; 
            w = A(i,i:n); 
            A(i,i:n) = A(k,i:n);
            A(k,i:n) = w;
            
    %    fine permutazione
        
    g = (1 /A(i,i)) * [zeros(i,1); A(i+1:n,i)];
    L(i+1:n,i) = g(i+1:n);
    A(i+1:n,i) = 0;
    A(i+1:n,i+1:n) = A(i+1:n,i+1:n) - g(i+1:n) * A(i,i+1:n);
    
    end
    U = A;
    
    end
  • Re: Fattorizzazione LU

    Invece non funziona un bel niente, si vede che le matrici che usavo erano particolarmente fortunate... non so perché ma la matrice U sembra venire sempre giusta, ma la L ha qualche componente scambiata
  • Re: Fattorizzazione LU

    Strano che sia giusta solo una delle due, dato che dipendono entrambe da g...
    Purtroppo, anche qui, senza l'algoritmo non so come aiutarti.
    Per quanto riguarda la memoria, se non stai lavorando con matrici di dimensioni enormi non me ne preoccuperei.
  • Re: Fattorizzazione LU

    Infatti, ho provato con altre e anche la U è sbagliata, il problema nasce quando faccio la permutazione. Senza permutazione il prodotto L * U mi da la A, quando invece la faccio il prodotto L * U mi dovrebbe dare la matrice A però con qualche riga scambiata, che si dovrebbe mettere a posto quando moltiplico per la matrice di permutazione, invece mi da numeri sbagliati. Eppure è strano, perché è come se stessi applicando la LU ad una matrice diversa, quindi comunque dovrebbe funzionare.
  • Re: Fattorizzazione LU

    Prova a lanciare il codice passo passo con una matrice che non funziona, fai il ciclo un passo alla volta, e riproduci su carta quello che fa ( per i=1, poi per i=2...) in modo da isolare il punto in cui non dà il risultato che ti aspetti.
  • Re: Fattorizzazione LU

    Comunque, non so se può aiutarti nel trovare l'errore, o se ti può solo confondere le idee... sicuramente può essere utile se lavori con matrici molto grandi ed hai problemi di memoria perché ti evita di passare per matrici intermedie per la permutazione delle righe...
    questo codice:
    w = A(i,i:n); 
            A(i,i:n) = A(k,i:n);
            A(k,i:n) = w;
    puoi scriverlo anche così:
    A([i k],i:n)=A([k i],i:n);
  • Re: Fattorizzazione LU

    Già fatto, mi sbaglia già alla prima iterazione mi vengono 2 valori scambiati, l'ho fatto anche a mano e mi viene uguale a come lo fa la mia function... mah... eppure ho letto il procedimento anche su internet e mi sembra uguale a quello che faccio io
  • Re: Fattorizzazione LU

    Mandami il link di dove l'hai letto
  • Re: Fattorizzazione LU



    è a pag 86, cambia l'algoritmo dopo la fine della permutazione, ma dovrebbe essere la stessa cosa, come l'ho scritto io funziona
  • Re: Fattorizzazione LU

    Non capisco perchè fai questo:
    k=k+i-1;
  • Re: Fattorizzazione LU

    Per come ho definito il vettore mi diminuisce di dimensione ad ogni iterazione, quindi la posizione k dove si ha il massimo non mi corrisponde alla posizione k della matrice, perché la dimensione delle colonne della matrice non cambia, a meno che non l'aggiusto mettendo k+1-1. Non so se mi sono spiegato bene
  • Re: Fattorizzazione LU

    Sì, ho capito... perché il massimo lo cerchi nella sottomatrice mentre poi usi il k per indicizzare la matrice "intera"...
  • Re: Fattorizzazione LU

    Esatto
Devi accedere o registrarti per scrivere nel forum
29 risposte