PDA

View Full Version : calcolo del determinante di una matrice


Torav
29-12-2005, 17:05
salve a tutti :)
in questi (pochi) giorni di vacanza, giusto per riprendere la mano con il c/c++ ho deciso di farmi un modulo contenente una classe e vari overloading di operatori per il calcolo matriciale. per ora ho implementato il prodotto, la somma, la differenza, la trasposta e mi sto cimentando con il calcolo del determinante. posto che vorrei usare lo sviluppo di laplace (non so se ci sono metodi piu efficienti, ma questo conosco e tanto questo modulo è piu un esercizio che qualcosa di veramente serio ;) ),
la mia domanda è: chi sa qualcosa di calcolo matriciale saprà anche che ci sono un paio di regole che possono calcolare quasi immediatamente il determinante di una matrice (se una riga/colonna è tutta nulla oppure se 2 righe/colonne sono direttamente proporzionali tra di loro).
conviene quindi che nel calcolo del determinante controlli prima tutti questi casi (questo forse allungherebbe parecchio i tempi di calcolo?) o è meglio farlo solamente per matrici superiori ad una dimensione specifica? (questo perchè fino alle 4x4 o 5x5 o anche piu non credo che calcolare direttamente il determinante prenderebbe molto piu tempo).

scusate per le frasi un po' contorte ma non sono riuscito a spiegarmi meglio :D
grazie in anticipo!

shinya
29-12-2005, 18:03
Lo sviluppo di laplace è pessimo e va bene solo per matrici piccole.
Di solito si utilizza un qualche metodo di fattorizzazione LU tipo Gauss-Jordan, in modo da ridurre la matrice in una triangolare superiore (o inferiore). Una volta ridotta a matrice triangolare, il calcolo del determinante è banale (moltiplichi gli elementi della diagonale principale).

Cerca Gaussian Elimination o Gauss-Jordan e troverai diversi link, questo è uno:

http://mathworld.wolfram.com/GaussianElimination.html

buon lavoro! :)

Torav
29-12-2005, 18:15
si, avevo pensato a una cosa del genere, ma non mi andava proprio di cominciare a lavorare con autovalori e autovettori (o almeno così io diagonalizzo le matrici all'università :p ) ma se mi dici che lo sviluppo di laplace è così orribile dal punto di vista delle prestazioni vedrò di farci un pensierino :cool:

grazie mille per il consiglio :)

shinya
30-12-2005, 11:10
Niente autovalori e autovettori con Gauss-Jordan. Guardati l'algoritmo, è piuttosto semplice.
Laplace va bene per matrici piccole...prova a farlo su una matrice 100_000 x 100_000 o superiore. Stai lì dei giorni... :)
Poi tutto dipende dalle tue esigenze: se stai scrivendo una classe per gestire matrici di dimensione arbitraria, usi un metodo di fattorizzazione (gauss-jordan, choleski, ecc...), non laplace, per calcolare il determinante.

Ah, e se usi gauss-jordan, mi raccomando il pivoting parziale!! :)

Fenomeno85
30-12-2005, 12:21
fino al terzo ordine ti consiglio di calcolarlo in modo diretto se non erro è kramer.

~§~ Sempre E Solo Lei ~§~

Torav
30-12-2005, 12:51
fino al terzo ordine ti consiglio di calcolarlo in modo diretto se non erro è kramer.

~§~ Sempre E Solo Lei ~§~

sirrus se non sbaglio, ma grazie del consiglio in effetti stavo considerando una cosa del genere :D

Fenomeno85
30-12-2005, 17:19
sirrus se non sbaglio, ma grazie del consiglio in effetti stavo considerando una cosa del genere :D

i nomi non sono il mio forte :D .. comunque non è che orlando la matrice non esca il risultato è solo che in modo diretto i tempo computazionale è nullo :D

~§~ Sempre E Solo Lei ~§~

shinya
30-12-2005, 18:06
E' Sarrus. :nonsifa:
Ma io continuo a consigliarti Gauss-Jordan. Almeno impari qualcosa di nuovo e utile!

Torav
30-12-2005, 19:07
E' Sarrus. :nonsifa:
Ma io continuo a consigliarti Gauss-Jordan. Almeno impari qualcosa di nuovo e utile!

si sto giusto dando un'occhiata e lo implementerò assolutamente! cmq con uno switch calcolo direttamente il determinante delle 2x2 e delle 3x3 ( con Sarrus) mentre per le altre userò gauss-jordan..grazie a tutti per i consigli e buon anno! :ubriachi:

Fenomeno85
31-12-2005, 10:57
E' Sarrus. :nonsifa:
Ma io continuo a consigliarti Gauss-Jordan. Almeno impari qualcosa di nuovo e utile!

devo ancora guardarmi come funziona gauss ma penso che non sia più veloce di una moltiplicazione ;)

~§~ Sempre E Solo Lei ~§~

shinya
31-12-2005, 18:35
devo ancora guardarmi come funziona gauss ma penso che non sia più veloce di una moltiplicazione ;)

Dipende dalle dimensioni della matrice. Per una 2x2 o una 3x3 puoi usare i metodi diretti, ma per matrici più grandi devi per forza usare un metodo di fattorizzazione.
Inoltre l'uso di un metodo numerico come gauss ti risolve un sistema lineare e, se applicato in un certo modo, ti calcola anche l'inversa. Tutto con un unico metodo.
Quindi non è proprio inutile impararlo.

E poi ripeto, dipende dalle esigenze del ragazzo. Se deve lavorare _solo_ con matrici 2x2 o 3x3 va bene anche senza gauss (o altri metodi), altrimenti decisamente no.

Fenomeno85
01-01-2006, 17:29
Dipende dalle dimensioni della matrice. Per una 2x2 o una 3x3 puoi usare i metodi diretti, ma per matrici più grandi devi per forza usare un metodo di fattorizzazione.
Inoltre l'uso di un metodo numerico come gauss ti risolve un sistema lineare e, se applicato in un certo modo, ti calcola anche l'inversa. Tutto con un unico metodo.
Quindi non è proprio inutile impararlo.

E poi ripeto, dipende dalle esigenze del ragazzo. Se deve lavorare _solo_ con matrici 2x2 o 3x3 va bene anche senza gauss (o altri metodi), altrimenti decisamente no.

quello che stavo dicendo io è:

matrici di ordine <=3 metodo diretto altrimenti gauss ;)


~§~ Sempre E Solo Lei ~§~