In rete: http://www.elegio.it/doc/tn/lu_classica_invariante.html
http://www.elegio.it/doc/tn/lumodulare.html
http://www.elegio.it/doc/tn/inversione-non-solo-con-la-lu
Soluzione di un sistema di equazioni lineari, calcolo della matrice inversa del sistema e CALCOLO DELL'INVARIANTE qui limitato alle sole matrici simmetriche o antisimmetriche ma in pratica la somma degli elementi diagonali della matrice identità ottenuta dal prodotto di una qualsiasi matrice per la sua inversa deve valere ovviamente l'ordine della matrice... ☻ .
Risolve un sistema lineare a 3 ( o più... mooolto di più ) incognite creato con la funzioneMath.random()
e del quale non è garantita la risolvibilità ( la matrice potrebbe essere, per caso singolare anche se la probabilità che lo sia è molto bassa ) ossia un piccolo sistema di ordine tre per evidenziare le regole di costruzione della matrice del sistema e come specificare il termine noto e che argomenti passare alla funzione che calcola la LU ( la matrice del sistema espressa come prodotto di due matrici, la Lower ossia la triangolare inferiore e la Upper ossia la triangolare superiore ) e alla funzione che la usa....Javascript non abilitato...
Notare gli zeri del vettore che contiene la matrice i cui indici sono sempre positivi per cui la colonna e la riga zero sono dati non appartenenti alla matrice ed usabili come memoria di servizio.
Queste funzioni sono state tradotte dal Fortran per cui, se l'ordine della matrice è N, la lista che contiene la matrice è lunga (N+1)2 ed i primi N+1 elementi sono nulli ( e destinati a contenere prima il termine noto e poi la soluzione del problema. Quando la matrice è stata fattorizzata i primi N+1 elementi sono ancora zero ma il primo elemento di quella che è considerata una colonna della matrice ( il Fortran lavora per colonne, non per righe ) rappresenta l'indice della permutazione scelta dall'algoritmo per risolvere il sistema.
Questa è la lista che contiene la matrice memorizzata per colonna
...Javascript non abilitato...
La matrice originaria viene cancellata dalla funzione che calcola la fattorizzazione LU per cui bisogna salvarla per potere poi fare la verifica ossia controllare se il prodotto matrice per vettore soluzione dà effettivamente il termine noto
...Javascript non abilitato...
Stampo il risultato della fattorizzazione LU della matrice ed importante è il valore del determinante ora calcolato se la fattorizzazione è arrivata alla fine senza errori:
...Javascript non abilitato...
Faccio vedere anche cosa ho memorizzato nella lista che prima conteneva la matrice
...Javascript non abilitato...
Anche il termine noto è stato generato usando la function
Math.random()
...Javascript non abilitato...
Fatti i calcoli mosto il vettore che ho ottenuto. Naturalmente se l'ordine era troppo grande, soltanto i primi elementi...
...Javascript non abilitato...
Ecco il test decisivo: il prodotto della matrice per il vettore soluzione trovato deve essere coincidente, a meno di errori di troncamento, col termine noto assegnato.
...Javascript non abilitato...
Per esaminare un altro sistema basta ricaricare questa pagina dato che la matrice e il termine noto sono generati in modo casuale. Oppure usare il form qua sotto, di specifica dell'ordine voluto. Se l'ordine della matrice supera 5 la matrice generata è a caso simmetrica o antisimmetrica in modo di poter applicare il calcolo dell'invariante definito qui.Non visualizzo le matrici di ordine maggiore di 9 per evitare tabelle enormi ....
...Javascript non abilitato...
Questo documento vuole sottolineare l'utilità dell'invariante per matrici simmetriche o antisimmetriche come test della precisione del calcolo dell'inversa della matrice.
Guardare la codifica per vedere la definizione di questo utilissimo invariante.
La libreria usata qui facilmente ricopiabile e personalizzabile...
...Javascript non abilitato...Le funzioni locali usate per usarla
...Javascript non abilitato...
function invariante(ma,uma){ var j,k,nn,inva=0; nn=Math.min(ma.length,uma.length); for(j=0;nn>j;j++){ for(k=0;nn>k;k++)inva+=ma[j][k]*uma[j][k]; } return inva; }
Un algoritmo semplicissimo che consente controlli della accuratezza della matrice inversa e relativamente poche operazioni se la matrice da invertire è sparsa. L'invariante è sempre ossia dovrebbe risultare esattamente un intero !
Dato che bisogna fare la sommatoria del prodotto di ogni elemento della matrice per il corrispondente elemento della matrice inversa , se la matrice ha moltissimi zeri tutti quei prodotti possono essere omessi ed il calcolo dell'invariante viene fortemente velocizzato.
Utile per controllare la qualità della inversa approssimata ossia il precondizionatore usato nel calcolo del Gradiente Coniugato.
Indirizzi utili ( si fa per dire )
http://www.elegio.it/doc/tn/ La crittografia del pierino ... forse non troppo tonto ( o dummy )
http://www.elegio.it/doc/tridia/sorgenti/alin_libesterna(operativa).txt
Notare che questa libreria è utilizzabile da chiunque su internet semplicemente scrivendo
<script type="text/javascript" src="http://www.elegio.it/doc/tridia/sorgenti/alin_libesterna(operativa).txt" > </script>
e naturalmente può ricopiarsi il file ed usarlo gratis e comodamente senza bisogno di stare collegato in rete.