Il processo di diagonalizzazione di una matrice è uno degli strumenti più potenti nell’analisi numerica e nell’algebra lineare, particolarmente quando si tratta di sistemi dinamici o di problemi legati alle trasformazioni. In questa sezione esploreremo come, tramite l’uso di matrici di rotazione, è possibile determinare i valori propri (autovalori) e i vettori propri (autovettori) di una matrice quadrata. Il procedimento si articola in diversi cicli di iterazioni che portano gradualmente alla diagonalizzazione della matrice.

Iniziamo con una matrice AA di dimensioni n×nn \times n, che rappresenta un sistema di equazioni o una trasformazione lineare. L’obiettivo è trovare i suoi autovalori e autovettori. L’approccio descrive l’utilizzo della tecnica delle rotazioni di Jacobi, una delle metodologie più utilizzate per ottenere la diagonalizzazione numerica di una matrice simmetrica.

Supponiamo di avere una matrice AA, la quale viene sottoposta ad un ciclo iterativo, che coinvolge la moltiplicazione della matrice AA per una matrice di rotazione RR. La matrice di rotazione viene costruita in modo tale che, applicando RR a AA, alcune sue componenti vengano annientate, rendendo la matrice più simile a una matrice diagonale ad ogni passo. La matrice di rotazione ha la forma:

R=(cosθsinθ0sinθcosθ0001)R = \begin{pmatrix}
\cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{pmatrix}

L'elemento angolare θ\theta viene scelto in modo che, dopo aver applicato la rotazione, il prodotto ARA R produca una matrice che si avvicina sempre di più ad una matrice diagonale, con valori prossimi agli autovalori di AA.

Nel primo ciclo, la matrice AA viene moltiplicata per la matrice di rotazione RR, ottenendo una matrice B=ARB = A R. La matrice BB continua ad evolversi, con l'obiettivo di avvicinarsi alla forma diagonale. Durante le iterazioni successive, la matrice BB viene progressivamente modificata, mentre i valori propri emergono chiaramente lungo la diagonale, mentre le componenti fuori diagonale tendono a diventare sempre più piccole, fino ad annullarsi completamente.

In un esempio pratico, se consideriamo la matrice AA con i seguenti elementi:

A=(210141014)A = \begin{pmatrix}
2 & 1 & 0 \\ 1 & 4 & 1 \\ 0 & 1 & 4 \end{pmatrix}

e applichiamo il ciclo di rotazioni di Jacobi, otteniamo in successive iterazioni valori sempre più prossimi ai valori propri della matrice. Ad esempio, nel primo ciclo la matrice AA si trasforma nella matrice BB, con un valore proprio (autovalore) di circa 1.585786, e così via, fino a ottenere una matrice completamente diagonale dopo un numero sufficiente di iterazioni.

Nel processo, l'evoluzione della matrice BB è legata ai vettori propri, che si ottengono anch'essi tramite la moltiplicazione successiva con le matrici di rotazione. A ogni ciclo, i vettori propri si affinano e, alla fine, rappresentano le direzioni principali della trasformazione lineare descritta dalla matrice AA.

Nel caso di una matrice più grande, come una 3×33 \times 3, il processo segue una logica simile. In un altro esempio, la matrice:

A=(121232124)A = \begin{pmatrix} 1 & 2 & 1 \\ 2 & 3 & 2 \\ 1 & 2 & 4
\end{pmatrix}

sottoposta al processo iterativo, darà come risultato valori propri vicini a -0.236068, 2 e 6, rispettivamente. Ogni passo di rotazione annienta progressivamente le componenti fuori diagonale, affinché la matrice si converta nella sua forma diagonale finale.

Questo processo è particolarmente utile per matrice simmetriche, dove i valori e i vettori propri sono sempre reali e la diagonalizzazione avviene senza difficoltà significative. L'accuratezza del risultato dipende dal numero di iterazioni: più cicli si effettuano, maggiore è la precisione nella stima dei valori propri. Tuttavia, la tecnica potrebbe risultare meno efficace o più lunga per matrici non simmetriche o per matrice che non possiedono autovettori ortogonali.

Alcuni aspetti importanti da tenere in considerazione durante l’applicazione di questo metodo sono la scelta iniziale della matrice AA, l’efficienza computazionale del processo, e la gestione di eventuali casi particolari come le degenerazioni (quando più autovalori sono uguali). Sebbene il metodo delle rotazioni di Jacobi sia semplice da implementare e molto efficace per matrici simmetriche, altre tecniche, come i metodi iterativi di Lanczos o le decomposizioni QR, potrebbero essere più adatti per matrici non simmetriche o con particolari caratteristiche numeriche.

