[Matlab] Metodo QR

Dalfi1
Ragazzi potreste dirmi se il seguente algoritmo per il metodo QR va bene?

function [ D ] = test2( A,tol,imax )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here

M=A;
x=eig(A);
I=find(x);
if I==0
    error('La matrice contiene autovalori nulli');
end
v=x(x==real(x));
n=length(x);
m=length(v);
if n~=m
    iter=0;
    while iter<imax
        [Q,R]=qr(M);
        M=R*Q;
        iter=iter+1;
    end
    [D1,M]=rsf2csf(Q,M);
    % La matrice M sulla diagonale presentava solo valori reali. La funzione
    % rsf2csf (inversa di cdf2drf) consente, una volta immessa l'ultima matrice
    % unitaria Q e la matrice M, di disporre gli autovalori complessi sulla
    % parte diagonale di M
    D=diag(M);
    D=diag(M);
else
    T=tril(M,-1);
    while norm(T)>tol
        [Q,R]=qr(M);
        M=R*Q;
        T=tril(M,-1);
    end
end


Vi spiego perchè ho fatto distinzione tra matrice con autovalori reali e matrice con autovalori complessi: l'algoritmo iniziale che avevo creato, se usato su matrici con autovalori complessi dava i seguenti errori:
1) Se l'arresto era dato da norm(T) (ho sul valore assoluto del più grande elemento della parte triangolare) andava in loop e non si arrestava mai perchè credo che, essendoci autovalori complessi, la parte triangolare strettamente inferiore non si annullava mai (verificato facendomi mostrare la matrice T che si creava)
2) Se l'arresto era dato da iter, il risultato mi dava solo numeri reali: gli autovalori reali quindi, coincidevano con quelli dati da eig(A), quelli complessi ovviamente no. Allora ho scoperto la funzione rsf2csf che fa proprio questo, ossia dispone sulla diagonale gli autovalori complessi e si utilizza principalmente per le forme di Schur.

Ho due richieste: l'arresto per autovalori nulli non funziona (come posso fare). Come posso fare? E poi esiste qualcosa per ridurre il codice, magari usando l'arresto solo su norm(T) che consuma meno?

EDIT: Risolto problema arresto per autovalori nulli con

for i=1:length(x)
    if x(i)==0
        error('La matrice contiene autovalori nulli');
    end
end


;)

Risposte
Raptorista1
[xdom="Raptorista"]Sposto nella sezione più appropriata! :evil:[/xdom]

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.