Programma per il calcolo della matrice inversa con Matlab

crestini
Ciao ragazzi, devo sostenere l'esame di calcolo numerico ma per poter essere ammessi all'orale devo prima elaborare un programma con Matlab, e siccome l'esame è diviso in 3 parti, i programmi sono ben 3! Purtroppo le mie capacità informatiche sono molto carenti e sto riscontrando notevoli problemi nell'elaborazione di questi programmi! Chiedo URGENTEMENTE una mano. Vi allego il primo il testo del primo elaborato:

Assegnata la matrice A ͼ Cnxn scrivere un sottoprogramma Matlab per il calcolo della sua inversa usando il metodo di Gauss con pivot parziale.

N.B. Se indichiamo con X = [x1; x2; : : : ; xn] la matrice inversa allora AX = I .
Cio`e, posto I = [e1; e2; : : : ; en] , basta risolvere gli n sistemi lineari Axi = ei .
Questo è ciò che devo scrivere!
In realtà dopo 2 mesi quello che sono riuscita a scrivere mi restituisce risultati giusti, ma solo in alcuni casi, e siccome il professore non ha voglia di perder tempo perchè reputa il mio elaborato "TROPPO LUNGO" come soluzione mi ha dato un bel RESET di tutto quello che ero riuscita a fare!
Ora, siccome mi manca solo questo esame per poter sostenere la tesi chiedo a chiunque sia in grado di darmi una mano, un sostegno per elaborare questi maledettissimi programmini! Chi può essermi di aiuto mi contatti così gli faccio avere il privato anche gli elaborati che sono riuscita a creare io per capire se ci sono errori che posso correggere oppure no!
Grazie mille!

Risposte
vict85
Premesso che non si calcola mai l'inversa di una matrice perché nel tempo che ti calcoli l'inversa ti sei calcolato \(\displaystyle X = A^{-1}B \) (ora capirai anche perché è così).

Il tuo programma in pratica ti chiede di risolvere l'equazione matriciale \(\displaystyle AX = I \) dove \(\displaystyle I \) è l'identità. Quello che quindi devi implementare è una funzione che ti implementi \(\displaystyle AX = B \) (usando il metodo di eliminazione di Gauß) per \(\displaystyle B \) matrice qualsiasi. E chiamare la funzione con \(\displaystyle B = I \).

Il suggerimento del professore e forse anche il suo modo di vedere le cose è discutibile :roll: . Mi spiego, il prof ti sta velatamente chiedendo di fare \(\displaystyle n \) volte una operazione di \(\displaystyle O(n^3) \) operazioni, producendo una funzione di \(\displaystyle O(n^4) \) operazioni quanto quello che ti sto suggerendo io ne richiede \(\displaystyle O(n^3) \) ed è praticamente la stessa cosa, semplicemente eviti di ripetere \(\displaystyle n \) volte le stesse identiche operazioni :roll: . Dovrei fare i calcoli per bene ma penso che questo metodo fa meno operazioni di calcolare la decomposizione \(\displaystyle LU \) e risolvere il sistema \(\displaystyle n \) volte usando la decomposizione. Ma sarebbe da controllare. In ogni caso, senza dubbio, questo metodo dovrebbe strutturare meglio matlab.

Nel caso ti trovassi a dover calcolare spesso \(\displaystyle X = A^{-1}B \) per \(\displaystyle B \) differenti allora sarebbe opportuno usare la decomposizione \(\displaystyle LU \) per ridurre a \(\displaystyle O(n^2) \) ognuna di quelle moltiplicazioni dopo la prima.

In teoria, se facessi la cose davvero per bene, dovresti tener conto che Matlab memorizza le matrici Column-wise. Ma per iniziare puoi fregartene.

vict85
@ Sergio: Penso che sia un esercizio con ben meno pretese di quello che pensi. Anche perché MATLAB non è un linguaggio per scrivere codici seri :twisted:

vict85
Intendo dire che non sono codici seri perché non sono codici davvero usati. Il codice di inv di MATLAB è scritto in fortran penso (insomma penso sia LAPACK ma tutto sommato ora potrebbero persino usare PLASMA o MAGMA).

Un linguaggio come MATLAB ha lo scopo principale di testare algoritmi che verranno poi scritti e ottimizzati con altri linguaggi. Sinceramente penso che molti corsi che ora usano MATLAB dovrebbero passare a python per molte ragioni (una non trascurabile è il costo[nota]Octave su windows è poco supportato e comunque sia lui che freemat mancano di varie funzioni di MATLAB. Niente di importante ma può comunque renderti la vita più difficile. Ormai non c'è quasi nulla che faccia MATLAB per cui tu non possa trovare una funzione equivalente in Python.[/nota]). Per questo ritengo che non sia fatto per codici seri, perché sono prove.

Detto questo diciamo che è un linguaggio di programmazione con cui non sono in sintonia.

In ogni caso avendo programmato la LU in opencl ho una certa dimestichezza con l'algoritmo, le sue varianti e i vari metodi di pivoting. Insomma ho letto quel capitolo del Golan varie volte (e non solo su quel libro).

vict85
La mia era una costatazione pratica. L'operazione di inversione matriciale è una operazione che in genere si evita. A meno di matrici molto belle.
Il codice per scrivere l'esercizio, scritto in MATLAB usando l'algoritmo standard, non dovrebbe superare le 50 linee di codice e dovrebbe usare massicciamente le operazioni vettoriali. Se superi le 50 righe oppure usi for per ogni cosa allora non hai capito l'algoritmo né sai usare MATLAB. Io penso che crestini si trovi in questa situazione.
La mia costatazione su MATLAB non si riferiva a questo esercizio. MATLAB va benissimo per fare un codice di questo tipo. Insomma passi a qualcosa di più basso livello se hai bisogno di implementare qualcosa che viene usato da programmi come MATLAB. Intendevo solo che crestini non ha bisogno di creare codici Super-ottimizzati, deve implementare l'algoritmo standard.

Non conosco R, sono anni che mi riprometto di impararlo ma ho sempre altre cose più urgenti.

vict85
Esattamente quali sarebbero i tuoi dubbi? In pratica se prendi il file postscript (inverse-tr.ps) citato da Sergio hai il codice in MATLAB praticamente completo (nelle prime pagine). Che manuale usi per il corso?

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