Come vengono generati i numeri casuali: metodi e applicazioni

Una sequenza di numeri casuali autentici è per sua natura imprevedibile e, di conseguenza, non può essere riprodotta. I numeri casuali associati al lancio di una moneta, al decadimento di un nucleo in un processo radioattivo, o all'arrivo dei raggi cosmici sono considerati veramente casuali, almeno secondo le teorie scientifiche odierne. Con l'avvento dei computer, è però possibile generare numeri casuali utilizzando processi aritmetici sistematici. I numeri casuali calcolati mediante algoritmi informatici devono, per forza, contenere correlazioni, e per questo motivo non sono numeri realmente casuali. Questi vengono definiti numeri pseudo-casuali. La superiorità di un generatore di numeri casuali risiede nella sua capacità di nascondere queste correlazioni. In questa sezione si discuteranno diversi metodi per generare una sequenza di numeri casuali, si testerà quanto casualmente sono distribuiti i numeri e si esploreranno i casi in cui i numeri casuali sono stati utilizzati per risolvere determinati problemi: generare il lancio di un dado, calcolare il valore di pi greco (π) e valutare l'integrale utilizzando la tecnica di Monte Carlo.

Un esempio storico di metodo di generazione di numeri casuali pseudo-casuali è il metodo del "mid-square generator", utilizzato per la prima volta da John von Neumann nel 1951. Questo algoritmo parte da un numero seme, ad esempio un numero di 4 cifre. Il seme viene quindi elevato al quadrato, e i primi due e gli ultimi due numeri del risultato vengono scartati. Il numero risultante viene utilizzato come nuovo seme. La sequenza di numeri casuali nel range [0, 1] viene ottenuta dividendo successivamente i semi per 10.000. Ad esempio, se il seme iniziale è 7643:

  1. Quadrando il seme: 7643² = 58415449

  2. Scartando le prime due e le ultime due cifre: 4154

  3. Dividendo per 10.000: 0,4154 (primo numero casuale)

  4. Moltiplicandolo per 10.000 e utilizzandolo come nuovo seme: 4154

Questo processo continua iterativamente, generando una sequenza di numeri pseudo-casuali.

Tuttavia, questo metodo presenta delle limitazioni. Ad esempio, se uno dei numeri generati risulta essere 0.0100, questo si ripeterà indefinitamente, impedendo una vera casualità nella sequenza. Un altro esempio di metodo ampiamente utilizzato è il generatore lineare congruenziale, uno dei più noti e diffusi generatori di numeri pseudo-casuali. Il metodo funziona come segue: si prende un seme, lo si moltiplica per una costante "a", si aggiunge una costante "c", e il risultato viene diviso per una costante "m", mantenendo il resto come numero casuale. Questo numero viene quindi utilizzato come nuovo seme. Se sono necessari numeri casuali nell'intervallo [0, 1], il valore del resto viene diviso per "m". Ad esempio, dato un seme di 19, e utilizzando i seguenti valori di costanti: "a" = 57, "c" = 1 e "m" = 256, il processo di generazione dei numeri casuali è il seguente:

  1. Moltiplicare il seme per "a": 19 * 57 = 1083

  2. Aggiungere "c": 1083 + 1 = 1084

  3. Dividere per "m" e calcolare il resto: 1084 % 256 = 60

  4. Dividere il resto per "m" per ottenere il numero casuale: 60 / 256 = 0,234

Il seme successivo sarà il numero generato moltiplicato per 256. Questo metodo, pur essendo molto semplice, ha il vantaggio di produrre numeri che sembrano casuali e sono largamente utilizzati in molte applicazioni, anche se, come ogni altro metodo, presenta dei limiti.

Questi metodi vengono applicati in una vasta gamma di contesti, dalle simulazioni numeriche alla crittografia, alla generazione di numeri casuali per giochi e test statistici. Nonostante i numeri pseudo-casuali generati dai computer non siano perfettamente casuali, la loro utilità è indiscutibile, soprattutto quando i metodi per nascondere le correlazioni sono sviluppati con maggiore cura e precisione. La tecnica di Monte Carlo, che impiega numeri casuali per risolvere problemi complessi come il calcolo di integrali multidimensionali, ne è un esempio paradigmatico.

Il lettore deve tenere a mente che la generazione di numeri casuali è una questione di equilibrio tra precisione e praticità. Sebbene metodi come il generatore lineare congruenziale siano ampiamente utilizzati, la loro qualità dipende molto dalle costanti scelte. Con il miglioramento delle capacità computazionali, è oggi possibile generare sequenze di numeri casuali con metodi più avanzati, come i generatori basati su algoritmi criptografici, che cercano di evitare le problematiche di correlazione e prevedibilità.