Dubbio su un codice MATLAB
Ragazzi ho il seguente codice MATLAB che ho trovato su internet sulla fattorizzazione di Cholesky, e non riesco a capire una cosa. Potete aiutarmi a capire?
Non capisco solo una cosa di questo codice: quando dice di verificare se la matrice A è definita positiva, che tipo di ragionamento fa? Il nostro professore ha spiegato il criterio di Silvester per verificare che una matrice è simmetrica definita positiva, ma questo non mi sembra essere utilizzato in questo codice.
Usa un altro criterio per caso?
Grazie dell'aiuto.
function [R] = funzchol(A) % definiamo una nuova funzione [n,n] = size(A); R = zeros(n,n); for j = 1:n if (A(j,j)-sum(R(1:j-1,j).^2)) < 0 % verifichiamo che la matrice A sia simmetrica è definita positiva error ('La matrice A non è definita positiva') else for i = 1:j-1 R(i,j)= (A(i,j)- sum(R(1:i-1,i).*R(1:i-1,j)))/R(i,i); end R(j,j) = sqrt(A(j,j)- sum(R(1:j-1,j).^2)); end end
Non capisco solo una cosa di questo codice: quando dice di verificare se la matrice A è definita positiva, che tipo di ragionamento fa? Il nostro professore ha spiegato il criterio di Silvester per verificare che una matrice è simmetrica definita positiva, ma questo non mi sembra essere utilizzato in questo codice.
Usa un altro criterio per caso?
Grazie dell'aiuto.
Risposte
Nessuno sa darmi una mano a capire?
la fonte dove l'hai preso è attendibile?
probabilmente vuole verificare che la matrice sia a dominanza diagonale stretta (condizione sufficiente per essere definita positiva) ma ci sono degli errori nel modo in cui è implementato.
la disuguaglianza da verificare è questa:
$|A_(ii)|>\sum_(j=1,j\ne i)^n|A_(ij)| \forall i$
probabilmente vuole verificare che la matrice sia a dominanza diagonale stretta (condizione sufficiente per essere definita positiva) ma ci sono degli errori nel modo in cui è implementato.
la disuguaglianza da verificare è questa:
$|A_(ii)|>\sum_(j=1,j\ne i)^n|A_(ij)| \forall i$
Penso sia attendibile perchè alla fine fine fa un esempio con a funzione e secondo perchè è preso da appunti di un professore dell'università di Cagliari. Posto il link degli appunti da cui ho preso il codice, forse vi è d'aiuto: http://bugs.unica.it/~gppe/did/ca/tesin ... marper.pdf pagine 16-17-18-19.
Comunque anche io avevo pensato che vuole verificare la dominanza diagonale stretta, ma non c'entra nulla usare la matrice R.
Comunque anche io avevo pensato che vuole verificare la dominanza diagonale stretta, ma non c'entra nulla usare la matrice R.
Forse ho capito cosa sta facendo.
Se deve accadere che:
$R(i,i)=(A(i,i) - \sum_{k=\1}^{b=i-1}R(k,i)^2)^(1/2)$
Se tutto il radicando è $<0$ sicuramente quella radice non esiste e quindi sicuramente non è definita positiva. Posso quindi dire, che se accade che il radicando è $>0$ allora la matrice è definita positiva?
Per favore potete dirmi se in generale questo ragionamento è vero o no?
Se deve accadere che:
$R(i,i)=(A(i,i) - \sum_{k=\1}^{b=i-1}R(k,i)^2)^(1/2)$
Se tutto il radicando è $<0$ sicuramente quella radice non esiste e quindi sicuramente non è definita positiva. Posso quindi dire, che se accade che il radicando è $>0$ allora la matrice è definita positiva?
Per favore potete dirmi se in generale questo ragionamento è vero o no?
Secondo me questo codice è semplicemente sbagliato. Non usa la parte superiore della matrice e quindi non può certo dimostrare che sia simmetrica inoltre sta usando la colonna j della matrice R prima che venga introdotta nell'algoritmo (in quel momento è tutta 0, il codice che segue non lavora su R(1:j,j+1) ). Quindi di fatto testa solo che la diagonale sia composta da elementi non negativi. Non si accorgerebbe neanche che la matrice è nulla!