diff --git a/AppFortran.tex b/AppFortran.tex deleted file mode 100644 index 67f01a6..0000000 --- a/AppFortran.tex +++ /dev/null @@ -1,245 +0,0 @@ -\chapter{Il fortran 95} -Il linguaggio di programmazione usato per implementare gli algoritmi è stato il FORTRAN, una -``minor revision''\footnote{non ho mai capito come si traduca veramente in italiano la parola -revision -- ogni suggerimento è bene accetto} del FORTRAN 90. \\ -Rispetto all versioni precedenti ci sono delle interessanti novità, per cui se state pensando -``Oddio, il FORTRAN nel 2009, non ci posso credere'' prima leggete il seguito\footnote{Ebbene sì, -è quello che ho pensato io, ma poi mi sono resoconto che il linguaggio aveva fatto dei progressi -dagli anni sessanta a questa parte}; è l'elenco delle cose che non mi aspettavo -\begin{enumerate}[(a)] - \item Allocazione dinamica della memoria; - \item Creazione di tipi astratti e overloading degli operatori; - \item Programmazione ad oggetti e polimorfismo (solo Fortran 2003/2008); -\end{enumerate} - -In ogni caso, in queste note includerò alcune righe su come si scrivono le prime righe di codice -in fortran. In codice Fortran saranno infatti riportati tutti gli esempi nella parte di esercitazione. - -\section{La sintassi} -\subsection{Hello World!} -Per una convenzione che di cui non so l'origine non è posibbile cominciare da qualcosa di diverso del -programma Hello World! Noi non saremo da meno. Cominceremo a guardare il codice e a commentarlo -passo passo.. - -\begin{lstlisting}[frame=tb,caption=Hello World,label=lst:helloworld] - PROGRAM helloworld - IMPLICIT NONE - WRITE(*,*) 'Hello World' - END PROGRAM -\end{lstlisting} - -Tutte le righe precedute da \lstinline-!- sono dei commenti e quindi vengono scartate -dal compilatore. Ad esempio '\lstinline-a = 1 ! Inizializzazione-' è equivalente a -'\lstinline-a = 1-'. - -L'istruzione \lstinline-PROGRAM helloworld- spiega al compilatore che questo è l'inizio del -nostro programma e che si chiamerà helloworld. Si aspetta di trovare alla fine un -\lstinline-END PROGRAM- che noi abbiamo prontamente inserito. - -L'istruzione \lstinline-IMPLICIT NONE- serve invece a disattivare delle convenzione che si -usavano nelle prime versione del fortran (e che esistono ancora per retrocompatibilità) -che stabiliscono che le variabili \lstinline-i,j,k- sono di tipo intero, mentre ad esempio -\lstinline-x,y,z- sono reali. Questo non è desiderabile in un linguaggio di programmazione -moderno in cui ci si aspetta di scrivere del codice comprensibile. - -Infine l'istruzione \lstinline-WRITE(*,*)- scrive sull stdout\footnote{che, nelle maggior parte -dei casi, coincide con il monitor} tutti gli argomenti che gli si passano dopo. \`E possibile -controllare la formattazione di quello che viene stampato ma, come è simboleggiato dagli asterischi, -per ora non ce ne stiamo preoccupando. - -\subsection{La struttura} -Un programma in FORTRAN ha una struttura prefissata: -\begin{lstlisting}[label=lst:fotranstruct,frame=tb] - PROGRAM nomeprogramma - IMPLICIT NONE - ! Specificazioni: in questa parte si trova la dichiarazione - ! delle variabili e dei nuovi tipi - - ! Parte di esecuzione: qui troviamo il codice vero e proprio che - ! viene eseguito - - ! Subroutine: qui troviamo la definizione dei sottoprogrammi che - ! possono venire chiamati dalla parte di esecuzione - END PROGRAM -\end{lstlisting} -\subsection{I tipi} -Come il C e tutti i linguaggi che vantano una certa storia il FORTRAN è un linguaggio tipato, -ovvero ogni variabile ha un tipo (ad esempio intero) e non gli si possono assegnare valori -di tipi differenti. \\ -Si possono aggiungere delle parole chiave alle dichiarazioni di tipi, più precisamente -\begin{itemize} - \item \lstinline-PARAMETER-: questa indica che la variabile non verrà modificata, è semplicemente - un parametro per il programma. - \item \lstinline-ALLOCATABLE-: Questo parola chiave indica che la memoria per la variabile verrà - allocata esplicitamente in un secondo momento, è particolarmente utile con l'altra parola chiave - \item \lstinline-DIMENSION-: questa permette di speicificare che la variabile dichiarate è un array - e la sua relativa dimensione (Esempio: \lstinline- INTEGER, DIMENSION(5) :: vec-); è possibile specificare - \lstinline-:- come dimensione, nel qual caso il compilatore assumerà che la dimensione verrà determinata - in un secondo momento. Un caso tipico è la creazione di un vettore la cui dimensione verrà determinata - a run-time\footnote{ovvero durante l'esecuzione.}; questo si può realizzare con un codice di questo tipo - \begin{lstlisting}[frame=tb] - PROGRAM allocatore - INTEGER , ALLOCATABLE :: i - INTEGER :: size - ! Leggo da tastiera la dimensione dell'array e lo alloco - READ(*,*) size - ALLOCATE(i(size)) - END PROGRAM - \end{lstlisting} - -\end{itemize} -I tipi principali presenti in Fortran sono -\begin{itemize} - \item \textbf{Interi}: Sono denotati dalla parola chiave \lstinline-INTEGER- e sono appunto numeri - interi. Generalemente occupano $4$ byte. - \item \textbf{Reali}: Numeri reali, che vengono memorizzati come floating point. La parola chiave - è \lstinline-REAL- e occupano generalmente $4$ byte. Per i nostri scopi questi sono pochi, e quindi - useremo in generale il seguente trucchetto: - \begin{lstlisting}[frame=tb] - INTEGER, PARAMETER :: db = KIND(0.D0) - REAL(dp) :: real_var - \end{lstlisting} - che si occuperà di assegnare al tipo \lstinline-REAL- dichiarato la stessa dimensione delle costante di tipo - \texttt{double} \lstinline-0.D0-. -\end{itemize} - -\subsection{Input e Output} -Per iniziare ci basterà conoscere le istruzioni di stampa su schermo e lettura da tastiera, che sono rispettivamente -\begin{itemize} - \item \lstinline-WRITE(*,*) dato_1, dato_2 , ...- che si occuperà di scrivere sullo schermo (identificato dal primo - \lstinline-*-) e con una formattazione standard (identificata dal secondo \lstinline-*-) i dati che gli inseriamo dopo; - \item \lstinline-READ(*,*) var_1, var_2, ...- che si occuperà di leggere da tastiera (il primo \lstinline-*-) i dati - in un formato standard (il secondo \lstinline-*-); -\end{itemize} -In realtà queste istruzioni ci permettono di controllare anche formattazioni e sorgenti e destinazioni di Input e Output. -Per scrivere (o leggere) su un file è prima necessario \textbf{aprirlo}. Per fare questo bisogna eseguire una -chiamata alla funzione \lstinline-OPEN()-. Questa si occuperà di aprire un file da noi indicata ed assegnarlo ad -un numero intero, anche quello indicato da noi. Bisogna fare attenzione in quest'ultimo passaggio a ricordare -che \lstinline-5- e \lstinline-6- sono già riservati alla tastiera ed allo schermo. -Potremmo poi fare riferimento (sia in lettura che in scrittura) -a quel determinato file sostituendo quell'intero a \lstinline-*-. Questo codice probabilmente chiarirà meglio la questione. -\begin{lstlisting}[frame=tb] - PROGRAM CopiaIncolla - IMPLICIT NONE - - ! Dichiaro delle variabili intere di tipo PARAMETER - ! per contenere gli interi con cui poi mi riferiro' ai file. - ! Sarebbe infatti complicato dover ricordare tanti numeri - ! a memoria e renderebbe il codice meno leggibile - INTEGER, PARAMETER :: infile = 11, outfile = 12 - INTEGER :: j - INTEGER :: buf - - ! Cerco di aprire il file in.txt - OPEN(FILE='in.txt', UNIT=infile) - - ! E anche il file out.txt - OPEN(FILE='out.txt', UNIT=outfile) - - ! Leggo le prime 10 righe da questo file - ! e le scrivo su out.txt, raddoppiate (assumendo - ! che siano interi) - DO j=1,10 - READ(infile,*) buf - WRITE(outfile,*) buf * 2 - END DO - - ! Alla chiusura del programma anche tutti i file vengono chiusi, - ! e quindi questo rende le prossime righe superflue. Pero' e' buona - ! norma ricordarsi di chiudere i file che si sono aperti, e quindi - ! lo facciamo - CLOSE(infile) - CLOSE(outfile) - - END PROGRAM -\end{lstlisting} -Abbiamo qui introdotto anche la chiamata \lstinline-CLOSE()- che serve appunto per -chiudere un file. \`E normalmente buona norma chiudere tutti i file che si aprono e quindi, -in programma corposi, conviene sempre scrivere la chiamata ad \lstinline-OPEN()- insieme -alla chiamata \lstinline-CLOSE()- per evitare di dimenticarla. - -\section{Subroutine} -Mano a mano che il programma cresce diventerà necessario razionalizzare la disposizione di -funzioni e strutturare meglio il listato. In particolare siamo interessati a scrivere delle -funzioni che si occupino di svolgere un determinato compito in modo che poi possiamo chiamarle -senza preoccuparci (troppo) di come sono implementate. -Quelle che in C si chiamavano funzioni in Fortran si chiamano \emph{subroutine}. La sintassi -per una subroutine assomiglia molto a quella di un programma: -\begin{lstlisting}[frame=tb,caption=Una subroutine] - SUBROUTINE nome(...) - ! [ Dichiarazioni ] - ! [ Corpo della subroutine ] - END SUBROUTINE -\end{lstlisting} -Una particolarità per così dire ``curiosa'' è che le variabili passate alla subroutine dovranno -essere ridichiarate all'interno della stessa perché essa ci possa accedere. Le variabili inoltre -vengono sempre passate per riferimento (quello che succede in C passando per riferimento o quello -che succede in C++ passando una reference) e, per conludere, non c'è un'istruzione di ritorno\footnote{% -O perlomeno, non ne ho mai incontrate. Notare però che programmo in fortran da pochi giorni e quindi.. potrei -scoprirle prossimamente :) }. -Ci saranno quindi variabili di Input e variabili di Output\footnote{in realtà in FORTRAN esistono -anche delle funzioni, che come in C ritornano dei valori; noi non le scriveremo (e quindi in particolare -non ne ho mai scritta una) e quindi non sono qui esposte. Nonostante questo verranno utilizzate -nel corso funzioni interne del fortran come \lstinline-RESHAPE()- o \lstinline-MATMUL()-. }, ma tutte insieme nella chiamata della funzione. -Per chiarire le idee, e spiegare i passaggi che mancano, proponiamo un esempio di una funzione che prenda un -numero e lo moltiplichi per due\footnote{che esempio inutile, direte voi\ldots e avete anche ragione ma -in questo momento non mi viene in mente niente di più costruttivo} -\begin{lstlisting}[frame=tb,caption=Un semplice programma che fa uso di subroutine] - ! Questo programma prende in input un numero e lo moltiplica per due; - ! Di per se' e' piuttosto inutile ma mostra come si utilizza una subroutine - ! nell'ambito di un programma - - PROGRAM sub_doppio - - REAL :: x; - ! Leggo dallo standard input x - READ(*,*) x; - - ! Lo moltiplico per due facendo uso della subroutine - CALL doppio(x); - - ! Lo stampo. Atttenzione! La subroutine ha modificato il vero - ! valore di x perche' le ho di fatto passato un puntatore - WRITE(*,*) x; - -! Terminiamo l'esecuzione del programma principale. -END PROGRAM sub_doppio - -SUBROUTINE doppio(x) - REAL :: x; - x = x * 2; -END SUBROUTINE doppio -\end{lstlisting} -Naturalmente si possono fare esempi molto più complessi, e soprattutto più utili. Ad esempio, supponiamo -di implementare la subroutine \lstinline-dotprod- che avevamo pensato parlando del pagerank per fare il prodotto -matrice vettore con una matrice sparsa. Non la riportiamo qui perché è già stata scritta (si veda il Listato~\ref{lst:matrixvec}) -ma commentiamo alcuni fatti: -\begin{itemize} - \item Le keyword \lstinline-INTENT(IN)- e \lstinline-INTENT(OUT)- servono per l'appunto a specificare se una variabile - è da considerarsi di input o di output. Questo di fatto non cambia nulla, a parte che il compilatore ci avviserà - se tentiamo di modificare variabili di input; - \item La \lstinline-SUBROUTINE- può venir scritta in un file separato e poi linkata insieme al file eseguibile che - la richiama. Spiegheremo meglio questo concetto con un esempio; -\end{itemize} - -Supponiamo di avere scritto la subroutine in un file di nome \verb-dotprod.f90-, e di aver successivamente -scritto un listato \verb-matrici.f90- in cui compaia l'istruzione \lstinline-CALL dotprod(...)-. Sarebbe tedioso -dover copiare il contenuto del file \verb-dotprod.f90- all'interno di \verb-matrici.f90- per poi compilarlo. -In effetti esiste un metodo più pratico per agire. -\begin{enumerate} - \item Compilare i file sorgenti separatamente, senza creare l'eseguibile ma solamente i \emph{file oggetto} - che contengono la versione compilata del listato, senza che le referenze siano stare risolto. Questo significa - che all'interno del file oggetto associato a \verb-matrici.f90- ci sarà una chiamata ad una \lstinline-dotprod()- - senza che abbia la minima idea di dove andare a prenderla; questa operazione si realizza su Linux con \verb-f95- in questo - modo: \\ - \verb+# f95 -c dotprod.f90 matrici.f90+ - - \item Il secondo passo consiste nel creare un eseguibile unico con le dipendenze risolte, ovvero in cui ci sia - la chiamata a \lstinline-dotprod()- ma questa volta sia chiaro dove poterla trovare\footnote{sono conscio che questa - spiegazione non è molto chiara. Cercherò di migliorarla}; questo compito viene eseguito dal \emph{linker} che, su Linux, - fa ancora parte di \verb-f95-\footnote{forse si portebbe discutere sulla correttezza di questa affermazione, in ogni caso noi - daremo il comando f95 per eseguire l'operazione. Quello che poi lui faccia davvero, compreso chiamare altri programmi, - per il momento non è affar nostro}; il comando è il seguente: \\ - \verb+# f95 -o matrici matrici.o dotprod.o+ -\end{enumerate} - diff --git a/AppPageRank.tex b/AppPageRank.tex deleted file mode 100644 index 846473e..0000000 --- a/AppPageRank.tex +++ /dev/null @@ -1,352 +0,0 @@ -\chapter{Page Rank} -In questo capitolo ci porremo il problema di calcolare il \emph{page rank} di un determinato -insieme di pagine Web (o, analogamente, documenti \emph{ipertestuali}). \\ -Con Page Rank intendiamo un ``valutazione'' data ad una determinata pagina o documento con lo scopo -di stimare la sua importanza\footnote{che è ovviamente un concetto poco matematico, ma ci occuperemo -di formalizzarlo meglio in seguito.}. Un algoritmo derivato da quello che verrà in seguito -esposto è utilizzato attualmente da Google (\href{http://www.google.it}{http://www.google.it}) -per ordinare i risultati di una query nel suo motore di ricerca, così come da tutti i principali -\emph{search engine} presenti sul Web. - -\section{Presentazione del modello} -Prima di tutto dobbiamo occuparci di definire il modello matematico che vogliamo usare -per schematizzare la nostra valutazione di importanza. \\ -In generale l'idea che sta alla base del Page Rank è dare importanza ad una pagina -basandosi sui link\footnote{Un link in una pagina Web, ma anche in un documento PDF come questo, -è un ``puntatore'' ad un altro documento. In genere l'utente può attivare il puntatore semplicemente -cliccandoci sopra con il mouse} che in essa sono presenti. - -Alcune idee che potrebbero sembrare valide potrebbero essere valutare l'importanza di una pagina -in base al numero di link presenti nella pagina, oppure al numero di link che puntano ad essa. - -Dopo una breve riflessione ci si rende conto che entrambi i metodi introducono svariate problematiche -di affidabilità. In generale, infatti, il creatore di una pagina ha il controllo di quanti link -sono presenti in una pagina, e non fatica molto a creare delle pagine fittizie che puntano a quella -appena creata. La valutazione sarebbe quindi falsata e molto vulnerabile a frode. - -Si può però cercare di affinare l'idea di base in modo da risolvere questi inconvenienti. -Per convenzione assumiamo di numerare tutte le pagine presenti nel Web con dei numeri naturali -$1 \ldots N$ (dove $N$ è un numero dell'ordine di $10^{10}$). -Fissata una certa pagina $j$ consideriamo i link che puntano a lei. Risulta chiaro che non solo -il \textbf{numero} dei link è importante per valutare la sua importanza, ma a sua volta anche l'\textbf{importanza} -di questi dovrebbe influire. Per esempio, se la homepage di Yahoo! punta -alla pagina di una data persona, è naturale che questa pagina acquisisca una certa rilevanza. Viceversa, se sulla -mia pagina personale metto un link al sito della stessa persona l'importanza di questo varia di poco\footnote{ -a meno che nel momento in cui voi leggiate queste pagine io non sia diventato una persona con una certa influenza, -ma questo è probabilmente un caso da scartare}. -Un'ultima e non meno importante considerazione è che se anche Yahoo! punta al mio sito ma lo fa in una pagina -con un altro centinaio di link è una faccenda molto diversa dall'essere puntati dall'unico link in homepage. - -Stiamo quindi arrivando ad un altro modello, in cui le pagine \emph{distribuiscono la loro importanza fra i link al -loro interno}. Questo modello è molto più ragionevole del precedente, ed è molto meno predisposto a dare -risultati falsati. Vorremo però averne una descrizione matematica precisa. - -\section{Un po' di matematica} -Consideriamo la matrice quadrata $H = (h_{ij})$, che chiameremo \emph{matrice delle connessioni}, definita -nel seguente modo -\[ - h_{ij} = \left\{ \begin{array}{ll} - 1 & \text{se esiste un link dalla pagina} \ i \ \text{alla pagina} \ j \\ - 0 & \text{altrimenti} - \end{array} \right. -\] -Questa matrice avrà dimensione $N \times N$ ma sarà sparsa, ovvero la maggior parte dei suoi valori saranno $0$. -Per fissare le idee consideriamo la Figura~\ref{fig:web}, un modello (molto) semplificato del Web, in cui esistono solamente -3 pagine. -\begin{figure}[hb] -\[ - \xymatrix{ -{\bullet{1}} \ar@/_/[dr] \ar@/^1pc/[drr] & \\ - & {\bullet{2}} \ar@/_/[ul]& {\bullet{3}} \ar@/^/[l]} -\] -\caption{Esempio di una rete composta da 3 pagine} -\label{fig:web} -\end{figure} - -La matrice di connessione $H$ associata a questo grafo è la seguente -\[ - H = \left[ \begin{array}{ccc} - 0 & 1 & 1 \\ - 1 & 0 & 0 \\ - 0 & 1 & 0 - \end{array} \right] -\] -\begin{os} \label{os:pageranknumcoll} - \`E facile verificare che valgono le seguenti uguaglianze - \[ - \left\{ \begin{array}{ll} - \sharp \{ \text{collegamenti uscenti da} \ i \} & = \sum_{j=1}^{N} h_{ij} \\ - \sharp \{ \text{collegamente che arrivano a} \ j \} & = \sum_{i=1}^{N} h_{ij} - \end{array} \right. - \] -\end{os} -In particolare sarebbe piuttosto immediato calcolare, partendo dalla matrice $H$, i valori -del Page Rank con i metodi ipotizzati all'inizio del capitolo (per altro reputati incompleti) - -Siamo dunque interessati a calcolare il vettore $W$ dove $w_i$ è l'importanza della pagina $i$, -in modo che rispetti le linee guide definite precedentemente. - -Chiamiamo $d_i$ il numero di link uscenti dalla pagina $i$ -(facilmente calcolabile come visto nell'Osservazione~\ref{os:pageranknumcoll}). Chiameremo inoltre -$D$ la matrice con i $d_i$ sulla diagonale e nulla per i restanti valori. -Introdotta questa notazione, secondo il nostro modello ogni componente di $W$ dovrebbe rispettare -la seguente equazione -\[ - w_j = \sum_{i=1}^{N} w_i \frac{h_{ij}}{d_i} -\] -che rappresenta esattamente l'idea che l'importanza di ogni pagina è la somma delle importanze di quelle -che la linkano, in cui ogni addendo è normalizzato sul numero di link uscenti\footnote{probabilmente l'equazione -è molto più chiara di questa frase, ma non commentare mi sarebbe sembrato inopportuno}. -\`E quindi chiaro come il nostro problema si sia trasformato in un problema di autovalori ed autovettori. In -particolare, se poniamo $M = D^{-1}H$ la nostra richiesta si può scrivere nella forma più compatta -$\trasp{W} = \trasp{W}M$, ovvero $\trasp{W}$ è un autovettore sinistro di $M$. Sorgono spontanee alcune -domande a cui dobbiamo rispondere prima di procedere oltre. -\begin{enumerate}[(a)] - \item \label{en:pagerank:a} Cosa succede se per qualche $i$ si ha $d_i = 0$? Stiamo tacitamente assumendo che $D$ sia invertibile - ma questo non è garantito a priori; - \item \label{en:pagerank:b} L'autovalore $1$ fa parte dello spettro delle matrice $M$? Se questo non fosse vero la nostra - richiesta non ammette soluzione, e quindi possiamo rinunciare in partenza alla nostra idea; - \item \label{en:pagerank:c} Se l'autovettore $W$ esiste, è unico\footnote{In realtà ci stiamo chiedendo se il suo -autospazio ha dimensione $1$. Siamo ben consci che se ne troviamo uno ogni suo multiplo scalare continuerà -ad essere un autovettore. Per altro, moltiplicare le valutazioni omogeneamente per lo stesso cofficiente non -sarebbe in nessun modo un problema}?. Se così non fosse - sorgerebbero dei seri problemi su come interpretare i risultati ottenuti; - \item \label{en:pagerank:d} Possiamo scegliere l'autovettore $W$ in modo che $w_i \geq 0$ per ogni $i$? Questo non è necessario, - a priori, ma sembrerebbe coerente fare in modo che delle votazioni siano numeri positivi; -\end{enumerate} - -Cominciamo col rispondere alla domanda~(\ref{en:pagerank:a}). Ovviamente potrebbe benissimo succedere -che per qualche $i$ $d_i = 0$. Questi ``nodi'' vengono chiamati \emph{dangling node}, ovvero ``nodi penzolanti'', -che non portano a niente. Per risolvere questo problema si sostituisce la matrice $H$ con una matrice $\hat H$ -tale che se $h_{ij} = 0 \: \forall j$ allora $\hat h_{ij} = 1 \: \forall j$, e in caso contrario $\hat h_{ij} = h_{ij}$. -Questa matrice risolve evidentemente il problema e cambia di poco il modello. Supporre che una determinata pagina -non distribuisca la sua importanza a nessuno o la distribuisca in maniera analoga a tutti non è un gran cambiamento. - -La domanda~(\ref{en:pagerank:b}) ha invece una risposta immediata. Sì, l'autovalore $1$ fa parte dello spettro -ed un autovettore (destro) a lui associato è quello composto di tutti $1$. La verifica è un banale conto. - -Per rispondere alle domande~(\ref{en:pagerank:c}) e (\ref{en:pagerank:d}) ci appoggiamo ad un risultato -che non dimostreremo (in questa sede) ottenuto da Perron-Frobenius sulla Teoria delle Matrici non negative. -\begin{te}[di Perron-Frobenius] \label{te:PerronFrobenius} - Se $A$ è irriducibile allora $\rs{A} > 0$ è un autovalore semplice ed - esistono $x,y$ autovettori destro e sinistro - con componenti strettamente positive. -\end{te} -\begin{os} - Sembrerebbe, a priori, che non siamo in grado di determinare il raggio spettrale di $A$. Consideriamo però - che $1$ è nello spettro e che $||A||_{\infty} = 1$ e ogni norma indotta supera il raggio spettrale. Si può - quindi concludere che $\rs{A} = 1$ e applicare il Teorema~\ref{te:PerronFrobenius}. -\end{os} -Sfortunatamente si può osservare che, pur con tutte queste buone proprietà, in generale i metodi applicati -per trovare l'autovettore (il metodo delle potenze) potrebbe non essere convergente, perché gli autovalori -diversi da $1$ potrebbero ancora avere modulo $1$\footnote{Come visto nella teoria, la velocità di convergenza -del metodo di iterazione è data dal rapporto fra il più grande autovalore diverso da quello di cui si sta cercando -l'autovettore e l'autovalore in questione. In questo caso il rapporto potrebbe essere $1$, che darebbe una situazione -di non convergenza}. -Introduciamo una definizione che ci permetterà di formalizzare meglio il problema. -\begin{de} - Una matrice $A$ si dice \emph{ciclica} se esiste un sottoinsieme dei suoi autovalori $J \subseteq \spe{A}$ - tale che $\forall \lambda,\mu \in J$ si ha che $|\lambda|=|\mu|$. -\end{de} -Per superare questa difficoltà si può, ancora una volta, modificare il modello. Fissiamo $\gamma > 0$ e consideriamo -che il visitatore -possa in ogni momento, con probabilità $1-\gamma$, decidere di aprire una pagina a caso. Potremmo rappresentare -questa nuova situazione sostituendo $M$ con la matrice -\[ - A = \gamma M + (1-\gamma) \left[ \begin{array}{c} - 1 \\ - \vdots \\ - 1 - \end{array} \right] \left[ 1 \: \hdots \: 1 \right] -\] -ovvero con una combinazione convessa della matrice $M$ con la matrice di soli $1$. Il valore di $\gamma$ si può -scegliere a piacimento; Google usa un valore $\gamma = 0.85$. In questo caso la matrice $A$ non ha elementi nulli -e quindi è irriducibile e non è ciclica\footnote{La condizione di ciclicità è quella che crea problemi -con gli autovalori di modulo uguale al raggio spettrale}. Possiamo infine utilizzare un'altra versione del Teorema~\ref{te:PerronFrobenius} -che dice -\begin{te} - Sia $A$ una matrice con elementi strettamente positivi. Allora per ogni suo autovalore $\lambda \neq \rs{A}$ si ha - che vale la diseguaglianza $|\lambda| < |\rs{A}|$. -\end{te} -Quest'ultimo ci assicura la convergenza del nostro metodo. - -\subsection{Implementazione del metodo delle potenze} -Presenteremo in questa sezione una versione del metodo delle potenze adattata alle nostre esigenze. -Consideriamo la matrice $A$ di cui vogliamo trovare l'autovettore sinistro relativo all'autovalore $1$. -Sappiamo che esiste la forma di Jordan di $A$ ed in particolare una matrice $S$ tale che -\[ - S^{-1} A S = J \qquad J = \left[ \begin{array}{c|cc} - 1 & \multicolumn{2}{|c}{\herm{0}} \\ \hline - \multirow{2}{*}{$0$} & \sblocke{\hat J}{2} \\ - & & - \end{array} \right] -\] -Osserviamo ora che $e_1$ è autovettore destro di $J$ ed anche autovettore sinistro. Entrambi sono relativi -all'autovalore $1$. Sappiamo quindi che $e = Se_1$ è autovalore destro di $A$ e quindi è il vettore -con tutte le componenti uguali ad $1$, mentre $\trasp{w} = \trasp{e_1}S^{-1}$ è autovettore sinistro di $A$, -ovvero il vettore che stiamo cercando. -In particolare quanto visto nella precedente sezione ci assicura che $\rs{\hat J} < 1$ e quindi possiamo osservare -che -\[ - \lim_{k\to\infty} J^{k} = e_1\trasp{e_1} \quad \text{e quindi} \quad \lim_{k\to\infty} A^{k} = - \lim_{k\to\infty} SJ^kS^{-1} = Se_1 \trasp{e_1}S^{-1} = e\trasp{w} -\] -Questo (apparentemente) risolve il nostro problema in quanto $e\trasp{w}$ non è altro che la matrice le cui -righe coincidono con il vettore $\trasp{w}$ che è precisamente quanto stiamo cercando. \\ -La complessità di questo calcolo non è però trascurabile, in quanto la moltiplicazione di una matrice -costa in generale $O(n^3)$, decisamente troppo se $n \approx 10^{10}$ come nel nostro caso. -\begin{os} - Consideriamo dunque un vettore $x_0$ tale che $\trasp{e}x_0 = 1 = ||x_0||_{1}$, e definiamo la successione per ricorrenza - \[ - \left\{ \begin{array}{ll} - \trasp{x_0} & = \trasp{x_0} \\ - \trasp{x_{k+1}} & = \trasp{x_{k}} A - \end{array} \right. - \] -Possiamo notare che in generale $x_k = x_0 A^{k}$ e quindi data la nostra scelta oculata di $x_0$ abbiamo -che -\[ - \lim_{k\to\infty} \trasp{x_k} = \lim_{k\to\infty} \trasp{x_0} A^{k} = x_0 e \trasp{w} = \trasp{w} -\] -In questo modo siamo scesi da una complessità $O(n^3)$ ad una $O(n^2)$. -\end{os} -Sfortunatamente $O(n^2)$ nel nostro caso continua ad essere un numero troppo grande; arrivati a questo -punto ci accorgiamo che possiamo sfruttare la particolarità di $A$, che non è assolutamente -una matrice qualsiasi! Sappiamo infatti che è composta quasi esclusivamente di zeri, e quindi una -memorizzazione efficiente ci permetterebbe anche un'implementazione efficiente dei procedimenti -di moltiplicazione. -%% TODO: QUalcosa di più sull'implementazione del metodo - -\subsection{Note tecniche} -Analizzato il problema matematicamente, sorge il bisogno di analizzare le difficoltà di implementazione dovute -all'hardware attualmente disponibile. Una matrice delle dimensioni di $A$ non è realmente memorizzabile -elemento per elemento su nessun calcolatore, e non è pensabile nemmeno in alcun tipo di cluster. \\ -Un rapido conto mostra come, anche ipotizzando di usare dei tipi \verb-float- a 4 byte (in ogni -caso presumibilmente troppo imprecisi) otteniamo uno spazio necessario di $N^2 \cdot 4$ byte, ovvero -circa $10^{20}$ byte = $10^{11}$ GB di RAM, probabilmente un quantitativo superiore a quella di tutti i computer -del mondo messi assieme\footnote{può darsi che nei prossimi anni quest'affermazione smetta di essere vera, ma -non penso sia rilevante ai fini del problema}. -Dobbiamo quindi adottare degli stratagemmi per gestire la memoria in modo efficiente. - -Una prima osservazione è che la nostra matrice $A$ si può scrivere nel seguente modo -\[ -A = \gamma D^{-1} \hat H + (1-\gamma) e\trasp{v} -\] -dove $\gamma$ e $w$ sono rispettivamente il parametro ed il vettore di personalizzazione. Per memorizzare -$A$ possiamo quindi memorizzare $D$ ed $\hat H$, $\gamma$ e $w$. \\ -Questo ci dà dei vantaggi perché la matrice $\hat H$ è ``quasi nulla'' nel senso che è fatta solamente di $0$ ed $1$, -ma la percentuale di $0$ è molto alta\footnote{è infatti presumibile che il numero di link uscenti da una pagina -sia trascurabile rispetto al numero di pagine esistenti}. Possiamo quindi limitarci a memorizzare i seguenti dati: \\[5pt] -\begin{tabular}{|lll|} \hline - \textbf{Variabile} & \textbf{Descrizione} & \textbf{Spazio occupato} \\ \hline \hline - $N$ & l'ordine della matrice $A$, ovvero il numero di pagine esistenti & 4 byte \\ - $m$ & il numero di campi di $\hat H$ diversi da $0$ & \textasciitilde $N$ byte \\ - $i, j$ & vettori delle coordinate dei campi diversi da $0$ di $\hat H$ & \textasciitilde $N$ byte \\ - $\gamma$ & coefficiente di personalizzazione & 4 byte \\ - $w$ & Vettore di personalizzazione & \textasciitilde $N$ byte \\ - $d$ & il vettore con gli elementi diagonali di $D$ & \textasciitilde $N$ byte \\ -\hline \end{tabular} \\ - -Possiamo ora porci il problema di calcolare $d$. Questo è reso apparentemente più complicato dal modo in cui abbiamo salvato -la matrice. In realtà possiamo usare un algoritmo di questo tipo - -\begin{lstlisting}[frame=tb,caption=Calcolo di $d$,label=lst:calcolovettorepers]{} - ! Inizializziamo il vettore d a 0 - d = 0; - ! Questo ciclo calcola i link uscenti da i per ogni i - DO k=1,m - d(i(k)) = d(i(k)) + 1 - END DO -\end{lstlisting} - -\begin{os} - L'aver scelto questo tipo di memorizzazione per la matrice non solo non complica i generali procedimenti - di moltiplicazione, ma riduce addirittura la complessità di questi perché iteriamo sugli elementi diversi da - $0$ invece che su tutti. -\end{os} - - -\section{Una prima implementazione} -In questa sezione ci occuperemo di presentare una prima implementazione della soluzione al problema. -Non ci preoccuperemo troppo di ottimizzare il codice, compito che affronteremo in seguito. -Esporremo inizialmente la struttura generale del programma e poi costruiremo tutte le subroutine necessarie. - -\subsection{La struttura} -Il programma dovrà comporsi delle seguenti parti -\begin{description} - \item[Lettura della matrice] Supporremo di avere un file da cui leggere i dati della matrice. Dobbiamo - definire la sintassi del file e scrivere un subroutine per caricarlo in memoria; - \item[Calcolo del vettore d] Data la matrice di connessione $H$ vorremo calcolare la somma di ogni - riga che ci servirà in seguito per rinormalizzare il vettore di iterazione; - \item[Iterazione] Generiamo un vettore $x$ casuale e lo riscaliamo in modo che $\trasp{e} x = 1$. Fatto - questo cominciamo a calcolare l'iterazione, fino a che l'errore non è piccolo o ragguingiamo il massimo - numero di iterazioni impostato; - \item[Salvataggio] Salviamo su un file il vettore calcolato; -\end{description} - -Per questo avremo bisogno anche di alcune subroutine, ad esempio quella che ci calcoli il prodotto matrice -vettore data la matrice sparsa come l'abbiamo intesa noi. - -\subsection{Prodotto di matrice sparsa per un vettore} -Esponiamo qui un'idea di codice per calcolare questo prodotto matrice vettore. Ricordiamo che per noi una -matrice sparsa è composta di due scalari \lstinline-n-,\lstinline-m- (rispettivamente dimensione e numero di elementi diversi da $0$) -e due vettori \lstinline-i-, \lstinline-j- di dimensione $m$ che sono le coordinate dei punti che valgono $1$.\\ -Il codice è il seguente -\begin{lstlisting}[frame=tb,caption=Calcolo del prodotto matrice vettore,label=lst:matrixvec] - SUBROUTINE dotprod(n,m,i,j,d,x,v,y) - IMPLICIT NONE - ! Il parametro dp dei tipi a doppia precisione - INTEGER, PARAMETER :: dp = KIND(0.D0) - - ! Dichiarazione degli argomenti della funzione - INTEGER, INTENT(IN) :: n,m - INTEGER, DIMENSION(m), INTENT(IN) :: i,j - INTEGER, DIMENSION(n), INTENT(IN) :: d - REAL(dp), DIMENSION(n), INTENT(IN) :: x, v - - ! Dato di output - REAL(dp), DIMENSION(n) :: y - - ! Alcune variabili di comodo - REAL(dp), DIMENSION(n) :: xx - REAL(dp) :: s, gamma = 0.85 - INTEGER :: k - - ! Calcoliamo x trasposto per la matrice D con i d(i) sulla - ! diagonale, e salviamolo in xx, in modo da non modificare x - ! Ricordiamo che i dati in fortrano vengono sempre passati per - ! riferimento! Se modificassimo x qui dentro risulterebbe cambiato - ! anche all'esterno. - DO k=1,m - IF(d(k)/=0) THEN - xx(i(k)) = x(i(k))/d(k) - ELSE - xx(i(k)) = x(i(k))/n - END IF - END DO - - ! Ora eseguiamo la moltiplicazione di xx per la parte non dangling - ! della matrice H cappuccio e salviamo il risultato in y - y = 0.D0 - DO k=1,m - y(j(k)) = y(j(k)) + xx(i(k)) - END DO - - ! Ora calcoliamo le righe dangling dalle quali prima non siamo "passati" - ! perche' i(k) scorre solo sulle righe dove ci sono elementi non nulli - DO k=1,n - IF(d(k) == 0) - s = s + xx(k) - END IF - END DO - - ! Sommiamo i due contributi - y = y + s - - ! Calcolo la personalizzazione - y = y * gamma + (1-gamma)/n - - END SUBROUTINE dotprod -\end{lstlisting} - -%TODO: Presentare un'implementazione completa del programma \ No newline at end of file diff --git a/AppVibrazioni.tex b/AppVibrazioni.tex deleted file mode 100644 index c35f1dc..0000000 --- a/AppVibrazioni.tex +++ /dev/null @@ -1,361 +0,0 @@ -\chapter{Studio delle Vibrazioni} - -In questo capitolo ci occuperemo di capire come si comporta un sistema elastico, ovvero -un sistema di masse collegate da mollle. In questo modo potremo modellizzare, ad esempio, -strumenti musicali (come le corde di una chitarra o un tamburo) o un generale sistema -dinamico costituito da masse e molle. %TODO: Inserire qualche altro esempio pratico - -\section{Sistemi discreti} -\subsection{L'oscillatore armonico} -Il nostro scopo sarà, principalmente, risolvere sistemi complicati la cui soluzione esatta non -si riesce a calcolare (o non si riesce a farlo agevolmente) direttamente con un foglio ed una penna, -ma per capire di cosa ci occuperemo -è utile cominciare con un esempio noto. \\ -\begin{wrapfigure}{l}{70mm} -\begin{tikzpicture}[scale=0.8] - % Il terreno - \draw[->] (0,0) -- (7,0) node[anchor=south west] {$x$}; - - % La parete - \draw (1,0) -- (1,2.8); - \foreach \i in {0,...,12} - \draw (1,0.2 * \i) -- (0.8, 0.2*\i + 0.2); - - % La molla - \begin{scope}[thick] - \foreach \i in {1,1.5,...,3.5} - \draw (\i,0.5) -- (\i+0.25,1); - \foreach \i in {1,1.5,...,3.5} - \draw (\i+0.25,1) -- (\i+0.5,0.5); - - % E la massa - \draw (4,0) rectangle (5.5,1.5); - \fill[gray!28] (4,0) rectangle (5.5,1.5); -\end{scope} - -\end{tikzpicture} \caption{L'oscillatore armonico} \label{fig:vib:oscarm}\end{wrapfigure} -Consideriamo il sistema costituito da una massa $m$ attaccata tramite una molla di costante -elastica $K$ e lunghezza a riposo nulla ad una parete (tralasciando la gravità), ovvero il sistema -in Figura~\ref{fig:vib:oscarm}.\\ -Questo è un problema di cui conosciamo la soluzione esatta anche se introduciamo una dissipazione proporzionale -alla velocità $-\gamma v$. Abbiamo infatti che la forza applicata sul blocchetto è -\[ - F = -Kx - \gamma \dot{x} -\] -da cui , ricorando l'uguaglianza $F = ma = m\ddot{x}$ si ottiene l'equazione differenziale -\begin{equation} - m \ddot{x} = -K x -\gamma \dot{x} -\end{equation} -Se aggiungiamo le condizioni iniziali $x(0) = x_0$ e $\dot{x}(0) = v_0$ la soluzione è anche unica. -Se consideriamo infatti una soluzione del tipo $x(t) = e^{\lambda t}$ abbiamo che -\[ - \dot{x}(t) = \lambda e^{\lambda t} \qquad \ddot{x}(t) = \lambda^2e^{\lambda t} -\] -e quindi $x$ è soluzione se e solo se -\[ - m \lambda^2 e^{\lambda t} = -K e^{\lambda t} - \gamma \lambda e^{\lambda t} -\] -e considerando che l'esponenziale non è mai nullo questo si verifica solo se -\[ - m \lambda^2 + \gamma \lambda + K = 0 -\] -Escludendo il caso in cui il determinante è $0$ abbiamo due scelte per $\lambda$, che possono -essere reali o complesse. Nel caso reale i due esponenti ci danno una base dello spazio delle soluzioni. -Nel caso complesso possiamo osservare che, essendo le soluzioni coniugate, abbiamo che -\[ - \lambda = \alpha + \beta i \qquad \con{\lambda} = \alpha - \beta i -\] -e quindi -\[ - e^{\lambda t} = e^{\alpha}( \cos{\beta t} + i \sin{\beta t}) \qquad e^{\con{\lambda} t} = - e^{\alpha}(\cos{\beta t} - i \sin{\beta t}) -\] -dalle quali si ottiene che $e^{\alpha t}\cos{\beta t}$ e $e^{\alpha t}\sin{\beta t}$ sono ancora -una base per lo spazio delle soluzioni. \\ -Nel caso con determinante nullo si può mostrare che prendendo $e^{\lambda t}$ e $te^{\lambda t}$ queste -sono ancora una base. In ogni caso, siamo in grado di risolvere esattamente il nostro problema imponendo -le condizioni iniziali. - -Ci piacerebbe ora generalizzare questo procedimento in situazioni più generali e più complicate. In particolare, -vorremmo costruire un modello matematico di qualche situazione di reale interesse, come la seguente - -\subsection{La corda di una chitarra} -Possiamo modellizzare la corda di una chitarra come in Figura~\ref{fig:vib:cordachitarra}, ovvero come $N$ -masse collegate fra loro da $N-1$ molle e fissate, sempre tramite molle, a dei supporti laterali. -\begin{figure}[ht!] - \begin{center} - \begin{tikzpicture} - % Supporto sx - \draw (0,0) rectangle (1,2); - \fill[gray!30] (0,0) rectangle (1,2); - - %% Serie di molle - \draw[snake=snake] (1,1) -- (2,0.5); - \draw (2.2,0.5) circle (0.2) node {$1$}; - \draw[snake=snake] (2.4,0.5) -- (3.2,1.1); - \draw (3.4,1.1) circle (0.2) node {$2$}; - \draw[snake=snake] (3.6,1.1) -- (4.2,0.5); - \draw (4.4,0.5) circle (0.2); - \draw[snake=snake] (4.6,0.5) -- (5.8,1.5); - \draw (6.0,1.5) circle (0.2); - \draw[snake=snake] (6.2,1.5) -- (7.4,0.6); - \draw (7.6,0.6) circle (0.2) node {$N$}; - \draw[snake=snake] (7.8,0.6) --(9,1); - - %% Bloccketto finale - \draw (9,0) rectangle (10,2); - \fill[gray!30] (9,0) rectangle (10,2); - \end{tikzpicture} - \caption{Modello di una corda di chitarra} - \label{fig:vib:cordachitarra} - \end{center} -\end{figure} -Questo modello non è più rappresentato da una equazione differenziale, ma da un sistema di equazioni. -In tutta generalità possiamo assumere che le particelle $p_i$ abbiano massa $m_i$ e che la molla che collega -$p_{i-1}$ con $p_{i}$ abbia costante elastica $k_i$. Indichiamo inoltre con $\gamma_i$ la costante di attrito -della $i$-esima particella. Possiamo scrivere l'equazione del moto di questa proiettandola sugli assi: -\begin{equation} - \left\{ \begin{array}{ll} - \ddot{x_i} m_i &= -k_i (x_i - x_{i-1}) - k_{i+1}(x_i - x_{i+1}) - \gamma_i \dot{x_i} \\ - \ddot{y_i} m_i &= -k_i (y_i - y_{i-1}) - k_{i+1}(y_i - y_{i+1}) - \gamma_i \dot{y_i} - \end{array} \right. -\end{equation} -Queste possono essere risolte indipendemente per determinare il movimento orizzontale e verticale delle -particelle. Per affrontare la risoluzione è conveniente scrivere l'equazione in forma matriciale. - -Sia $y = \trasp{(y_1, \ldots, y_n)}$, $M$ la matrice diagonale tale che $m_{ii} = m_i$ e $R$ la -matrice diagonale tale che $r_{ii} = \gamma_i$. Costruiamo infine la matrice $K$ costruita in questo -modo -\[ - K = \left[ \begin{array}{cccccc} - \ddots & \ddots & & & & \\ - \ddots & \ddots & \ddots & & & \\ - & -k_i & k_i+k_{i+1} & k_{i+1} & \\ - & & \ddots & \ddots & \ddots & \\ - \end{array} \right] -\] -ovvero in modo che le equazioni di prima si possano scrivere nel seguente modo -\begin{equation} - My'' + Ry' + Ky = 0 -\end{equation} -Usiamo ora un piccolo trucco per riportare questa equazione differenziale del secondo ordine ad una -del primo. Definiamo $w = (y,y')$ il vettore ottenuto giustapponendo il vettore $y$ e la sua derivata. -Riscrivendo il sistema\footnote{Stiamo tacitamente assumendo che $M$ sia invertibile ma questo è piuttosto -ragionevole in quanto il determinante di questa è il prodotto delle masse e quindi è $0$ solo se almeno una -delle masse è $0$, situazione che non siamo interessati a rappresentare con il nostro modello} si ottiene -\begin{equation} - w' = \left[ \begin{array}{cc|cc} - \sblocko{0}{2} & \sblocke{I}{2} \\ - & & & \\ \hline - \sblocko{M^{-1}K}{2} & \sblocke{M^{-1}R}{2} \\ - & & & \\ - \end{array} \right] w = Aw -\end{equation} -Supponiamo ora per semplicità che $A$ sia diagonalizzabile, ovvero $A = SDS^{-1}$. Si ha in questo caso -che $w = SDS^{-1}w$ e quindi $S^{-1}w = DS^{-1}w$ dove $D$ è diagonale. Ponendo $z = S^{-1}w$ si ottiene -$z_i = z_i d_{ii}$ e quindi ci si può ricondurre al caso precedente con la soluzione per componenti -$z_i(t) = e^{d_{ii} t}$. -\begin{os} - Osserviamo che, in realtà, conosciamo la soluzione di questa equazione differenziale, e la conosciamo - esplicitamente in ogni caso. Infatti è una verifica piuttosto immediata (e, più probabilmente, un fatto noto) - che $\frac{d}{dt} \Exp{tA}w_0 = A\Exp(tA)w_0$ e quindi è soluzione del nostro problema di Cauchy. Sorge spontanea -la domanda: ``Perché abbiamo sviluppato tutto il ragionamento precedente?''. La riposta è che valutare questa -soluzione per un certo $t$ ha un costo computazionale molto alto. \`E quindi inaccettabile il costo che si ottiene -per la valutazione in tutti i punti che interessano a noi per ottenere un suono bem campionato (circa 44100 al secondo). -\end{os} - -\section{Sistemi continui} \label{sec:vibsistcont} -\subsection{Generalizzazione del caso delle $N$ masse} -Supponiamo di avere una corda tesa fra due supporti fissi, che viene, in un'istante $t = 0$ messa in -una certa posizione con una data velocità iniziale. Siamo interessati a studiare il successivo moto -della corda e le sue vibrazioni, come abbiamo fatto nel caso di $N$ particelle discrete. \\ -Consideriamo la seguente formalizzazione matematica di questo problema. Possiamo descrivere il moto della -corda parametrizzando i suoi punti tramite la coordinata orizzontale $x$ e introducendo una funzione -$u(x,t)$ che definisce la posizone del punto individuato dalla coordinata $x$ al tempo $t$, come si vede nella -Figura~\ref{fig:corda}. \\ -\begin{wrapfigure}{l}{70mm} - \begin{tikzpicture} - % Blocchetto 1 - \draw (0,0) rectangle (1,2); - \fill[gray!30] (0,0) rectangle (1,2); - - % Corda - \draw[very thick] (1,1) .. controls (2.5,2) and (3.5,2) .. (5,1); - - % Secondo blocchetto - \fill[gray!30] (5,0) rectangle (6,2); - \draw (5,0) rectangle (6,2); - - % E qualche chiarimento :) - \draw[->] (-0.5,-0.5) -- (6.5,-0.5) node[anchor=south] {$x$}; - \draw (1,-0.4) -- (1,-0.6) node[anchor=north] {$0$}; - \draw (5,-0.4) -- (5,-0.6) node[anchor=north] {$l$}; - - \draw[dashed] (3,-0.5) -- (3,1.75) node[anchor=south] {$u(x,t)$}; - \end{tikzpicture} - \caption{Rappresentazione della corda} - \label{fig:corda} -\end{wrapfigure} -Un'analisi fisica del fenomeno\footnote{che non è nostro interesse mostrare ora} porta alla seguente -equazione differenziale: -\[ - \frac{\partial^2 u}{\partial t^2} - \sigma \frac{\partial^2 u}{\partial x^2} = 0 -\] -dove $\sigma > 0$ è una costante determinata dalla gravità, dalla tensione e dalla densità -della corda. Prima di risolverla imponiamo le condizioni al contorno -\[ - u(0,t) = u(l,t) -\] -che ci permettono di controllare che gli estremi della corda siano sempre fissati ai supporti, e -le condizioni iniziali -\[ - u_0(x) = u(x,0) -\] -che dà la posizione iniziale e -\[ - v_0(x) = \frac{\partial u}{\partial t}(x,0) -\] -che esprime la velocità iniziale di ogni particella. Questa formalizzazione si può facilmente estendere -supponendo di avere una membrana introducendo $u(x,y,t)$. - -Per ora siamo particolarmente interessati a studiare se esistono delle soluzioni in cui tutti i punti -si muovano con la stessa frequenza $\omega$, anche se eventulamente con diversa ampiezza. Si tratta -di trovare una soluzione della forma -\[ - u(x,t) = v(x) \cdot \cos{(\omega t)} -\] -Osserviamo che data una $u$ di quest forma le derivate parziali diventano -\[ - \frac{\partial^2 u}{\partial t^2} = -v(x) \omega^2 \cos(wt) \qquad \frac{\partial^2 u}{\partial x^2} = v''(x) \cos(wt) -\] -e quindi l'equazione differenziale risulta essere -\[ - \cos(wt) \left[ -\omega^2 v(x) - \sigma v''(x) \right] = 0 -\] -che può essere identicamente nulla solo se -\[ - \omega^2 v(x) + \sigma v''(x) \equiv 0 \iff v''(x) = -\frac{\omega^2 v(x)}{\sigma} -\] - -\subsection{Discretizzazione del modello} - -Per risolvere effettivamente il problema supponiamo di suddividere l'intervallo $[0,l]$ in $n+1$ -punti equidistanti $x_0, \ldots, x_{n+1}$ tali che $x_0 = 0$ e $x_{n+1} = l$. Si avrà dunque -che $x_i - x_{i-1} = h = \frac{l}{n+1}$. \\ -Per comodità poniamo $v(x_i) = v_i$ la posizione dell'$i$-esimo -punto. -Assumiamo ora che la soluzione dell'equazione differenziale sia di classe $C^4$ su $[0,l]$, e facciamo -lo sviluppo in serie centrato in un generico punto $x_i$. -\[ - v(x_i + h) = v_{i+1} = v_i + hv'(x_i) + \frac{h^2 v''(x_i)}{2} + \frac{h^3 v^{(3)}(x_i)}{6} + \frac{h^4 v^{(4)}(\xi_i)}{24} -\] -dove $\xi_i \in (x_i , x_{i+1})$. -Analogamente si ottiene -\[ - v(x_i - h) = v_{i-1} = v_i - hv'(x_i) + \frac{h^2 v''(x_i)}{2} - \frac{h^3 v^{(3)}(x_i)}{6} + \frac{h^4 v^{(4)}(\eta_i)}{24} -\] -dove $\eta_i \in (x_{i-1}, x_i)$. Sommando queste due si ha -\[ - v_{i+1} + v_{i-1} = 2v_i + h^2 v''(x_i) + \frac{h^4}{24}[v^{(4)}(\xi_i) + v^{(4)}(\eta_i)] -\] -e possiamo ancora una volta ottenere un'espressione ``quasi'' esplicita della $v''(x_i)$: -\[ - v''(x_i) = \frac{1}{h^2} ( v_{i+1} + v_{i-1} - 2v_i ) - \frac{h^2}{24}[v^{(4)}(\xi_i) + v^{(4)}(\eta_i)] -\] -Nel nostro modello $h$ è destinato ad essere piccolo, perché $h = \frac{1}{n+1}$ e intuitivamente $n$ deve essere un -numero grande se vogliamo approssimare bene il problema continuo. Abbiamo quindi che $h^2 \to 0$ quando $n \to \infty$ -e vorremmo poter dire che possiamo trascurare il termine con le derivate quarte. -Se così fosse avremmo infatti ricondotto il nostro problema ad un problema di autovalori. - -Possiamo riscrivere infatti le relazione in questo modo -\[ - Av - \frac{h^2}{24} \tau = \lambda v -\] -dove $v = \trasp{( v_1 \ldots v_n )}$ e -\[ - A = \left[ \begin{array}{cccccc} - -2 & 1 & & & & \\ - 1 & -2 & 1 & & & \\ - & \ddots & \ddots & \ddots & & \\ - & & 1 & -2 & 1& \\ - & & & 1 & -2 \\ - \end{array} \right] -\] -e dove $\tau$ è un opportuno vettore che contiene i termini del tipo $\tau_i = v^{(4)}(\xi_i) + v^{(4)}(\eta_i)$. -Osserviamo che possiamo dare una maggiorazione alla norma di $\tau$ perché essendo la derivata quarta di $v$ continua -su un compatto è limitata, e quindi $\forall i \: |\tau_i | \leq M$ per un opportuno $M$. - -Ricordiamo il Teorema~\ref{te:BauerFike}; questo dice che presa una norma assoluta ed $A$ diagonalizzabile ed $F$ -una matrice di perturbazione per ogni autovalore $\lambda$ di $A + F$ esiste un autovalore $\mu$ di $A$ -tale che $||\lambda - \mu|| \leq \cond{T}||F||$ dove $T$ è il cambio di base che diagonalizza $A$. -Se poniamo $F = -\frac{h^2}{24}\tau \trasp v$ dove $v$ è un autovettore di $v$ è tale che -$Av - \frac{h^2}{24}\tau = \lambda v$ allora si ha -\[ - (A - \frac{h^2}{24} \tau \trasp v) v = \lambda v -\] -e quindi esiste $\mu$ autovalore di $A$ tale che\footnote{Osserviamo che, essendo $A$ reale simmetrica -il cambio di base che la diagonalizza è ortogonale e quindi ha condizionamento $1$.} $||\lambda - \mu|| \leq ||F|| -= \frac{h^2}{24} \cdot \frac{||\tau\trasp v||}{\trasp vv} \leq \frac{h^2}{24\trasp vv} \sqrt{\rs{\trasp \tau v\trasp v\tau}} -= ||\tau|| \frac{h^2}{24 \trasp vv}$; questo si ottiene osservando che la norma di una matrice diade $v\trasp v$ -è data dalla norma du $v$. - -Vogliamo ora mostrare che $\frac{||\tau||}{||v||}$ è limitato superiormente da una costante, in modo -da provare la convergenza della nostra approssimazione. - -Consideriamo la seguente serie di eguaglianze -\[ - \sqrt{h} || \tau ||_2 = ( \sum_{i=1}^{n} v^{(4)}(\xi_i)^2 + v{(4)}(\eta_i)^2)^{\frac 1 2} \sqrt{h} - = ( \sum_{i=1}^{n} h v^{(4)}(\xi_i)^2 + h v{(4)}(\eta_i)^2)^{\frac 1 2} -\] -Osserviamo che l'ultima espressione può essere intesa, per $h \to 0$, come un'approssimazione dell'integrale -di Riemann di $v^2(x)$, ed essendo l'integrale di una funzione continua su un compatto è limitato -superiormente da una costante. Abbiamo quindi provato la tesi. - -Introduciamo ora un metodo iterativo che possiamo vedere come una estensione del metodo delle potenze -e che ci permetterà di studiare nel dettaglio questa situazione. - -\subsection{Il metodo delle iterazioni ortogonali di sottospazi} -Il metodo delle potenze come è stato analizzato nella Sezione~\ref{sec:metodopotenze} è basato sull'idea -di prendere un vettore e iterare su di lui l'applicazione individuata dalla matrice $A$ di cui si vogliono -calcolare gli autovalori. \\ -Osserviamo che questa idea è equivalente (anzi, forse è meglio rappresentata) all'iterare un sottospazio -vettoriale di dimensione $1$. Supponiamo ora di voler calcolare, invece che 1, più autovalori delle matrice, -precisamente $k$ (dove $k < n$ ed $n$ è la dimensione delle matrice) ognuno di molteplicità 1\footnote{% -Questo solo per semplicità di esposizione. Non è complicato generalizzare l'idea}. Una naturale estensione del metodo -sarebbe iterare un sottospazio vettoriale di dimensione $k$. Questo dovrebbe convergere ad un sottospazio di dimensione -$k$ uguale alla somma degli autospazi dei primi $k$ autovalori.\\ -Si può osservare subito un problema computazionale. Sebbene questo discorso sia teoricamente corretto, è facile prevedere -che il nostro spazio di dimensione $k$ convergerà verso l'autospazio relativo -all'autovalore dominante (che è di dimensione 1). Più precisamente, supponiamo di rappresentare lo spazio -con una matrice $x$ $n \times k$ le cui colonne siano una base dello spazio. Allora l'iterazione sarebbe -\[ -\left\{\begin{array}{lcl} - x_0 &=& x \\ - x_{k+1} &=& Ax_k -\end{array} \right. -\] -Per lo stesso ragionamento fatto nel caso del metodo delle potenze originale tutte le colonne di $A$ convergeranno -a multipli dello stesso vettore (quello dell'autovalore dominante). - -Un modo di risolvere questo problema potrebbe essere assicurarsi che durante l'iterazione tutte le colonne restino -ortogonali fra loro. Consideriamo la seguente iterazione -\[ - \left\{ \begin{array}{lcl} - x_0 &=& x \\ - T_{k} &=& A x_k \\ - Q_k R_k &=& T_k \: \text{(scomposizione $QR$ di $T_k$)} \\ - x_{k+1} &=& Q_k - \end{array} \right. -\] -Ricordando che la scomposizione QR di una matrice $n \times k$ con $k < n$ è tale che $Q$ è rettangolare -ed è $n \times k$ e $R$ è quadrata $k \times k$. In particolare si osserva che nella nostra iterazione -le colonne di $Q_k$ sono una -base ortonormale per lo spazio generato dalle colonne di $T_k$. -Osserviamo che calcolare esplicitamente $x_k$ non è realmente necessario e possiamo riformulare -l'iterazione. Poniamo -\[ - B_k = \trasp{Q_k} A Q_k \qquad \text{e} \qquad B_k = U_k D \trasp{U_k} -\] -dove $U_K D \trasp{U_k}$ è la decomposizione spettrale di $B_k$. Si osserva che $T_{k+1} = A Q_k = -Q_k B_k = $. -% TODO: Capire l'iterazione implicita. \ No newline at end of file diff --git a/Bibliografia.tex b/Bibliografia.tex deleted file mode 100644 index eca1a00..0000000 --- a/Bibliografia.tex +++ /dev/null @@ -1,32 +0,0 @@ -\begin{thebibliography}{} - \bibitem{metnumalglin}{% - Dario Bini, Milvio Capovani, Ornella Menchi, - \emph{Metodi numerici per l'algebra lineare}, - Zanichelli} - - \bibitem{watkins}{% - David S. Watkins, - \emph{The Matrix Eigenvalue problem -- GR and Krylov Subspace Methods}, - SIAM} - - \bibitem{demmel}{% - James W. Demmel, - \emph{Applied Numeric Linear Algebra}, - SIAM - } - - \bibitem{lshort}{% - Tobias Oetiker, Hubert Partl, Irene Hyna and Elisabeth Schlegl, - \emph{The not so short introduction to \LaTeXe, or \LaTeXe in 139 minutes}, - Scaricabile gratuitamente da Internet. - } - - \bibitem{pgfmanual}{% - Till Tantau, - \emph{Tikz and PDF, Manual for version 1.10}, - Institut f\"ur Theoretische Informatik - Universit\"at zu L\"ubeck, - October 26, 2006, \verb-http://sourceforge.net/projects/pgf- - } -\end{thebibliography} - diff --git a/CalcoloScientifico.tex b/CalcoloScientifico.tex index c677f07..7919403 100644 --- a/CalcoloScientifico.tex +++ b/CalcoloScientifico.tex @@ -229,7 +229,7 @@ %% Prima pagina -\input{title} +\input{varie/title} %% Non vogliamo il numero sulla prima pagina \thispagestyle{empty} @@ -238,7 +238,7 @@ \newpage %% \input qualche introduzione, quando verrà il giorno -\include{introduzione} +\include{varie/introduzione} %% %% Di nuovo un'altra pagina per metterci l'indice @@ -260,41 +260,41 @@ \part{Teoria} %% Introduzione e calcolo del polinomio caratteristico -\include{capitolo1} +\include{capitoli/capitolo1} %% Metodi per il calcolo di autovalori di matrici Hermitiante %% tridiagonali -\include{capitolo2} +\include{capitoli/capitolo2} %% Decomposizione in valori singolari -\include{capitolo3} +\include{capitoli/capitolo3} %% Risoluzione dei sistemi lineari -\include{capitolo4} +\include{capitoli/capitolo4} %% Matrici strutturate -\include{capitolo5} +\include{capitoli/capitolo5} %% Problema generalizzato agli autovalori, qualche nota -\include{capitolo6} +\include{capitoli/capitolo6} %% Comincia l'appendice, ovvero dove %% esponiamo gli algoritmi visti con Bini \part{Esercitazioni} %% Page rank -\include{AppPageRank} +\include{appendice/AppPageRank} %% Studio delle vibrazioni -\include{AppVibrazioni} +\include{appendice/AppVibrazioni} \part{Appendice} \appendix -\include{AppFortran} +\include{appendice/AppFortran} %% Bibliografia -\include{Bibliografia} +\include{varie/Bibliografia} \end{document} diff --git a/appendice/AppFortran.tex b/appendice/AppFortran.tex new file mode 100644 index 0000000..67f01a6 --- /dev/null +++ b/appendice/AppFortran.tex @@ -0,0 +1,245 @@ +\chapter{Il fortran 95} +Il linguaggio di programmazione usato per implementare gli algoritmi è stato il FORTRAN, una +``minor revision''\footnote{non ho mai capito come si traduca veramente in italiano la parola +revision -- ogni suggerimento è bene accetto} del FORTRAN 90. \\ +Rispetto all versioni precedenti ci sono delle interessanti novità, per cui se state pensando +``Oddio, il FORTRAN nel 2009, non ci posso credere'' prima leggete il seguito\footnote{Ebbene sì, +è quello che ho pensato io, ma poi mi sono resoconto che il linguaggio aveva fatto dei progressi +dagli anni sessanta a questa parte}; è l'elenco delle cose che non mi aspettavo +\begin{enumerate}[(a)] + \item Allocazione dinamica della memoria; + \item Creazione di tipi astratti e overloading degli operatori; + \item Programmazione ad oggetti e polimorfismo (solo Fortran 2003/2008); +\end{enumerate} + +In ogni caso, in queste note includerò alcune righe su come si scrivono le prime righe di codice +in fortran. In codice Fortran saranno infatti riportati tutti gli esempi nella parte di esercitazione. + +\section{La sintassi} +\subsection{Hello World!} +Per una convenzione che di cui non so l'origine non è posibbile cominciare da qualcosa di diverso del +programma Hello World! Noi non saremo da meno. Cominceremo a guardare il codice e a commentarlo +passo passo.. + +\begin{lstlisting}[frame=tb,caption=Hello World,label=lst:helloworld] + PROGRAM helloworld + IMPLICIT NONE + WRITE(*,*) 'Hello World' + END PROGRAM +\end{lstlisting} + +Tutte le righe precedute da \lstinline-!- sono dei commenti e quindi vengono scartate +dal compilatore. Ad esempio '\lstinline-a = 1 ! Inizializzazione-' è equivalente a +'\lstinline-a = 1-'. + +L'istruzione \lstinline-PROGRAM helloworld- spiega al compilatore che questo è l'inizio del +nostro programma e che si chiamerà helloworld. Si aspetta di trovare alla fine un +\lstinline-END PROGRAM- che noi abbiamo prontamente inserito. + +L'istruzione \lstinline-IMPLICIT NONE- serve invece a disattivare delle convenzione che si +usavano nelle prime versione del fortran (e che esistono ancora per retrocompatibilità) +che stabiliscono che le variabili \lstinline-i,j,k- sono di tipo intero, mentre ad esempio +\lstinline-x,y,z- sono reali. Questo non è desiderabile in un linguaggio di programmazione +moderno in cui ci si aspetta di scrivere del codice comprensibile. + +Infine l'istruzione \lstinline-WRITE(*,*)- scrive sull stdout\footnote{che, nelle maggior parte +dei casi, coincide con il monitor} tutti gli argomenti che gli si passano dopo. \`E possibile +controllare la formattazione di quello che viene stampato ma, come è simboleggiato dagli asterischi, +per ora non ce ne stiamo preoccupando. + +\subsection{La struttura} +Un programma in FORTRAN ha una struttura prefissata: +\begin{lstlisting}[label=lst:fotranstruct,frame=tb] + PROGRAM nomeprogramma + IMPLICIT NONE + ! Specificazioni: in questa parte si trova la dichiarazione + ! delle variabili e dei nuovi tipi + + ! Parte di esecuzione: qui troviamo il codice vero e proprio che + ! viene eseguito + + ! Subroutine: qui troviamo la definizione dei sottoprogrammi che + ! possono venire chiamati dalla parte di esecuzione + END PROGRAM +\end{lstlisting} +\subsection{I tipi} +Come il C e tutti i linguaggi che vantano una certa storia il FORTRAN è un linguaggio tipato, +ovvero ogni variabile ha un tipo (ad esempio intero) e non gli si possono assegnare valori +di tipi differenti. \\ +Si possono aggiungere delle parole chiave alle dichiarazioni di tipi, più precisamente +\begin{itemize} + \item \lstinline-PARAMETER-: questa indica che la variabile non verrà modificata, è semplicemente + un parametro per il programma. + \item \lstinline-ALLOCATABLE-: Questo parola chiave indica che la memoria per la variabile verrà + allocata esplicitamente in un secondo momento, è particolarmente utile con l'altra parola chiave + \item \lstinline-DIMENSION-: questa permette di speicificare che la variabile dichiarate è un array + e la sua relativa dimensione (Esempio: \lstinline- INTEGER, DIMENSION(5) :: vec-); è possibile specificare + \lstinline-:- come dimensione, nel qual caso il compilatore assumerà che la dimensione verrà determinata + in un secondo momento. Un caso tipico è la creazione di un vettore la cui dimensione verrà determinata + a run-time\footnote{ovvero durante l'esecuzione.}; questo si può realizzare con un codice di questo tipo + \begin{lstlisting}[frame=tb] + PROGRAM allocatore + INTEGER , ALLOCATABLE :: i + INTEGER :: size + ! Leggo da tastiera la dimensione dell'array e lo alloco + READ(*,*) size + ALLOCATE(i(size)) + END PROGRAM + \end{lstlisting} + +\end{itemize} +I tipi principali presenti in Fortran sono +\begin{itemize} + \item \textbf{Interi}: Sono denotati dalla parola chiave \lstinline-INTEGER- e sono appunto numeri + interi. Generalemente occupano $4$ byte. + \item \textbf{Reali}: Numeri reali, che vengono memorizzati come floating point. La parola chiave + è \lstinline-REAL- e occupano generalmente $4$ byte. Per i nostri scopi questi sono pochi, e quindi + useremo in generale il seguente trucchetto: + \begin{lstlisting}[frame=tb] + INTEGER, PARAMETER :: db = KIND(0.D0) + REAL(dp) :: real_var + \end{lstlisting} + che si occuperà di assegnare al tipo \lstinline-REAL- dichiarato la stessa dimensione delle costante di tipo + \texttt{double} \lstinline-0.D0-. +\end{itemize} + +\subsection{Input e Output} +Per iniziare ci basterà conoscere le istruzioni di stampa su schermo e lettura da tastiera, che sono rispettivamente +\begin{itemize} + \item \lstinline-WRITE(*,*) dato_1, dato_2 , ...- che si occuperà di scrivere sullo schermo (identificato dal primo + \lstinline-*-) e con una formattazione standard (identificata dal secondo \lstinline-*-) i dati che gli inseriamo dopo; + \item \lstinline-READ(*,*) var_1, var_2, ...- che si occuperà di leggere da tastiera (il primo \lstinline-*-) i dati + in un formato standard (il secondo \lstinline-*-); +\end{itemize} +In realtà queste istruzioni ci permettono di controllare anche formattazioni e sorgenti e destinazioni di Input e Output. +Per scrivere (o leggere) su un file è prima necessario \textbf{aprirlo}. Per fare questo bisogna eseguire una +chiamata alla funzione \lstinline-OPEN()-. Questa si occuperà di aprire un file da noi indicata ed assegnarlo ad +un numero intero, anche quello indicato da noi. Bisogna fare attenzione in quest'ultimo passaggio a ricordare +che \lstinline-5- e \lstinline-6- sono già riservati alla tastiera ed allo schermo. +Potremmo poi fare riferimento (sia in lettura che in scrittura) +a quel determinato file sostituendo quell'intero a \lstinline-*-. Questo codice probabilmente chiarirà meglio la questione. +\begin{lstlisting}[frame=tb] + PROGRAM CopiaIncolla + IMPLICIT NONE + + ! Dichiaro delle variabili intere di tipo PARAMETER + ! per contenere gli interi con cui poi mi riferiro' ai file. + ! Sarebbe infatti complicato dover ricordare tanti numeri + ! a memoria e renderebbe il codice meno leggibile + INTEGER, PARAMETER :: infile = 11, outfile = 12 + INTEGER :: j + INTEGER :: buf + + ! Cerco di aprire il file in.txt + OPEN(FILE='in.txt', UNIT=infile) + + ! E anche il file out.txt + OPEN(FILE='out.txt', UNIT=outfile) + + ! Leggo le prime 10 righe da questo file + ! e le scrivo su out.txt, raddoppiate (assumendo + ! che siano interi) + DO j=1,10 + READ(infile,*) buf + WRITE(outfile,*) buf * 2 + END DO + + ! Alla chiusura del programma anche tutti i file vengono chiusi, + ! e quindi questo rende le prossime righe superflue. Pero' e' buona + ! norma ricordarsi di chiudere i file che si sono aperti, e quindi + ! lo facciamo + CLOSE(infile) + CLOSE(outfile) + + END PROGRAM +\end{lstlisting} +Abbiamo qui introdotto anche la chiamata \lstinline-CLOSE()- che serve appunto per +chiudere un file. \`E normalmente buona norma chiudere tutti i file che si aprono e quindi, +in programma corposi, conviene sempre scrivere la chiamata ad \lstinline-OPEN()- insieme +alla chiamata \lstinline-CLOSE()- per evitare di dimenticarla. + +\section{Subroutine} +Mano a mano che il programma cresce diventerà necessario razionalizzare la disposizione di +funzioni e strutturare meglio il listato. In particolare siamo interessati a scrivere delle +funzioni che si occupino di svolgere un determinato compito in modo che poi possiamo chiamarle +senza preoccuparci (troppo) di come sono implementate. +Quelle che in C si chiamavano funzioni in Fortran si chiamano \emph{subroutine}. La sintassi +per una subroutine assomiglia molto a quella di un programma: +\begin{lstlisting}[frame=tb,caption=Una subroutine] + SUBROUTINE nome(...) + ! [ Dichiarazioni ] + ! [ Corpo della subroutine ] + END SUBROUTINE +\end{lstlisting} +Una particolarità per così dire ``curiosa'' è che le variabili passate alla subroutine dovranno +essere ridichiarate all'interno della stessa perché essa ci possa accedere. Le variabili inoltre +vengono sempre passate per riferimento (quello che succede in C passando per riferimento o quello +che succede in C++ passando una reference) e, per conludere, non c'è un'istruzione di ritorno\footnote{% +O perlomeno, non ne ho mai incontrate. Notare però che programmo in fortran da pochi giorni e quindi.. potrei +scoprirle prossimamente :) }. +Ci saranno quindi variabili di Input e variabili di Output\footnote{in realtà in FORTRAN esistono +anche delle funzioni, che come in C ritornano dei valori; noi non le scriveremo (e quindi in particolare +non ne ho mai scritta una) e quindi non sono qui esposte. Nonostante questo verranno utilizzate +nel corso funzioni interne del fortran come \lstinline-RESHAPE()- o \lstinline-MATMUL()-. }, ma tutte insieme nella chiamata della funzione. +Per chiarire le idee, e spiegare i passaggi che mancano, proponiamo un esempio di una funzione che prenda un +numero e lo moltiplichi per due\footnote{che esempio inutile, direte voi\ldots e avete anche ragione ma +in questo momento non mi viene in mente niente di più costruttivo} +\begin{lstlisting}[frame=tb,caption=Un semplice programma che fa uso di subroutine] + ! Questo programma prende in input un numero e lo moltiplica per due; + ! Di per se' e' piuttosto inutile ma mostra come si utilizza una subroutine + ! nell'ambito di un programma + + PROGRAM sub_doppio + + REAL :: x; + ! Leggo dallo standard input x + READ(*,*) x; + + ! Lo moltiplico per due facendo uso della subroutine + CALL doppio(x); + + ! Lo stampo. Atttenzione! La subroutine ha modificato il vero + ! valore di x perche' le ho di fatto passato un puntatore + WRITE(*,*) x; + +! Terminiamo l'esecuzione del programma principale. +END PROGRAM sub_doppio + +SUBROUTINE doppio(x) + REAL :: x; + x = x * 2; +END SUBROUTINE doppio +\end{lstlisting} +Naturalmente si possono fare esempi molto più complessi, e soprattutto più utili. Ad esempio, supponiamo +di implementare la subroutine \lstinline-dotprod- che avevamo pensato parlando del pagerank per fare il prodotto +matrice vettore con una matrice sparsa. Non la riportiamo qui perché è già stata scritta (si veda il Listato~\ref{lst:matrixvec}) +ma commentiamo alcuni fatti: +\begin{itemize} + \item Le keyword \lstinline-INTENT(IN)- e \lstinline-INTENT(OUT)- servono per l'appunto a specificare se una variabile + è da considerarsi di input o di output. Questo di fatto non cambia nulla, a parte che il compilatore ci avviserà + se tentiamo di modificare variabili di input; + \item La \lstinline-SUBROUTINE- può venir scritta in un file separato e poi linkata insieme al file eseguibile che + la richiama. Spiegheremo meglio questo concetto con un esempio; +\end{itemize} + +Supponiamo di avere scritto la subroutine in un file di nome \verb-dotprod.f90-, e di aver successivamente +scritto un listato \verb-matrici.f90- in cui compaia l'istruzione \lstinline-CALL dotprod(...)-. Sarebbe tedioso +dover copiare il contenuto del file \verb-dotprod.f90- all'interno di \verb-matrici.f90- per poi compilarlo. +In effetti esiste un metodo più pratico per agire. +\begin{enumerate} + \item Compilare i file sorgenti separatamente, senza creare l'eseguibile ma solamente i \emph{file oggetto} + che contengono la versione compilata del listato, senza che le referenze siano stare risolto. Questo significa + che all'interno del file oggetto associato a \verb-matrici.f90- ci sarà una chiamata ad una \lstinline-dotprod()- + senza che abbia la minima idea di dove andare a prenderla; questa operazione si realizza su Linux con \verb-f95- in questo + modo: \\ + \verb+# f95 -c dotprod.f90 matrici.f90+ + + \item Il secondo passo consiste nel creare un eseguibile unico con le dipendenze risolte, ovvero in cui ci sia + la chiamata a \lstinline-dotprod()- ma questa volta sia chiaro dove poterla trovare\footnote{sono conscio che questa + spiegazione non è molto chiara. Cercherò di migliorarla}; questo compito viene eseguito dal \emph{linker} che, su Linux, + fa ancora parte di \verb-f95-\footnote{forse si portebbe discutere sulla correttezza di questa affermazione, in ogni caso noi + daremo il comando f95 per eseguire l'operazione. Quello che poi lui faccia davvero, compreso chiamare altri programmi, + per il momento non è affar nostro}; il comando è il seguente: \\ + \verb+# f95 -o matrici matrici.o dotprod.o+ +\end{enumerate} + diff --git a/appendice/AppPageRank.tex b/appendice/AppPageRank.tex new file mode 100644 index 0000000..846473e --- /dev/null +++ b/appendice/AppPageRank.tex @@ -0,0 +1,352 @@ +\chapter{Page Rank} +In questo capitolo ci porremo il problema di calcolare il \emph{page rank} di un determinato +insieme di pagine Web (o, analogamente, documenti \emph{ipertestuali}). \\ +Con Page Rank intendiamo un ``valutazione'' data ad una determinata pagina o documento con lo scopo +di stimare la sua importanza\footnote{che è ovviamente un concetto poco matematico, ma ci occuperemo +di formalizzarlo meglio in seguito.}. Un algoritmo derivato da quello che verrà in seguito +esposto è utilizzato attualmente da Google (\href{http://www.google.it}{http://www.google.it}) +per ordinare i risultati di una query nel suo motore di ricerca, così come da tutti i principali +\emph{search engine} presenti sul Web. + +\section{Presentazione del modello} +Prima di tutto dobbiamo occuparci di definire il modello matematico che vogliamo usare +per schematizzare la nostra valutazione di importanza. \\ +In generale l'idea che sta alla base del Page Rank è dare importanza ad una pagina +basandosi sui link\footnote{Un link in una pagina Web, ma anche in un documento PDF come questo, +è un ``puntatore'' ad un altro documento. In genere l'utente può attivare il puntatore semplicemente +cliccandoci sopra con il mouse} che in essa sono presenti. + +Alcune idee che potrebbero sembrare valide potrebbero essere valutare l'importanza di una pagina +in base al numero di link presenti nella pagina, oppure al numero di link che puntano ad essa. + +Dopo una breve riflessione ci si rende conto che entrambi i metodi introducono svariate problematiche +di affidabilità. In generale, infatti, il creatore di una pagina ha il controllo di quanti link +sono presenti in una pagina, e non fatica molto a creare delle pagine fittizie che puntano a quella +appena creata. La valutazione sarebbe quindi falsata e molto vulnerabile a frode. + +Si può però cercare di affinare l'idea di base in modo da risolvere questi inconvenienti. +Per convenzione assumiamo di numerare tutte le pagine presenti nel Web con dei numeri naturali +$1 \ldots N$ (dove $N$ è un numero dell'ordine di $10^{10}$). +Fissata una certa pagina $j$ consideriamo i link che puntano a lei. Risulta chiaro che non solo +il \textbf{numero} dei link è importante per valutare la sua importanza, ma a sua volta anche l'\textbf{importanza} +di questi dovrebbe influire. Per esempio, se la homepage di Yahoo! punta +alla pagina di una data persona, è naturale che questa pagina acquisisca una certa rilevanza. Viceversa, se sulla +mia pagina personale metto un link al sito della stessa persona l'importanza di questo varia di poco\footnote{ +a meno che nel momento in cui voi leggiate queste pagine io non sia diventato una persona con una certa influenza, +ma questo è probabilmente un caso da scartare}. +Un'ultima e non meno importante considerazione è che se anche Yahoo! punta al mio sito ma lo fa in una pagina +con un altro centinaio di link è una faccenda molto diversa dall'essere puntati dall'unico link in homepage. + +Stiamo quindi arrivando ad un altro modello, in cui le pagine \emph{distribuiscono la loro importanza fra i link al +loro interno}. Questo modello è molto più ragionevole del precedente, ed è molto meno predisposto a dare +risultati falsati. Vorremo però averne una descrizione matematica precisa. + +\section{Un po' di matematica} +Consideriamo la matrice quadrata $H = (h_{ij})$, che chiameremo \emph{matrice delle connessioni}, definita +nel seguente modo +\[ + h_{ij} = \left\{ \begin{array}{ll} + 1 & \text{se esiste un link dalla pagina} \ i \ \text{alla pagina} \ j \\ + 0 & \text{altrimenti} + \end{array} \right. +\] +Questa matrice avrà dimensione $N \times N$ ma sarà sparsa, ovvero la maggior parte dei suoi valori saranno $0$. +Per fissare le idee consideriamo la Figura~\ref{fig:web}, un modello (molto) semplificato del Web, in cui esistono solamente +3 pagine. +\begin{figure}[hb] +\[ + \xymatrix{ +{\bullet{1}} \ar@/_/[dr] \ar@/^1pc/[drr] & \\ + & {\bullet{2}} \ar@/_/[ul]& {\bullet{3}} \ar@/^/[l]} +\] +\caption{Esempio di una rete composta da 3 pagine} +\label{fig:web} +\end{figure} + +La matrice di connessione $H$ associata a questo grafo è la seguente +\[ + H = \left[ \begin{array}{ccc} + 0 & 1 & 1 \\ + 1 & 0 & 0 \\ + 0 & 1 & 0 + \end{array} \right] +\] +\begin{os} \label{os:pageranknumcoll} + \`E facile verificare che valgono le seguenti uguaglianze + \[ + \left\{ \begin{array}{ll} + \sharp \{ \text{collegamenti uscenti da} \ i \} & = \sum_{j=1}^{N} h_{ij} \\ + \sharp \{ \text{collegamente che arrivano a} \ j \} & = \sum_{i=1}^{N} h_{ij} + \end{array} \right. + \] +\end{os} +In particolare sarebbe piuttosto immediato calcolare, partendo dalla matrice $H$, i valori +del Page Rank con i metodi ipotizzati all'inizio del capitolo (per altro reputati incompleti) + +Siamo dunque interessati a calcolare il vettore $W$ dove $w_i$ è l'importanza della pagina $i$, +in modo che rispetti le linee guide definite precedentemente. + +Chiamiamo $d_i$ il numero di link uscenti dalla pagina $i$ +(facilmente calcolabile come visto nell'Osservazione~\ref{os:pageranknumcoll}). Chiameremo inoltre +$D$ la matrice con i $d_i$ sulla diagonale e nulla per i restanti valori. +Introdotta questa notazione, secondo il nostro modello ogni componente di $W$ dovrebbe rispettare +la seguente equazione +\[ + w_j = \sum_{i=1}^{N} w_i \frac{h_{ij}}{d_i} +\] +che rappresenta esattamente l'idea che l'importanza di ogni pagina è la somma delle importanze di quelle +che la linkano, in cui ogni addendo è normalizzato sul numero di link uscenti\footnote{probabilmente l'equazione +è molto più chiara di questa frase, ma non commentare mi sarebbe sembrato inopportuno}. +\`E quindi chiaro come il nostro problema si sia trasformato in un problema di autovalori ed autovettori. In +particolare, se poniamo $M = D^{-1}H$ la nostra richiesta si può scrivere nella forma più compatta +$\trasp{W} = \trasp{W}M$, ovvero $\trasp{W}$ è un autovettore sinistro di $M$. Sorgono spontanee alcune +domande a cui dobbiamo rispondere prima di procedere oltre. +\begin{enumerate}[(a)] + \item \label{en:pagerank:a} Cosa succede se per qualche $i$ si ha $d_i = 0$? Stiamo tacitamente assumendo che $D$ sia invertibile + ma questo non è garantito a priori; + \item \label{en:pagerank:b} L'autovalore $1$ fa parte dello spettro delle matrice $M$? Se questo non fosse vero la nostra + richiesta non ammette soluzione, e quindi possiamo rinunciare in partenza alla nostra idea; + \item \label{en:pagerank:c} Se l'autovettore $W$ esiste, è unico\footnote{In realtà ci stiamo chiedendo se il suo +autospazio ha dimensione $1$. Siamo ben consci che se ne troviamo uno ogni suo multiplo scalare continuerà +ad essere un autovettore. Per altro, moltiplicare le valutazioni omogeneamente per lo stesso cofficiente non +sarebbe in nessun modo un problema}?. Se così non fosse + sorgerebbero dei seri problemi su come interpretare i risultati ottenuti; + \item \label{en:pagerank:d} Possiamo scegliere l'autovettore $W$ in modo che $w_i \geq 0$ per ogni $i$? Questo non è necessario, + a priori, ma sembrerebbe coerente fare in modo che delle votazioni siano numeri positivi; +\end{enumerate} + +Cominciamo col rispondere alla domanda~(\ref{en:pagerank:a}). Ovviamente potrebbe benissimo succedere +che per qualche $i$ $d_i = 0$. Questi ``nodi'' vengono chiamati \emph{dangling node}, ovvero ``nodi penzolanti'', +che non portano a niente. Per risolvere questo problema si sostituisce la matrice $H$ con una matrice $\hat H$ +tale che se $h_{ij} = 0 \: \forall j$ allora $\hat h_{ij} = 1 \: \forall j$, e in caso contrario $\hat h_{ij} = h_{ij}$. +Questa matrice risolve evidentemente il problema e cambia di poco il modello. Supporre che una determinata pagina +non distribuisca la sua importanza a nessuno o la distribuisca in maniera analoga a tutti non è un gran cambiamento. + +La domanda~(\ref{en:pagerank:b}) ha invece una risposta immediata. Sì, l'autovalore $1$ fa parte dello spettro +ed un autovettore (destro) a lui associato è quello composto di tutti $1$. La verifica è un banale conto. + +Per rispondere alle domande~(\ref{en:pagerank:c}) e (\ref{en:pagerank:d}) ci appoggiamo ad un risultato +che non dimostreremo (in questa sede) ottenuto da Perron-Frobenius sulla Teoria delle Matrici non negative. +\begin{te}[di Perron-Frobenius] \label{te:PerronFrobenius} + Se $A$ è irriducibile allora $\rs{A} > 0$ è un autovalore semplice ed + esistono $x,y$ autovettori destro e sinistro + con componenti strettamente positive. +\end{te} +\begin{os} + Sembrerebbe, a priori, che non siamo in grado di determinare il raggio spettrale di $A$. Consideriamo però + che $1$ è nello spettro e che $||A||_{\infty} = 1$ e ogni norma indotta supera il raggio spettrale. Si può + quindi concludere che $\rs{A} = 1$ e applicare il Teorema~\ref{te:PerronFrobenius}. +\end{os} +Sfortunatamente si può osservare che, pur con tutte queste buone proprietà, in generale i metodi applicati +per trovare l'autovettore (il metodo delle potenze) potrebbe non essere convergente, perché gli autovalori +diversi da $1$ potrebbero ancora avere modulo $1$\footnote{Come visto nella teoria, la velocità di convergenza +del metodo di iterazione è data dal rapporto fra il più grande autovalore diverso da quello di cui si sta cercando +l'autovettore e l'autovalore in questione. In questo caso il rapporto potrebbe essere $1$, che darebbe una situazione +di non convergenza}. +Introduciamo una definizione che ci permetterà di formalizzare meglio il problema. +\begin{de} + Una matrice $A$ si dice \emph{ciclica} se esiste un sottoinsieme dei suoi autovalori $J \subseteq \spe{A}$ + tale che $\forall \lambda,\mu \in J$ si ha che $|\lambda|=|\mu|$. +\end{de} +Per superare questa difficoltà si può, ancora una volta, modificare il modello. Fissiamo $\gamma > 0$ e consideriamo +che il visitatore +possa in ogni momento, con probabilità $1-\gamma$, decidere di aprire una pagina a caso. Potremmo rappresentare +questa nuova situazione sostituendo $M$ con la matrice +\[ + A = \gamma M + (1-\gamma) \left[ \begin{array}{c} + 1 \\ + \vdots \\ + 1 + \end{array} \right] \left[ 1 \: \hdots \: 1 \right] +\] +ovvero con una combinazione convessa della matrice $M$ con la matrice di soli $1$. Il valore di $\gamma$ si può +scegliere a piacimento; Google usa un valore $\gamma = 0.85$. In questo caso la matrice $A$ non ha elementi nulli +e quindi è irriducibile e non è ciclica\footnote{La condizione di ciclicità è quella che crea problemi +con gli autovalori di modulo uguale al raggio spettrale}. Possiamo infine utilizzare un'altra versione del Teorema~\ref{te:PerronFrobenius} +che dice +\begin{te} + Sia $A$ una matrice con elementi strettamente positivi. Allora per ogni suo autovalore $\lambda \neq \rs{A}$ si ha + che vale la diseguaglianza $|\lambda| < |\rs{A}|$. +\end{te} +Quest'ultimo ci assicura la convergenza del nostro metodo. + +\subsection{Implementazione del metodo delle potenze} +Presenteremo in questa sezione una versione del metodo delle potenze adattata alle nostre esigenze. +Consideriamo la matrice $A$ di cui vogliamo trovare l'autovettore sinistro relativo all'autovalore $1$. +Sappiamo che esiste la forma di Jordan di $A$ ed in particolare una matrice $S$ tale che +\[ + S^{-1} A S = J \qquad J = \left[ \begin{array}{c|cc} + 1 & \multicolumn{2}{|c}{\herm{0}} \\ \hline + \multirow{2}{*}{$0$} & \sblocke{\hat J}{2} \\ + & & + \end{array} \right] +\] +Osserviamo ora che $e_1$ è autovettore destro di $J$ ed anche autovettore sinistro. Entrambi sono relativi +all'autovalore $1$. Sappiamo quindi che $e = Se_1$ è autovalore destro di $A$ e quindi è il vettore +con tutte le componenti uguali ad $1$, mentre $\trasp{w} = \trasp{e_1}S^{-1}$ è autovettore sinistro di $A$, +ovvero il vettore che stiamo cercando. +In particolare quanto visto nella precedente sezione ci assicura che $\rs{\hat J} < 1$ e quindi possiamo osservare +che +\[ + \lim_{k\to\infty} J^{k} = e_1\trasp{e_1} \quad \text{e quindi} \quad \lim_{k\to\infty} A^{k} = + \lim_{k\to\infty} SJ^kS^{-1} = Se_1 \trasp{e_1}S^{-1} = e\trasp{w} +\] +Questo (apparentemente) risolve il nostro problema in quanto $e\trasp{w}$ non è altro che la matrice le cui +righe coincidono con il vettore $\trasp{w}$ che è precisamente quanto stiamo cercando. \\ +La complessità di questo calcolo non è però trascurabile, in quanto la moltiplicazione di una matrice +costa in generale $O(n^3)$, decisamente troppo se $n \approx 10^{10}$ come nel nostro caso. +\begin{os} + Consideriamo dunque un vettore $x_0$ tale che $\trasp{e}x_0 = 1 = ||x_0||_{1}$, e definiamo la successione per ricorrenza + \[ + \left\{ \begin{array}{ll} + \trasp{x_0} & = \trasp{x_0} \\ + \trasp{x_{k+1}} & = \trasp{x_{k}} A + \end{array} \right. + \] +Possiamo notare che in generale $x_k = x_0 A^{k}$ e quindi data la nostra scelta oculata di $x_0$ abbiamo +che +\[ + \lim_{k\to\infty} \trasp{x_k} = \lim_{k\to\infty} \trasp{x_0} A^{k} = x_0 e \trasp{w} = \trasp{w} +\] +In questo modo siamo scesi da una complessità $O(n^3)$ ad una $O(n^2)$. +\end{os} +Sfortunatamente $O(n^2)$ nel nostro caso continua ad essere un numero troppo grande; arrivati a questo +punto ci accorgiamo che possiamo sfruttare la particolarità di $A$, che non è assolutamente +una matrice qualsiasi! Sappiamo infatti che è composta quasi esclusivamente di zeri, e quindi una +memorizzazione efficiente ci permetterebbe anche un'implementazione efficiente dei procedimenti +di moltiplicazione. +%% TODO: QUalcosa di più sull'implementazione del metodo + +\subsection{Note tecniche} +Analizzato il problema matematicamente, sorge il bisogno di analizzare le difficoltà di implementazione dovute +all'hardware attualmente disponibile. Una matrice delle dimensioni di $A$ non è realmente memorizzabile +elemento per elemento su nessun calcolatore, e non è pensabile nemmeno in alcun tipo di cluster. \\ +Un rapido conto mostra come, anche ipotizzando di usare dei tipi \verb-float- a 4 byte (in ogni +caso presumibilmente troppo imprecisi) otteniamo uno spazio necessario di $N^2 \cdot 4$ byte, ovvero +circa $10^{20}$ byte = $10^{11}$ GB di RAM, probabilmente un quantitativo superiore a quella di tutti i computer +del mondo messi assieme\footnote{può darsi che nei prossimi anni quest'affermazione smetta di essere vera, ma +non penso sia rilevante ai fini del problema}. +Dobbiamo quindi adottare degli stratagemmi per gestire la memoria in modo efficiente. + +Una prima osservazione è che la nostra matrice $A$ si può scrivere nel seguente modo +\[ +A = \gamma D^{-1} \hat H + (1-\gamma) e\trasp{v} +\] +dove $\gamma$ e $w$ sono rispettivamente il parametro ed il vettore di personalizzazione. Per memorizzare +$A$ possiamo quindi memorizzare $D$ ed $\hat H$, $\gamma$ e $w$. \\ +Questo ci dà dei vantaggi perché la matrice $\hat H$ è ``quasi nulla'' nel senso che è fatta solamente di $0$ ed $1$, +ma la percentuale di $0$ è molto alta\footnote{è infatti presumibile che il numero di link uscenti da una pagina +sia trascurabile rispetto al numero di pagine esistenti}. Possiamo quindi limitarci a memorizzare i seguenti dati: \\[5pt] +\begin{tabular}{|lll|} \hline + \textbf{Variabile} & \textbf{Descrizione} & \textbf{Spazio occupato} \\ \hline \hline + $N$ & l'ordine della matrice $A$, ovvero il numero di pagine esistenti & 4 byte \\ + $m$ & il numero di campi di $\hat H$ diversi da $0$ & \textasciitilde $N$ byte \\ + $i, j$ & vettori delle coordinate dei campi diversi da $0$ di $\hat H$ & \textasciitilde $N$ byte \\ + $\gamma$ & coefficiente di personalizzazione & 4 byte \\ + $w$ & Vettore di personalizzazione & \textasciitilde $N$ byte \\ + $d$ & il vettore con gli elementi diagonali di $D$ & \textasciitilde $N$ byte \\ +\hline \end{tabular} \\ + +Possiamo ora porci il problema di calcolare $d$. Questo è reso apparentemente più complicato dal modo in cui abbiamo salvato +la matrice. In realtà possiamo usare un algoritmo di questo tipo + +\begin{lstlisting}[frame=tb,caption=Calcolo di $d$,label=lst:calcolovettorepers]{} + ! Inizializziamo il vettore d a 0 + d = 0; + ! Questo ciclo calcola i link uscenti da i per ogni i + DO k=1,m + d(i(k)) = d(i(k)) + 1 + END DO +\end{lstlisting} + +\begin{os} + L'aver scelto questo tipo di memorizzazione per la matrice non solo non complica i generali procedimenti + di moltiplicazione, ma riduce addirittura la complessità di questi perché iteriamo sugli elementi diversi da + $0$ invece che su tutti. +\end{os} + + +\section{Una prima implementazione} +In questa sezione ci occuperemo di presentare una prima implementazione della soluzione al problema. +Non ci preoccuperemo troppo di ottimizzare il codice, compito che affronteremo in seguito. +Esporremo inizialmente la struttura generale del programma e poi costruiremo tutte le subroutine necessarie. + +\subsection{La struttura} +Il programma dovrà comporsi delle seguenti parti +\begin{description} + \item[Lettura della matrice] Supporremo di avere un file da cui leggere i dati della matrice. Dobbiamo + definire la sintassi del file e scrivere un subroutine per caricarlo in memoria; + \item[Calcolo del vettore d] Data la matrice di connessione $H$ vorremo calcolare la somma di ogni + riga che ci servirà in seguito per rinormalizzare il vettore di iterazione; + \item[Iterazione] Generiamo un vettore $x$ casuale e lo riscaliamo in modo che $\trasp{e} x = 1$. Fatto + questo cominciamo a calcolare l'iterazione, fino a che l'errore non è piccolo o ragguingiamo il massimo + numero di iterazioni impostato; + \item[Salvataggio] Salviamo su un file il vettore calcolato; +\end{description} + +Per questo avremo bisogno anche di alcune subroutine, ad esempio quella che ci calcoli il prodotto matrice +vettore data la matrice sparsa come l'abbiamo intesa noi. + +\subsection{Prodotto di matrice sparsa per un vettore} +Esponiamo qui un'idea di codice per calcolare questo prodotto matrice vettore. Ricordiamo che per noi una +matrice sparsa è composta di due scalari \lstinline-n-,\lstinline-m- (rispettivamente dimensione e numero di elementi diversi da $0$) +e due vettori \lstinline-i-, \lstinline-j- di dimensione $m$ che sono le coordinate dei punti che valgono $1$.\\ +Il codice è il seguente +\begin{lstlisting}[frame=tb,caption=Calcolo del prodotto matrice vettore,label=lst:matrixvec] + SUBROUTINE dotprod(n,m,i,j,d,x,v,y) + IMPLICIT NONE + ! Il parametro dp dei tipi a doppia precisione + INTEGER, PARAMETER :: dp = KIND(0.D0) + + ! Dichiarazione degli argomenti della funzione + INTEGER, INTENT(IN) :: n,m + INTEGER, DIMENSION(m), INTENT(IN) :: i,j + INTEGER, DIMENSION(n), INTENT(IN) :: d + REAL(dp), DIMENSION(n), INTENT(IN) :: x, v + + ! Dato di output + REAL(dp), DIMENSION(n) :: y + + ! Alcune variabili di comodo + REAL(dp), DIMENSION(n) :: xx + REAL(dp) :: s, gamma = 0.85 + INTEGER :: k + + ! Calcoliamo x trasposto per la matrice D con i d(i) sulla + ! diagonale, e salviamolo in xx, in modo da non modificare x + ! Ricordiamo che i dati in fortrano vengono sempre passati per + ! riferimento! Se modificassimo x qui dentro risulterebbe cambiato + ! anche all'esterno. + DO k=1,m + IF(d(k)/=0) THEN + xx(i(k)) = x(i(k))/d(k) + ELSE + xx(i(k)) = x(i(k))/n + END IF + END DO + + ! Ora eseguiamo la moltiplicazione di xx per la parte non dangling + ! della matrice H cappuccio e salviamo il risultato in y + y = 0.D0 + DO k=1,m + y(j(k)) = y(j(k)) + xx(i(k)) + END DO + + ! Ora calcoliamo le righe dangling dalle quali prima non siamo "passati" + ! perche' i(k) scorre solo sulle righe dove ci sono elementi non nulli + DO k=1,n + IF(d(k) == 0) + s = s + xx(k) + END IF + END DO + + ! Sommiamo i due contributi + y = y + s + + ! Calcolo la personalizzazione + y = y * gamma + (1-gamma)/n + + END SUBROUTINE dotprod +\end{lstlisting} + +%TODO: Presentare un'implementazione completa del programma \ No newline at end of file diff --git a/appendice/AppVibrazioni.tex b/appendice/AppVibrazioni.tex new file mode 100644 index 0000000..c35f1dc --- /dev/null +++ b/appendice/AppVibrazioni.tex @@ -0,0 +1,361 @@ +\chapter{Studio delle Vibrazioni} + +In questo capitolo ci occuperemo di capire come si comporta un sistema elastico, ovvero +un sistema di masse collegate da mollle. In questo modo potremo modellizzare, ad esempio, +strumenti musicali (come le corde di una chitarra o un tamburo) o un generale sistema +dinamico costituito da masse e molle. %TODO: Inserire qualche altro esempio pratico + +\section{Sistemi discreti} +\subsection{L'oscillatore armonico} +Il nostro scopo sarà, principalmente, risolvere sistemi complicati la cui soluzione esatta non +si riesce a calcolare (o non si riesce a farlo agevolmente) direttamente con un foglio ed una penna, +ma per capire di cosa ci occuperemo +è utile cominciare con un esempio noto. \\ +\begin{wrapfigure}{l}{70mm} +\begin{tikzpicture}[scale=0.8] + % Il terreno + \draw[->] (0,0) -- (7,0) node[anchor=south west] {$x$}; + + % La parete + \draw (1,0) -- (1,2.8); + \foreach \i in {0,...,12} + \draw (1,0.2 * \i) -- (0.8, 0.2*\i + 0.2); + + % La molla + \begin{scope}[thick] + \foreach \i in {1,1.5,...,3.5} + \draw (\i,0.5) -- (\i+0.25,1); + \foreach \i in {1,1.5,...,3.5} + \draw (\i+0.25,1) -- (\i+0.5,0.5); + + % E la massa + \draw (4,0) rectangle (5.5,1.5); + \fill[gray!28] (4,0) rectangle (5.5,1.5); +\end{scope} + +\end{tikzpicture} \caption{L'oscillatore armonico} \label{fig:vib:oscarm}\end{wrapfigure} +Consideriamo il sistema costituito da una massa $m$ attaccata tramite una molla di costante +elastica $K$ e lunghezza a riposo nulla ad una parete (tralasciando la gravità), ovvero il sistema +in Figura~\ref{fig:vib:oscarm}.\\ +Questo è un problema di cui conosciamo la soluzione esatta anche se introduciamo una dissipazione proporzionale +alla velocità $-\gamma v$. Abbiamo infatti che la forza applicata sul blocchetto è +\[ + F = -Kx - \gamma \dot{x} +\] +da cui , ricorando l'uguaglianza $F = ma = m\ddot{x}$ si ottiene l'equazione differenziale +\begin{equation} + m \ddot{x} = -K x -\gamma \dot{x} +\end{equation} +Se aggiungiamo le condizioni iniziali $x(0) = x_0$ e $\dot{x}(0) = v_0$ la soluzione è anche unica. +Se consideriamo infatti una soluzione del tipo $x(t) = e^{\lambda t}$ abbiamo che +\[ + \dot{x}(t) = \lambda e^{\lambda t} \qquad \ddot{x}(t) = \lambda^2e^{\lambda t} +\] +e quindi $x$ è soluzione se e solo se +\[ + m \lambda^2 e^{\lambda t} = -K e^{\lambda t} - \gamma \lambda e^{\lambda t} +\] +e considerando che l'esponenziale non è mai nullo questo si verifica solo se +\[ + m \lambda^2 + \gamma \lambda + K = 0 +\] +Escludendo il caso in cui il determinante è $0$ abbiamo due scelte per $\lambda$, che possono +essere reali o complesse. Nel caso reale i due esponenti ci danno una base dello spazio delle soluzioni. +Nel caso complesso possiamo osservare che, essendo le soluzioni coniugate, abbiamo che +\[ + \lambda = \alpha + \beta i \qquad \con{\lambda} = \alpha - \beta i +\] +e quindi +\[ + e^{\lambda t} = e^{\alpha}( \cos{\beta t} + i \sin{\beta t}) \qquad e^{\con{\lambda} t} = + e^{\alpha}(\cos{\beta t} - i \sin{\beta t}) +\] +dalle quali si ottiene che $e^{\alpha t}\cos{\beta t}$ e $e^{\alpha t}\sin{\beta t}$ sono ancora +una base per lo spazio delle soluzioni. \\ +Nel caso con determinante nullo si può mostrare che prendendo $e^{\lambda t}$ e $te^{\lambda t}$ queste +sono ancora una base. In ogni caso, siamo in grado di risolvere esattamente il nostro problema imponendo +le condizioni iniziali. + +Ci piacerebbe ora generalizzare questo procedimento in situazioni più generali e più complicate. In particolare, +vorremmo costruire un modello matematico di qualche situazione di reale interesse, come la seguente + +\subsection{La corda di una chitarra} +Possiamo modellizzare la corda di una chitarra come in Figura~\ref{fig:vib:cordachitarra}, ovvero come $N$ +masse collegate fra loro da $N-1$ molle e fissate, sempre tramite molle, a dei supporti laterali. +\begin{figure}[ht!] + \begin{center} + \begin{tikzpicture} + % Supporto sx + \draw (0,0) rectangle (1,2); + \fill[gray!30] (0,0) rectangle (1,2); + + %% Serie di molle + \draw[snake=snake] (1,1) -- (2,0.5); + \draw (2.2,0.5) circle (0.2) node {$1$}; + \draw[snake=snake] (2.4,0.5) -- (3.2,1.1); + \draw (3.4,1.1) circle (0.2) node {$2$}; + \draw[snake=snake] (3.6,1.1) -- (4.2,0.5); + \draw (4.4,0.5) circle (0.2); + \draw[snake=snake] (4.6,0.5) -- (5.8,1.5); + \draw (6.0,1.5) circle (0.2); + \draw[snake=snake] (6.2,1.5) -- (7.4,0.6); + \draw (7.6,0.6) circle (0.2) node {$N$}; + \draw[snake=snake] (7.8,0.6) --(9,1); + + %% Bloccketto finale + \draw (9,0) rectangle (10,2); + \fill[gray!30] (9,0) rectangle (10,2); + \end{tikzpicture} + \caption{Modello di una corda di chitarra} + \label{fig:vib:cordachitarra} + \end{center} +\end{figure} +Questo modello non è più rappresentato da una equazione differenziale, ma da un sistema di equazioni. +In tutta generalità possiamo assumere che le particelle $p_i$ abbiano massa $m_i$ e che la molla che collega +$p_{i-1}$ con $p_{i}$ abbia costante elastica $k_i$. Indichiamo inoltre con $\gamma_i$ la costante di attrito +della $i$-esima particella. Possiamo scrivere l'equazione del moto di questa proiettandola sugli assi: +\begin{equation} + \left\{ \begin{array}{ll} + \ddot{x_i} m_i &= -k_i (x_i - x_{i-1}) - k_{i+1}(x_i - x_{i+1}) - \gamma_i \dot{x_i} \\ + \ddot{y_i} m_i &= -k_i (y_i - y_{i-1}) - k_{i+1}(y_i - y_{i+1}) - \gamma_i \dot{y_i} + \end{array} \right. +\end{equation} +Queste possono essere risolte indipendemente per determinare il movimento orizzontale e verticale delle +particelle. Per affrontare la risoluzione è conveniente scrivere l'equazione in forma matriciale. + +Sia $y = \trasp{(y_1, \ldots, y_n)}$, $M$ la matrice diagonale tale che $m_{ii} = m_i$ e $R$ la +matrice diagonale tale che $r_{ii} = \gamma_i$. Costruiamo infine la matrice $K$ costruita in questo +modo +\[ + K = \left[ \begin{array}{cccccc} + \ddots & \ddots & & & & \\ + \ddots & \ddots & \ddots & & & \\ + & -k_i & k_i+k_{i+1} & k_{i+1} & \\ + & & \ddots & \ddots & \ddots & \\ + \end{array} \right] +\] +ovvero in modo che le equazioni di prima si possano scrivere nel seguente modo +\begin{equation} + My'' + Ry' + Ky = 0 +\end{equation} +Usiamo ora un piccolo trucco per riportare questa equazione differenziale del secondo ordine ad una +del primo. Definiamo $w = (y,y')$ il vettore ottenuto giustapponendo il vettore $y$ e la sua derivata. +Riscrivendo il sistema\footnote{Stiamo tacitamente assumendo che $M$ sia invertibile ma questo è piuttosto +ragionevole in quanto il determinante di questa è il prodotto delle masse e quindi è $0$ solo se almeno una +delle masse è $0$, situazione che non siamo interessati a rappresentare con il nostro modello} si ottiene +\begin{equation} + w' = \left[ \begin{array}{cc|cc} + \sblocko{0}{2} & \sblocke{I}{2} \\ + & & & \\ \hline + \sblocko{M^{-1}K}{2} & \sblocke{M^{-1}R}{2} \\ + & & & \\ + \end{array} \right] w = Aw +\end{equation} +Supponiamo ora per semplicità che $A$ sia diagonalizzabile, ovvero $A = SDS^{-1}$. Si ha in questo caso +che $w = SDS^{-1}w$ e quindi $S^{-1}w = DS^{-1}w$ dove $D$ è diagonale. Ponendo $z = S^{-1}w$ si ottiene +$z_i = z_i d_{ii}$ e quindi ci si può ricondurre al caso precedente con la soluzione per componenti +$z_i(t) = e^{d_{ii} t}$. +\begin{os} + Osserviamo che, in realtà, conosciamo la soluzione di questa equazione differenziale, e la conosciamo + esplicitamente in ogni caso. Infatti è una verifica piuttosto immediata (e, più probabilmente, un fatto noto) + che $\frac{d}{dt} \Exp{tA}w_0 = A\Exp(tA)w_0$ e quindi è soluzione del nostro problema di Cauchy. Sorge spontanea +la domanda: ``Perché abbiamo sviluppato tutto il ragionamento precedente?''. La riposta è che valutare questa +soluzione per un certo $t$ ha un costo computazionale molto alto. \`E quindi inaccettabile il costo che si ottiene +per la valutazione in tutti i punti che interessano a noi per ottenere un suono bem campionato (circa 44100 al secondo). +\end{os} + +\section{Sistemi continui} \label{sec:vibsistcont} +\subsection{Generalizzazione del caso delle $N$ masse} +Supponiamo di avere una corda tesa fra due supporti fissi, che viene, in un'istante $t = 0$ messa in +una certa posizione con una data velocità iniziale. Siamo interessati a studiare il successivo moto +della corda e le sue vibrazioni, come abbiamo fatto nel caso di $N$ particelle discrete. \\ +Consideriamo la seguente formalizzazione matematica di questo problema. Possiamo descrivere il moto della +corda parametrizzando i suoi punti tramite la coordinata orizzontale $x$ e introducendo una funzione +$u(x,t)$ che definisce la posizone del punto individuato dalla coordinata $x$ al tempo $t$, come si vede nella +Figura~\ref{fig:corda}. \\ +\begin{wrapfigure}{l}{70mm} + \begin{tikzpicture} + % Blocchetto 1 + \draw (0,0) rectangle (1,2); + \fill[gray!30] (0,0) rectangle (1,2); + + % Corda + \draw[very thick] (1,1) .. controls (2.5,2) and (3.5,2) .. (5,1); + + % Secondo blocchetto + \fill[gray!30] (5,0) rectangle (6,2); + \draw (5,0) rectangle (6,2); + + % E qualche chiarimento :) + \draw[->] (-0.5,-0.5) -- (6.5,-0.5) node[anchor=south] {$x$}; + \draw (1,-0.4) -- (1,-0.6) node[anchor=north] {$0$}; + \draw (5,-0.4) -- (5,-0.6) node[anchor=north] {$l$}; + + \draw[dashed] (3,-0.5) -- (3,1.75) node[anchor=south] {$u(x,t)$}; + \end{tikzpicture} + \caption{Rappresentazione della corda} + \label{fig:corda} +\end{wrapfigure} +Un'analisi fisica del fenomeno\footnote{che non è nostro interesse mostrare ora} porta alla seguente +equazione differenziale: +\[ + \frac{\partial^2 u}{\partial t^2} - \sigma \frac{\partial^2 u}{\partial x^2} = 0 +\] +dove $\sigma > 0$ è una costante determinata dalla gravità, dalla tensione e dalla densità +della corda. Prima di risolverla imponiamo le condizioni al contorno +\[ + u(0,t) = u(l,t) +\] +che ci permettono di controllare che gli estremi della corda siano sempre fissati ai supporti, e +le condizioni iniziali +\[ + u_0(x) = u(x,0) +\] +che dà la posizione iniziale e +\[ + v_0(x) = \frac{\partial u}{\partial t}(x,0) +\] +che esprime la velocità iniziale di ogni particella. Questa formalizzazione si può facilmente estendere +supponendo di avere una membrana introducendo $u(x,y,t)$. + +Per ora siamo particolarmente interessati a studiare se esistono delle soluzioni in cui tutti i punti +si muovano con la stessa frequenza $\omega$, anche se eventulamente con diversa ampiezza. Si tratta +di trovare una soluzione della forma +\[ + u(x,t) = v(x) \cdot \cos{(\omega t)} +\] +Osserviamo che data una $u$ di quest forma le derivate parziali diventano +\[ + \frac{\partial^2 u}{\partial t^2} = -v(x) \omega^2 \cos(wt) \qquad \frac{\partial^2 u}{\partial x^2} = v''(x) \cos(wt) +\] +e quindi l'equazione differenziale risulta essere +\[ + \cos(wt) \left[ -\omega^2 v(x) - \sigma v''(x) \right] = 0 +\] +che può essere identicamente nulla solo se +\[ + \omega^2 v(x) + \sigma v''(x) \equiv 0 \iff v''(x) = -\frac{\omega^2 v(x)}{\sigma} +\] + +\subsection{Discretizzazione del modello} + +Per risolvere effettivamente il problema supponiamo di suddividere l'intervallo $[0,l]$ in $n+1$ +punti equidistanti $x_0, \ldots, x_{n+1}$ tali che $x_0 = 0$ e $x_{n+1} = l$. Si avrà dunque +che $x_i - x_{i-1} = h = \frac{l}{n+1}$. \\ +Per comodità poniamo $v(x_i) = v_i$ la posizione dell'$i$-esimo +punto. +Assumiamo ora che la soluzione dell'equazione differenziale sia di classe $C^4$ su $[0,l]$, e facciamo +lo sviluppo in serie centrato in un generico punto $x_i$. +\[ + v(x_i + h) = v_{i+1} = v_i + hv'(x_i) + \frac{h^2 v''(x_i)}{2} + \frac{h^3 v^{(3)}(x_i)}{6} + \frac{h^4 v^{(4)}(\xi_i)}{24} +\] +dove $\xi_i \in (x_i , x_{i+1})$. +Analogamente si ottiene +\[ + v(x_i - h) = v_{i-1} = v_i - hv'(x_i) + \frac{h^2 v''(x_i)}{2} - \frac{h^3 v^{(3)}(x_i)}{6} + \frac{h^4 v^{(4)}(\eta_i)}{24} +\] +dove $\eta_i \in (x_{i-1}, x_i)$. Sommando queste due si ha +\[ + v_{i+1} + v_{i-1} = 2v_i + h^2 v''(x_i) + \frac{h^4}{24}[v^{(4)}(\xi_i) + v^{(4)}(\eta_i)] +\] +e possiamo ancora una volta ottenere un'espressione ``quasi'' esplicita della $v''(x_i)$: +\[ + v''(x_i) = \frac{1}{h^2} ( v_{i+1} + v_{i-1} - 2v_i ) - \frac{h^2}{24}[v^{(4)}(\xi_i) + v^{(4)}(\eta_i)] +\] +Nel nostro modello $h$ è destinato ad essere piccolo, perché $h = \frac{1}{n+1}$ e intuitivamente $n$ deve essere un +numero grande se vogliamo approssimare bene il problema continuo. Abbiamo quindi che $h^2 \to 0$ quando $n \to \infty$ +e vorremmo poter dire che possiamo trascurare il termine con le derivate quarte. +Se così fosse avremmo infatti ricondotto il nostro problema ad un problema di autovalori. + +Possiamo riscrivere infatti le relazione in questo modo +\[ + Av - \frac{h^2}{24} \tau = \lambda v +\] +dove $v = \trasp{( v_1 \ldots v_n )}$ e +\[ + A = \left[ \begin{array}{cccccc} + -2 & 1 & & & & \\ + 1 & -2 & 1 & & & \\ + & \ddots & \ddots & \ddots & & \\ + & & 1 & -2 & 1& \\ + & & & 1 & -2 \\ + \end{array} \right] +\] +e dove $\tau$ è un opportuno vettore che contiene i termini del tipo $\tau_i = v^{(4)}(\xi_i) + v^{(4)}(\eta_i)$. +Osserviamo che possiamo dare una maggiorazione alla norma di $\tau$ perché essendo la derivata quarta di $v$ continua +su un compatto è limitata, e quindi $\forall i \: |\tau_i | \leq M$ per un opportuno $M$. + +Ricordiamo il Teorema~\ref{te:BauerFike}; questo dice che presa una norma assoluta ed $A$ diagonalizzabile ed $F$ +una matrice di perturbazione per ogni autovalore $\lambda$ di $A + F$ esiste un autovalore $\mu$ di $A$ +tale che $||\lambda - \mu|| \leq \cond{T}||F||$ dove $T$ è il cambio di base che diagonalizza $A$. +Se poniamo $F = -\frac{h^2}{24}\tau \trasp v$ dove $v$ è un autovettore di $v$ è tale che +$Av - \frac{h^2}{24}\tau = \lambda v$ allora si ha +\[ + (A - \frac{h^2}{24} \tau \trasp v) v = \lambda v +\] +e quindi esiste $\mu$ autovalore di $A$ tale che\footnote{Osserviamo che, essendo $A$ reale simmetrica +il cambio di base che la diagonalizza è ortogonale e quindi ha condizionamento $1$.} $||\lambda - \mu|| \leq ||F|| += \frac{h^2}{24} \cdot \frac{||\tau\trasp v||}{\trasp vv} \leq \frac{h^2}{24\trasp vv} \sqrt{\rs{\trasp \tau v\trasp v\tau}} += ||\tau|| \frac{h^2}{24 \trasp vv}$; questo si ottiene osservando che la norma di una matrice diade $v\trasp v$ +è data dalla norma du $v$. + +Vogliamo ora mostrare che $\frac{||\tau||}{||v||}$ è limitato superiormente da una costante, in modo +da provare la convergenza della nostra approssimazione. + +Consideriamo la seguente serie di eguaglianze +\[ + \sqrt{h} || \tau ||_2 = ( \sum_{i=1}^{n} v^{(4)}(\xi_i)^2 + v{(4)}(\eta_i)^2)^{\frac 1 2} \sqrt{h} + = ( \sum_{i=1}^{n} h v^{(4)}(\xi_i)^2 + h v{(4)}(\eta_i)^2)^{\frac 1 2} +\] +Osserviamo che l'ultima espressione può essere intesa, per $h \to 0$, come un'approssimazione dell'integrale +di Riemann di $v^2(x)$, ed essendo l'integrale di una funzione continua su un compatto è limitato +superiormente da una costante. Abbiamo quindi provato la tesi. + +Introduciamo ora un metodo iterativo che possiamo vedere come una estensione del metodo delle potenze +e che ci permetterà di studiare nel dettaglio questa situazione. + +\subsection{Il metodo delle iterazioni ortogonali di sottospazi} +Il metodo delle potenze come è stato analizzato nella Sezione~\ref{sec:metodopotenze} è basato sull'idea +di prendere un vettore e iterare su di lui l'applicazione individuata dalla matrice $A$ di cui si vogliono +calcolare gli autovalori. \\ +Osserviamo che questa idea è equivalente (anzi, forse è meglio rappresentata) all'iterare un sottospazio +vettoriale di dimensione $1$. Supponiamo ora di voler calcolare, invece che 1, più autovalori delle matrice, +precisamente $k$ (dove $k < n$ ed $n$ è la dimensione delle matrice) ognuno di molteplicità 1\footnote{% +Questo solo per semplicità di esposizione. Non è complicato generalizzare l'idea}. Una naturale estensione del metodo +sarebbe iterare un sottospazio vettoriale di dimensione $k$. Questo dovrebbe convergere ad un sottospazio di dimensione +$k$ uguale alla somma degli autospazi dei primi $k$ autovalori.\\ +Si può osservare subito un problema computazionale. Sebbene questo discorso sia teoricamente corretto, è facile prevedere +che il nostro spazio di dimensione $k$ convergerà verso l'autospazio relativo +all'autovalore dominante (che è di dimensione 1). Più precisamente, supponiamo di rappresentare lo spazio +con una matrice $x$ $n \times k$ le cui colonne siano una base dello spazio. Allora l'iterazione sarebbe +\[ +\left\{\begin{array}{lcl} + x_0 &=& x \\ + x_{k+1} &=& Ax_k +\end{array} \right. +\] +Per lo stesso ragionamento fatto nel caso del metodo delle potenze originale tutte le colonne di $A$ convergeranno +a multipli dello stesso vettore (quello dell'autovalore dominante). + +Un modo di risolvere questo problema potrebbe essere assicurarsi che durante l'iterazione tutte le colonne restino +ortogonali fra loro. Consideriamo la seguente iterazione +\[ + \left\{ \begin{array}{lcl} + x_0 &=& x \\ + T_{k} &=& A x_k \\ + Q_k R_k &=& T_k \: \text{(scomposizione $QR$ di $T_k$)} \\ + x_{k+1} &=& Q_k + \end{array} \right. +\] +Ricordando che la scomposizione QR di una matrice $n \times k$ con $k < n$ è tale che $Q$ è rettangolare +ed è $n \times k$ e $R$ è quadrata $k \times k$. In particolare si osserva che nella nostra iterazione +le colonne di $Q_k$ sono una +base ortonormale per lo spazio generato dalle colonne di $T_k$. +Osserviamo che calcolare esplicitamente $x_k$ non è realmente necessario e possiamo riformulare +l'iterazione. Poniamo +\[ + B_k = \trasp{Q_k} A Q_k \qquad \text{e} \qquad B_k = U_k D \trasp{U_k} +\] +dove $U_K D \trasp{U_k}$ è la decomposizione spettrale di $B_k$. Si osserva che $T_{k+1} = A Q_k = +Q_k B_k = $. +% TODO: Capire l'iterazione implicita. \ No newline at end of file diff --git a/capitoli/capitolo1.tex b/capitoli/capitolo1.tex new file mode 100644 index 0000000..55c8be3 --- /dev/null +++ b/capitoli/capitolo1.tex @@ -0,0 +1,687 @@ +\chapter{Il polinomio caratteristico} +In questo capitolo ci occuperemo di descrivere le forme normali tipicamente usate per +calcolare agevolmente gli autovalori di una matrice. Descriveremo dei metodi efficienti +per valutare in un punto il polinomio caratteristico, che potranno essere usati +nei capitolo seguenti per implementare gli algoritmi di calcolo effettivo. \\ +Premetteremo a questo una breve esposizione degli utilizzi pratici più comuni dei +metodi che verranno in seguito esposti. + +\section{Esempi pratici di utilizzo} +Prima di cominciare ad analizzare in dettaglio l'argomento presentiamo due applicazioni pratiche +(che poi verranno analizzate in maggior dettaglio) che richiederanno la determinazione mediante +metodi numerici degli autovalori di una matrice associata al problema. + +\subsection{Risoluzione di equazioni algebriche} +\label{subsec:esempi:eqalgebriche} +Un problema comune è, data un'equazione algebrica della forma +\[ + p(z) = p_0 + p_{1}z + \ldots + p_{n}z^{n} = 0 +\] +trovare la $n$ radici $z_1 , \ldots , z_n$ tali che $p(z_i) = 0 \ \forall i = 1\ldots n$. + +Risolvere questo problema tramite algoritmi di iterazione funzionale, come vedremo, potrebbe non essere +conveniente, e quindi ci si riconduce spesso (quasi sempre) ad un problema di calcolo di autovalori tramite +il seguente procedimento. \\ +Consideriamo la matrice +\[ + F = \begin{bmatrix} + 0 & 0 & \ldots & -\frac{p_0}{p_n} \\ + 1 & 0 & & -\frac{p_1}{p_n} \\ + 0 & \ddots & \ddots & \vdots \\ + 0 & \hdots & 1 & -\frac{p_{n-1}}{p_n} \\ + \end{bmatrix} +\] +detta matrice di \emph{Frobenius}\index{Frobenius, matrice di} o matrice \emph{Companion} \index{Companion, matrice}. Questa +ha come polinomio caratteristico esattamente $p(z)$ e quindi i suoi autovalori sono esattamente le radici dello stesso. \\ +Osserveremo inoltre che sarà possibile mostrare la stabilità all'indietro del procedimento per calcolare +gli autovalori, ovvero potremo essere sicuri che gli autovalori calcolati mediante l'aritmetica approssimata +di macchina saranno le radici di un polinomio i cui coefficienti ``disteranno poco'' da quelli originali di $p(z)$. +Questo in generale non ci assicura di avere un risultato con una buona approssimazione; più precisamente questo sarà +garantito solo nel caso in cui il problema sia ben condizionato\footnote{Ricordiamo che un problema è ben condizionato +quando a piccole variazioni dei dati iniziali corrispondono piccole variazioni dei dati finali.}. + +\subsection{Equazioni differenziali} +Un altro caso in cui il calcolo di autovalori ci permetterà di risolvere un problema comune sarà quello delle +equazioni differenziali. Non abbiamo ancora gli strumenti per approfondire questo argomento, ma possiamo anticipare +che i metodi per il calcolo di autovalori ci permetteranno sia di arrivare alla soluzione (in qualche caso) che +di stimare l'effetto di una perturbazione dei dati iniziali (in altri casi). + +\section{Analisi del condizionamento} \label{sec:analisidelcondizionamento} +In questa sezione vorremmo analizzare il condizionamento del nostro problema. Il calcolo degli autovalori non +è sempre un problema ben condizionato, come possiamo mostrare con questo esempio: \\ +Sia $F$ la matrice di Frobenius associata al polinomio $z^n$, ovvero la matrice con soli zeri ad eccezione della +sottodiagonale, composta da soli $1$. \\ +I suoi autovalori sono tutti $0$ ed hanno moleplicità algebrica $n$ e molteplicità geometrica $1$\footnote{il che si +capisce facilmente notando che la matrice $F$ è in forma di Jordan}. \\ +Se noi perturbiamo la matrice sottraendole la matrice $\eps e_1 \trasp{e_n}$ otteniamo la matrice di Frobenius +associata al polinoio $z^n + \eps$. Da quanto abbiamo osservato nella Sezione~\ref{subsec:esempi:eqalgebriche} sappiamo che +gli autovalori di quest'ultima sono le radici $n$-esime dell'unità moltiplicate per $||\eps||^{\frac{1}{n}}$; +possiamo osservare che al crescere di $n$ anche se $\eps$ è piccolo questo numero può diventare piuttosto grande, e +portare quindi ad errori non trascurabili. +\subsection{Il caso di una matrice diagonalizzabile} +Cominciamo ad analizzare un caso relativamente semplice, ovvero quello dove $A$ è una matrice diagonalizzabile, +per cui dimostreremo un risultato detto +\begin{te}[di Bauer - Fike] \label{te:BauerFike} + Se $A \in \mat{\R}{n}$ è una matrice diagonalizzabile tramite il cambio di base $V^{-1}$ ed $\eta$ è + un autovalore della matrice perturbata $A + \delta A$ allora esiste un autovalore $\lambda$ di $A$ tale che + \[ + ||\lambda - \eta|| \leq ||\delta A || \cdot \cond{V} + \] +\end{te} +\begin{proof} +Sappiamo che esiste $V$ base di autovettori tali che +\[ + A = VDV^{-1} \; \textrm{con} \ D \ \textrm{diagonale} +\] +Supponiamo ora di aver calcolato $\eta$ autovettore di una matrice $A + \delta A$ e verifichiamo +quanto dista $\eta$ dagli autovettori di $A$.\\ +Osserviamo che questo equivale a +\[ + (A + \delta A) y = \eta y \ \iff \ (A - \eta y) = \delta A y +\] +Possiamo distinguere due casi: +\begin{description} + \item[$(A-\eta I)$ è singolare] Questo è il caso migliore in cui possiamo sperare, in quanto questo significa + che $\eta$ è un autovalore di $A$ e quindi la distanza è $0$. + \item[$(A-\eta I)$ non è singolare] ed allora ammette un'inversa. Abbiamo quindi che + \[ + y = -(A - \eta I)^{-1}( \delta A y ) + \] + Consideriamo dunque una norma matriciale indotta tale che data una matrice $D$ diagonale si abbia + $||D|| = \max_{i = 1 \ldots n}\{|d_{ii}|\}$\footnote{la norma $1$, $2$ e $\infty$ soddisfano questo + requisito, ad esempio; questo tipo di norma è detta \emph{assoluta}.} ed effettuiamo le seguenti maggiorazioni + \[ + ||y|| \leq ||(A -\eta I)^{-1}|| \cdot || \delta A || \cdot ||y|| + \] + che si verifica solo se (ricordando che essendo $y$ un autovettore + $y \neq 0$ e quindi $||y|| \neq 0$) + \[ + 1 \leq ||V|| \cdot ||( D -\eta I)^{-1}|| \cdot ||V^{-1}|| \cdot || \delta A || + \leq \frac{\cond{V} \cdot ||\delta A ||}{\min_{i = 1 \ldots n}\{ \lambda_i - \eta\}} + \] + da cui si ottiene che esiste un $j \in 1 \ldots n$ tale che + \[ + ||\lambda_j - \eta|| \leq ||\delta A || \cdot \cond{V} + \] +\end{description} + \`E evidente quindi che in entrambi i casi è valida la diseguaglianza della tesi (nel primo caso si ha addirittura + che $||\lambda - \eta|| = 0$), e quindi il teorema è provato. +\end{proof} + +\begin{os} + Dobbiamo fare attenzione al fatto che questa maggiorazione ottenuta dal precedente teorema è in valore + assoluto, e quindi non ci dice nulla sull'errore relativo. Saremo certi di ottenere un buon + condizionamento solo nel caso in cui gli autovalori trovati non siano troppo ``piccoli''. +\end{os} + +Data questa maggiorazione dell'errore ci possiamo chiedere come fare a minimizzare l'unico fattore +su cui possiamo avere un ``controllo'', ovvero $\cond{V}$. Dalle proprietà delle norme matriciali +indotte sappiamo che $\forall V \ \cond{V} \geq 1$. \\ +Inoltre possiamo osservare che se $V$ è una matrice unitaria allora $\cond{V}$ vale esattamente $1$. \\ +Sembra quindi opportuno, quando possibile, cercare di rendere diagonale la matrice $A$ tramite un cambio +di base unitario. Quando è possibile farlo? \\ +Grazie alla forma normale di Schur possiamo dare una caratterizzazione completa delle matrici per cui questo +è possibile. Si può infatti provare che data $A \in \mat{\C}{n}$ questa è diagonalizzabile mediante +matrici unitarie se e solo se $A$ è normale, ovvero $A\herm{A} = \herm{A}A$. + +\begin{os} + Ci ricordiamo che per risolvere i sistemi lineari abbiamo individuato due classi di metodi: + \begin{description} + \item[I metodi diretti] i quali forniscono una soluzione ``esatta'' del problema in un numero + finito di passi, a meno dell'errore di macchina e algoritmico. + \item[I metodi iterativi] i quali invece forniscono una soluzione approssimata del sistema, + iterando un numero finito di passi di una successione che converge solamente dopo un numero + infinito. + \end{description} +Nel caso della ricerca degli autovalori la prima classe di metodi non può essere applicata, in quanto +il problema è equivalente a trovare le radici del polinomio caratteristico, problema che \emph{non può +essere risolto tramite una formula}. +\end{os} + +Siamo quindi consci che la nostra unica opportunità per arrivare alla soluzione sarà eseguire una +successione di cambi di base (che sono degli invarianti del problema) che porti la matrice in una forma +in cui gli autovalori siano facilmente determinabili. \\ +Il condizionamento del problema sarà quindi maggiorabile con il prodotto dei condizionamenti di tutti i +cambi di base (si può infatti mostrare che prese due matrici $V$, $S$ si ha $\cond{VS}\leq\cond{V}\cdot\cond{S}$) +e quindi dovremo +cercare dei cambi di base con un piccolo condizionamento (come, ad esempio, quelli unitari). + +Il teorema di Bauer--Fike ci permette di dare una maggiorazione globale sul condizionamento degli autovalori, +ma in alcuni casi è possibile dare anche una maggiorazione del condizionamento per un autovalore singolo. \\ +Consideriamo ad esempio il caso di un autovalore con molteplicità algebrica e geometrica $1$. + +\begin{pr} + Data una matrice $A \in \mat{\C}{n}$, una matrice di perturbazione $\eps F$, un autovalore + $\lambda \in \spe{A}$ ed $\eta$ un autovalore della matrice perturbata $A + \eps F$ si ha che, + dati $y, w$ autovettori destro e sinistro di modulo $1$ relativi a $\lambda$ + \[ + ||\eta - \lambda|| \leq \frac{1}{\herm{w}y} \cdot ||\eps F|| + \] +\end{pr} +\begin{proof} + Sappiamo che $\eta$ e il suo autovettore relativo\footnote{che evidentemente non è unico, ma possiamo supporre + di sceglierlo in modo continuo} $y$ sono funzioni analitiche di $\eps$ e quindi + possiamo scrivere + \[ \left\{\begin{array}{l} + \eta(\eps) = \lambda + \eps \cdot \xi + O(\eps^2) \\ + y(\eps) = y + \eps \cdot w + O(\eps^2) \\ + \end{array}\right. + \] +Effettuando un'analisi al I ordine otteniamo +\begin{align*} + (A + \eps F) ( y + \eps w) & = (\lambda + \eps \xi)(y + \eps w) \\ + Ay + \eps A w + \eps Fy & = \lambda y + \lambda \eps w + \eps \xi y \\ +\end{align*} +considerando che $Ay = \lambda y$ e dividendo tutto per $\eps$ si ottiene +\[ + Aw + Fy = \lambda w + \xi y +\] +Sappiamo inoltre che deve esistere $u$ autovettore sinistro unitario di $A$ relativo all'autovalore +$\lambda$ e quindi, moltiplicando tutto per $u$ +\begin{align*} + \herm{u}Aw + Fy & = \lambda \herm{u} w + \xi \herm{w} y \\ + Fy & = \xi \herm{u} y +\end{align*} +Ricordando infine che, a meno di termini di ordine maggiore di $1$, $||\eps \xi|| = ||\lambda - \eta||$ e +che $||u|| = ||y|| = 1$ si ottiene +\[ + ||\lambda - \eta|| = ||\eps \xi|| \leq || \eps F|| \cdot \frac{1}{\herm{u}y} +\] +che è la tesi. +\end{proof} + +%% 1 ottobre 2009 +\section{Operazioni preliminari} +In questa sezione vorremmo introdurre delle operazioni preliminari da compiere prima di applicare +un qualsiasi metodo per il calcolo effettivo degli autovalori. \\ +\subsection{Matrici di Householder} +I metodi che solitamente vengono usati accettano infatti in input solo matrici particolari, più +precisamente +\begin{description} + \item[Matrici hermitiane tridiagonali] Ovvero delle matrici hermitiane tali che $a_{ij} = 0$ se + $| i -j | \geq 2$ e tale che $a_{ij} = \con{a_{ji}} \ \forall i,j \in 1 \ldots n$. + \item[Matrici in forma di Hessenberg superiore] Ovvero le matrici tali che $a_{ij} = 0$ se $i > j +1$. +\end{description} + +\begin{figure}[h] +\begin{center} + \subfigure{ +$ T = + \begin{bmatrix} + \alpha_1 & \con{\beta_1} & 0 & 0 \\ + \beta_1 & \ddots & \ddots & 0 \\ + 0 & \ddots & \ddots & \con{\beta_{n-1}} \\ + 0 & 0 & \beta_{n-1} & \alpha_n \\ + \end{bmatrix}$ +} +\subfigure{ +$ H = +\begin{bmatrix} + \times & \hdots & \hdots & \times \\ + \times & \ddots & & \vdots \\ + 0 & \ddots & \ddots & \vdots \\ + 0 & 0 & \times & \times \\ +\end{bmatrix}$ +} +\end{center} + \caption{Struttura delle matrici tridiagonali e di Hessenberg superiore} +\end{figure} + +Abbiamo quindi la necessità di trovare un algoritmo efficiente e stabile per trasformare +una generica matrice $A$ in una matrice $T$ o $H$ rispettivamente tridiagonale o in forma +di Hessenberg superiore. \\ +Per quanto osservato nella Sezione~\ref{sec:analisidelcondizionamento} cercheremo una $Q$ unitaria +tale che +\[ + QA\herm{Q} = T \qquad \textrm{oppure} \qquad QA\herm{Q} = H +\] +Si osserva subito che sia $Q$ che $T$ sono unitarie e quindi una condizione necessaria per il verificarsi +della prima eventualità è che anche $A$ sia hermitiana\footnote{in quanto la stiamo trasformando per congruenza, +che conserva l'hermitianità} + +\begin{de}[Matrici di Householder] + Una matrice $P$ si dice \emph{matrice elementare di Householder} se esistono $\sigma \in \R \setminus \{0\}$ + e $u \in \R^n$ tali che $P = I - \sigma u \herm{u}$ e $\sigma = \frac{2}{||u||_2}$. +\end{de} + +Sia $P$ una matrice di Householder. Allora valgono le seguenti: +\begin{description} + \item[$P$ è Hermitiana] Se abbiamo $P = I -\sigma u \herm{u}$ allora $p_{ij} = u_i\con{u_j}$, e quindi + $\con{p_{ji}} = \con{u_j\con{u_i}} = u_i\con{u_j} = p_{ij}$. + \item[$P$ è unitaria] Se consideriamo che $P$ è hermitiana abbiamo che $P\herm{P} = P^2 = + (I - \sigma u \herm{u})^2 = I -2\sigma u \herm u + \sigma^2 \herm u u u \herm u = I$. + \item[$\deter{P} = -1$] Consideriamo una base dello spazio ottenuta imponendo come primo + vettore $u$ e costruendo gli altri ortogonali a lui. Si osserva facilmente che la matrice + associata a $P$ diventa come la matrice identità ad eccezione del posto $(1,1)$ dove si trova + un $-1$ (infatti $Pu = -u$) e quindi $\det{P} = -1$. +\end{description} + +Consideriamo ora una generica matrice $A$ e mostriamo che esiste una matrice unitaria $P$ tale che +$PA\herm{P}$ ha tutti gli elementi delle prima colonna con indice maggiore di $1$ uguali a $0$. +Questo sarà il passaggio che poi ci permetterà di mostrare per induzione che si può portare una +qualsiasi matrice in forma di Hessenberg superiore. \\ +Data la seguente matrice generica $A$ +\[ + A = \left[ \begin{array}{c|cc} + a_{11} & \multicolumn{2}{|c}{\herm{w}} \\ + \hline + \multirow{2}{*}{$v$} & \sblocke{\; \hat{A}\;}{2} \\ + & & + \end{array} \right] +\] +So che esiste una matrice $\hat P$ di Householder tale che $\hat{P}v = \beta e_1$ da cui si ottiene che +\[ + P = \left[ \begin{array}{c|cc} + 1 & \multicolumn{2}{c}{\herm{0}} \\ + \hline + \multirow{2}{*}{$0$} & \sblocke{ \quad \hat P \quad}{2} \\ + & & + \end{array} \right] +\qquad + PA\herm{P} = \left[ \begin{array}{c|cc} + a_{11} & \multicolumn{2}{|c}{\herm{w} \herm{\hat{P}}} \\ +\hline + \multirow{2}{*}{$\hat Pv$} & \sblocke{\hat P \hat A \herm{\hat{P}}}{2} \\ + & & + \end{array} \right] +\] +Ricordando che $\hat{P}v = \beta e_1$ si ottiene che in $n-2$ passi la matrice di partenza si può ridurre +in forma di Hessenberg superiore. \\ +Si può osservare che se la matrice di partenza era hermitiana anche la matrice ridotta lo sarà, +dato che la trasformazione per matrici di Householder è unitaria, e quindi la matrice ottenuta +sarà tridiagonale. + +\subsection{Valutazione del costo computazionale} +Il costo computazionale di ogni passo del procedimento sopra descritto è dato da +\begin{enumerate} + \item Calcolo di $\hat P$; + \item Calcolo di $\herm{w} \hat{P}$ (qualora sia necessario, cioè quando $A$ non è + hermitiana); + \item Calcolo di $\hat{P}\hat{A}\herm{\hat{P}}$; +\end{enumerate} +I primi due sono $O(n)$ mentre il terzo è il più grande, $O(n^2)$. Il procedimento completo +risulta quindi con un costo computazionale di $O(n^3)$. + +\subsection{I vantaggi della riducibilità} +Data la matrice in forma tridiagonale o in forma di Hessenberg superiore è facile verificare che +la condizione di riducibilità è verificata solo se $\exists i \: \beta_i = 0$ dove i $\beta_i$ sono +gli elementi della sottodiagonale. Non è però vero il contrario, ovvero se i $\beta_i$ sono tutti +diversi da $0$ non è certo che la matrice sia irriducibile\footnote{questa implicazione vale solo +nel caso hermitiano tridiagonale}. D'ora in poi diremo che la matrice è \emph{non riducibile} +se tutti i $\beta_i$ non sono $0$, mentre useremo il termine \emph{irriducibile} per +indicare la condizione usuale di irriducibilità. \\ +La riducibilità porta notevoli vantaggi computazionali alla risoluzione del problema in quanto +si ottiene una matrice del tipo +\[ + M = \left[ \begin{array}{c|c} + A & B \\ + \hline + 0 & C \\ + \end{array} \right] +\] +e quindi è immediato verificare che gli autovalori di $M$ sono quelli di $A$ uniti a quelli di $C$. + +\begin{pr} + Sia $A$ una matrice tridiagonale hermitiana irriducibile. Allora tutti i suoi autovalori hanno molteplicità $1$. +\end{pr} +\begin{proof} + Sia $\lambda$ un autovalore di $A$. Sappiamo che $A - \lambda I$ non è un isomorfismo, e che la molteplicità + geometrica di $\lambda$ è pari al rango di $A - \lambda I$. + Se consideriamo il minore di sud-ovest $J$ possiamo osservare che: + \begin{itemize} + \item $J$ è triangolare superiore + \item la diagonale $J$ è composta dagli elementi $\beta_1 \ldots \beta_n$ della sottodiagonale di $A$ + \end{itemize} +Queste due osservazioni ci permettono di concludere che $\deter{A - \lambda I} = \prod_{i=0}^{n}~\beta_i$ che +è diverso da $0$, e quindi la molteplicità geometrica di $\lambda$ è $1$. Sapendo che la matrice è +hermitiana possiamo anche essere sicuri che sia diagonalizzabile, e quindi che per ogni autovalore +la molteplicità geometrica coincida con quella algebrica. In particolare l'autovalore $\lambda$ ha +molteplicità $1$. +\end{proof} + +Osserviamo che se la matrice invece che essere tridiagonale hermitiana è in forma di Hessenberg superiore, +possiamo solo affermare che ogni autovalore ha molteplicità gemetrica $1$. Non possiamo però controllare +la molteplicità algebrica e quindi non possiamo essere certi della diagonalizzabilità della matrice. + +\section{Il polinomio caratteristico} +Il primo metodo che si può pensare di applicare cercando gli autovalori di una data matrice $A$ è +quello di cercare gli zeri del polinomio caratteristico. Nonostante questo sia raramente applicabile, +alcune analisi sulla ``struttura'' del polinomio potranno fornirci dei risultati teorici che ci saranno +utili in seguito. + +\subsection{Il caso delle matrici Hermitiane tridiagonali} \label{subsec:hermdiag} +Consideriamo una matrice $A \in \mat{\C}{n}$ in forma tridiagonale hermitiana. +In tutta la sezione indicheremo con +\begin{description} + \item[$A_k$: ] Il minore di nord-ovest di ordine $k$ della matrice $A$. Osserviamo in particolare + che si tratta ancora di una matrice hermitiana tridiagonale per ogni $k$. + \item[$p_k(z)$: ] Il polinomio caratteristico delle matrice $A_k$, ed in particolare $p_n = p$; + \item[$\lambda_i^{(k)}$: ] L'$i$-esimo autovalore della matrice $A_{k}$. L'ordinamento non ha importanza + dove non è espressamente specificato; +\end{description} +Se proviamo a calcolare il polinomio caratteristico di $A_k$ sviluppando sull'ultima riga (o, analogamente, +sull'ultima colonna) otteniamo la seguente relazione ricorrente e tre termini: +\[ +p_k(z) = \deter{A - zI} = (\alpha_k - z) p_{k-1}(z) - |\beta_{k-1}|^2 p_{k-2}(z) +\] +Questa relazione ha senso anche nel caso $k = 1, 2$ a patto di porre $p_{0}(z) = 1$ e $p_{-1}(z) = 0$. +Una volta nota questa relazione valutare il polinomio caratteristico di $A = A_n$ in un punto diventa molto +meno oneroso (computazionalmente) rispetto al calcolare tutti i coefficienti. \\ +Si può infatti stimare la complessità del calcolo $p_k(z)$ a partire da $p_{k-1}(z)$ e $p_{k-2}(z)$ +con circa $5$ operazioni aritmetiche, e quindi +la valutazione del polinomio in un qualsiasi punto $z$ risulta costare $O(n)$. +\begin{os} \label{os:autovalpol} + Dalla formula possiamo dedurre che se $\xi$ è un autovalore della matrice $A_k$ allora non può essere + anche autovalore della matrice $A_{k-1}$. +\end{os} +Supponiamo per assurdo che $p_{k-1}(\xi) = 0 = p_k(\xi)$. Dunque si avrebbe +$p_k(\xi) = 0 = (\alpha_k - \xi) p_{k-1}(\xi) - |\beta_{k-1}|^2 p_{k-2}(\xi) = |\beta_{k-1}|^2 p_{k-2}(\xi)$ +e quindi anche $p_{k-2}(\xi)$ deve essere nullo. Ripetendo questa considerazione si ottiene che anche $p_0(\xi)$ +deve essere nullo, ma $p_0(\xi) = 1$ (il polinomio costante) che è assurdo. +In definitiva per ogni $k \neq j$ si ha che $\spe{A_k} \cap \spe{A_j} = \emptyset$. + +\subsection{L'equazione secolare} \label{sec:eqsecolare} +Una domanda che sorge spontanea dopo queste considerazioni è: ``Che relazione possiamo trovare +fra gli autovalori di due minori $A_k$ e $A_{k-1}$ di una matrice $A$?''. \\ +Il polinomio come scritto nella sezione precedente ci permette solamente di notare che +gli autovalori sono distinti. Possiamo però estrapolare delle informazioni più dettagliate rappresentandolo +in una opportuna base (di polinomi). +Per questo paragrafo possiamo limitarci, per semplicità di notazione, al caso di una matrice simmetrica +in $\mat{\R}{n}$, anche se il caso complesso si tratta con gli stessi passaggi. +Dividiamo la matrice $A$ in blocchi nel modo seguente +\[ + A= \left[ \begin{array}{cc|c} + \sblocko{A_{n-1}}{2} & \\ + & & \beta_{n-1} \\ \hline + & \beta_{n-1} & \alpha + \end{array} + \right] +\] +Dato che la matrice $A_{n-1}$ è simmetrica esiste una matrice ortogonale $Q_{n-1}$ tale che +$D_{n-1} = Q_{n-1}A\trasp{Q_{n-1}}$ dove $D$ è la matrice con gli autovalori di $A$ sulla +diagonale. \\ +Consideriamo dunque la matrice $\hat Q$ così composta: +\[ + \hat Q = \left[ +\begin{array}{cc|c} + \sblocko{Q_{n-1}}{2} & \\ + & & \\ \hline + & & 1 +\end{array} \right] +\] +$\hat Q$ è sempre ortogonale e si verifica che +\[ + \left[ \begin{array}{cc|c} + \sblocko{Q_{n-1}}{2} & \\ + & & \\ \hline + & & 1 + \end{array} \right] + \left[ \begin{array}{cc|c} + \sblocko{A_{n-1}}{2} & \\ + & & \beta_{n-1}\\ \hline + & \beta_{n-1} & \alpha_{n} \\ + \end{array} \right] + \left[ \begin{array}{cc|c} + \sblocko{\trasp{Q_{n-1}}}{2} & \\ + & & \\ \hline + & & 1 + \end{array} \right] += +\left[ \begin{array}{cc|c} + \sblocko{D_{n-1}}{2} & \multirow{2}{*}{$w$} \\ + & & \\ \hline + \multicolumn{2}{c|}{\trasp{w}} & 1 + \end{array} \right] = B_n +\] +Una matrice come $B_n$, ovvero una diagonale ``orlata'' sull'ultima riga e sull'ultima +colonna si dice \emph{matrice a freccia}\footnote{Penso che il motivo sia piuttosto +evidente guardando la forma degli elementi non nulli}. +Dato che questa trasformazione viene realizzata tramite matrici ortogonali anche il +polinomio caratteristico rimane invariato e quindi si ha che +\[ + p_n(z) = \deter{B_n - zI} +\] +Ricordiamo ora un risultato di Analisi Numerica +\begin{pr} + Sia $M$ una matrice a blocchi come la seguente + \[ + M = \left[ \begin{array}{c|c} + A & B \\ \hline + C & D \\ + \end{array} \right] + \] +dove $A$ e $D$ sono matrici quadrate. Allora Esiste una matrice $\Gamma$ delle stesse dimensioni di $D$ +tale che +\[ + M = \left[ \begin{array}{c|c} + I & 0 \\ \hline + \times & I + \end{array} \right] + \left[ \begin{array}{c|c} + A & 0 \\ \hline + 0 & \Gamma + \end{array} \right] +\left[ \begin{array}{c|c} + I & \times \\ \hline + 0 & I + \end{array} \right] +\] +ed in particolare $\Gamma = D - C A^{-1} B$ è detta \emph{complemento di Schur di $A$ in $M$}. +\end{pr} +\begin{proof} + Provando a scrivere la relazione più esplicitamente otteniamo +\[ + \begin{bmatrix} + I & 0 \\ + \trasp{\alpha} & I + \end{bmatrix} + \begin{bmatrix} + A & 0 \\ + 0 & \Gamma + \end{bmatrix} + \begin{bmatrix} + I & \beta \\ + 0 & I + \end{bmatrix} = + \begin{bmatrix} + A & B \\ + C & D + \end{bmatrix} +\] +dove $\trasp \alpha$, $\beta$ e $\Gamma$ sono le incognite. Sviluppando si ottengono le seguenti equazioni +\[ + \left\{ + \begin{array}{l} + A \beta = B \\ + \trasp \alpha A = C \\ + \trasp \alpha A \beta + \Gamma = D + \end{array} \right. +\] +Ricordando che $\deter{A} \neq 0$ e considerando le prime due equazioni come degli insiemi di +sistemi lineari si ottiene che esistono e sono unici $\alpha$ e $\beta$ che soddisfano le richieste, ed +in particolare sono +\[ +\left\{ \begin{array}{l} + \trasp \alpha = C A^{-1} \\ + \beta = A^{-1} B +\end{array} \right. +\] +In conclusione $\Gamma = D - \trasp \alpha A \beta = D - C A^{-1} A A^{-1} B = D - C A^{-1} B$ +e quindi la tesi è provata. +\end{proof} +\begin{os} + Questa proposizione ci è utile perché ci permette di calcolare il determinante di una matrice di questo +tipo calcolando semplicemente il prodotto del determinante di $A$ per quello di $\Gamma$. +\end{os} +Osserviamo prima di tutto che la matrice $B_n - zI$, per $z$ fissato, è in questa forma. Possiamo +scrivere +\[ + B_n - zI = \left[ \begin{array}{ccc|c} + \lambda_1^{(n-1)} - z & & & \multirow{3}{*}{$w$} \\ + & \ddots & & \\ + & & \lambda_{n-1}^{(n-1)} -z& \\ \hline + \multicolumn{3}{c|}{\trasp{w}} & \alpha_n -z + \end{array} \right] = +\left[ \begin{array}{cc|c} + \sblocko{E_{n-1}}{2} & \multirow{2}{*}{$w$} \\ + & & \\ \hline + \multicolumn{2}{c|}{\trasp{w}} & \alpha_n -z + \end{array} \right] +\] +dove $E_{n-1}$ ed $[ \alpha_n -z ]$ sono quadrate\footnote{la seconda in particolare è +semplicemente uno scalare}. +Calcoliamo dunque il polinomio caratteristico della matrice (in tutti i punti dove $E_{n-1}$ è +invertibile, ovvero in tutti gli $z$ che sono diversi dagli autovalori di $A_{n-1}$) +$B_n$ +\[ +p_n(z)=\deter{B_n - zI}=\deter{A} (\alpha_n - z - \trasp{w}E_{n-1}^{-1}w) +\] +E quindi possiamo scrivere +\[ + p_n(z) = \Bigg[ \prod_{j=1}^{n-1} (\lambda_j^{(n-1)} - z) \Bigg] \cdot + \Bigg[ \alpha_n - z - \sum_{i=1}^{n} \frac{w_i^2}{\lambda_i^{(n-1)} - z}\Bigg] +\] +e per continuità possiamo estenderlo a tutto $\C$, ottenendo +\[ + p_n(z) = (\alpha_n - z)\cdot \prod_{j=1}^{n-1} (\lambda_j^{(n-1)} - z) - \sum_{i=1}^{n}w_i^2\prod_{\substack{i=1\\j\neq i}}^{n}(\lambda_i^{(n-1)}-z) +\] +\begin{os} + Nel definire il polinomio siamo stati costretti ad escludere una quantità finita di punti (precisamente + gli autovalori di $A_{n-1}$), ma è evidente che + due funzioni polinomiali su $\C$ o su $\R$ che sono uguali a meno di una quantità finita di punti devono coincidere. +\end{os} +Questa forma del polinomio ci permette di valutarlo negli autovalori $\lambda_i^{(n-1)}$ della matrice +$A_{n-1}$. Otteniamo la seguente +\[ + p_n( \lambda_i^{(n-1)} ) = 0 - w_i^2\prod_{\substack{i=1\\i\neq j}}^{n} (\lambda_i^{(n-1)} - z) \neq 0 +\] +e quindi, in particolare, per ogni $i$ si ottiene $w_i \neq 0$. +Siamo ora interessati a cercare le radici del polinomio, sfruttando le informazioni che supponiamo +di avere sugli autovalori della matrice di ordine $n-1$. \\ +Consideriamo che $\forall j=1 \ldots n-1 \quad p(\lambda_j^{(n-1)}) \neq 0$, per quanto visto nell'~Osservazione~\ref{os:autovalpol}, +e quindi le radici del polinomio sono le radici della funzione +\[ + g(\xi) = \alpha_n - \xi- \sum_{j=1}^{n} \frac{w_i^2}{\lambda_j^{(n-1)} - \xi} +\] +Questa equazione ($g(\xi) = 0$) è detta \emph{equazione secolare}. Le ragione del nome curioso non +sono note, anche se esistono due teorie principali. Una sostiene che l'appellativo deriva dall'usanza +diffusa nei primi del novecento di chiamare \emph{polinomio secolare} il polinomio caratteristico +di una matrice, mentre l'altra sostiene che invece il nome sia dovuto ad una sua utilità +in alcune teorie di descrizione del moto di pianeti (che tipicamente hanno tempi piuttosto lunghi). \\ +Ricordando che annullare $g$ è la stessa cosa che annullare $p_n$ possiamo tracciare un grafico +qualitativo di $g$ (come si vede in Figura~\ref{fig:eqsecolare}) e notare che ad ogni asintoto verticale +di $g$ corrisponde un autovalore di $A_{n-1}$ e che gli autovalori della matrice $A_n$ sono separati +da quelli di $g$, in quanto la derivata di $g$ è sempre negativa (e quindi la funzione monotona). +\begin{figure}[ht] + \begin{center} + \begin{tikzpicture} +\fill[blue!8] (-6.5,-3.5) rectangle (5.5,2.5); + %% Disegnamo gli assi +\begin{scope}[very thin] + \draw[->] (-6,0) -- (5,0) node[anchor=north] {$\xi$}; + \draw[->] (-0.5,-3) -- (-0.5,2) node[anchor=east] {$g(\xi)$}; +\end{scope} + \begin{scope}[thick] + %% Prima curva + \draw (-6,2) .. controls (-5,1.75) and (-4.2,0.5) .. (-4,0); + \draw (-4,0) .. controls (-3.8,-0.5) and (-3.5,-2) .. (-3.5,-3); + + %% Seconda curva + \draw (-3.2,2) .. controls (-3.2,1.5) and (-2,1) .. (-1,0); + \draw (-1,0) .. controls (0,-1) and (0.5,-2) .. (0.55,-3); + + %% Terza curva + \draw (1,2) .. controls (1,1) and (1.5,0.5) .. (2,0); + \draw (2,0) .. controls (2.5,-0.5) and (4,-2) .. (5,-3); +\end{scope} + %% Asintoti (che corrispondono agli autovalori) +\begin{scope}[blue] + \draw (-3.4,-3) -- (-3.4,0) node[anchor=south west] {$\lambda_1$} -- (-3.4,2); + \draw (0.8,-3) -- (0.8,0) node[anchor=south east] {$\lambda_2$} -- (0.8,2); +\end{scope} + \end{tikzpicture} +\end{center} + \caption{Un grafico qualitativo di una possibile equazione secolare di una matrice con due autovalori} +\label{fig:eqsecolare} +\end{figure} + +Ovviamente queste considerazioni valgono in $\R$, e hanno senso dal momento che +gli autovalori della matrice hermitiana devono essere reali. La stessa richiesta potrebbe addirittura +non avere senso per una matrice in forma di Hessenberg che, a priori, potrebbe avere autovalori complessi. +\subsection{Metodi di iterazione funzionale per il calcolo degli autovalori} +Questa conoscenza di $g$ ci porterebbe a pensare di utilizzare metodi di iterazione funzionale +per determinare gli autovalori della nostra matrice. \\ +Se consideriamo il caso Hermitiano, infatti, potremmo applicare il metodo di \emph{bisezione}. +L'unica difficoltà in questo caso sta nel definire l'intervallo in cui sta una ed una sola radice +per poter cominciare l'iterazione. Notiamo però che presi gli autovalori di $A_{n-1}$ in modo +che $\lambda_i^{(n-1)} < \lambda_j^{(n-1)} +\iff i < j$ si ha che ogni autovalore di $A$ sta fra $\lambda_i$ ed un $\lambda_{i+1}$, ad eccezione degli +autovalori estremali. Anche in quel caso è facile trovare dei limiti su cui applicare la bisezione, considerando +la diseguaglianza di Hirsch: $|\lambda| \leq ||A||$ (dalla definizione di norma matriciale). +\begin{os} + Tutto questo procedimento ci fornirebbe un metodo per calcolare gli autovalori di $A$ a patto di conoscere + quelli di $A_{n-1}$, e quindi il problema non sembra (per ora) semplificato di molto. Prossimamente il teorema + di Sturm ci fornirà uno strumento per completare queste considerazioni, arrivando ad un risultato più pratico. +\end{os} +Infine si potrebbe pensare di applicare anche altri metodi di iterazione funzionale noti, come ad esempio +il metodo delle tangenti; purtroppo quest'ultimo non ci può dare (in questo caso) nessuna garanzia di convergenza, +e quindi non sembra adatto allo scopo. In realtà viene usato nella pratica per ``affinare'' stime di autovalori +forniti con altri metodi. \\ +\subsection{Il polinomio caratteristico delle matrici di Hessenberg} +Tutte le proprietà che siamo riusciti a trovare sulle matrici Hermitiane tridiagonali non valgono +purtroppo per le matrici di Hessenberg. Nonostante questo possiamo però mostrare un metodo +per valutare il polinomio caratteristico in un punto particolarmente vantaggioso dal punto +di vista computazionale\footnote{Non quanto quello trovato per le matrici Hermitiane tridiagonali, purtroppo}. +Cominciamo col fare alcune considerazioni; possiamo supporre che la nostra matrice sia nella forma +\[ + H = \left[ \begin{array}{cccc} + \times & \cdots & \cdots & \times \\ + \beta_{1} & \ddots & & \vdots \\ + & \ddots & \ddots & \vdots \\ + & & \beta_{n-1} & \times + \end{array} \right] +\] +con $\beta_i \neq 0$ per ogni $i$ (altrimenti sarebbe riducibile, e quindi potremmo ridurci a risolvere +dei sottoproblemi con delle Hessenberg irriducibili). \\ +Fissato $z$, consideriamo il sistema lineare $(H - zI)x = \alpha e_1$. Se consideriamo $x$ e $\alpha$ +come incognite e poniamo $x_n = 1$ ci accorgiamo che possiamo risolvere il sistema facilmente con +una sostituzione all'indietro partendo dal fondo, e determinare $x$ e $\alpha$ con complessità $O(n^2)$. \\ +Applicando poi la regola di Cramer all'ultima componente di $x$ e chiamando $H'$ la matrice di Hessenberg +a cui è stata sostituita l'ultima colonna con il vettore $x$ otteniamo +\[ + 1 = x_n = \frac{\deter{H'}}{\deter{H-zI}} = \frac{(-1)^{n+1}\alpha \prod_{i=1}^{n-1} \beta_i}{p(z)} +\] +e quindi $p(z) = (-1)^{n+1}\alpha \prod_{i=1}^{n-1} \beta_i$; osserviamo che in questa espressione +$\alpha$ è in realtà funzione di $z$ e quindi sarebbe più corretto scrivere +\[ +p(z) = (-1)^{n+1}\alpha(z) \prod_{i=1}^{n-1} \beta_i +\] +Considerando che $\alpha$ può venir calcolata partendo da $z$ con complessità $O(n^2)$ abbiamo determinato +un metodo relativamente poco oneroso di calcolare il polinomio caratteristico di $H$ in un punto. \\ +Possiamo quindi considerare ora la possibilità di applicare dei metodi di iterazione funzionale. +\begin{os} + Per applicare, ad esempio, il metodo delle tangenti, avremmo bisogno di calcolare la derivata di $p(z)$. + Possiamo fare anche questo con poco sforzo, a patto di calcolare la derivata di $a(z)$. \\ + Osserviamo che derivando la relazione di partenza si ottiene + \[ + (H - zI)x'(z) = \alpha'(z)e_1 + x(z) + \] +da cui si può ottenere $\alpha'(z)$ differenziando tutte le operazioni aritmetiche che portano ad ottenere +$x(z)$. Una volta effettuato questo si avrà +\[ + p'(z) = (-1)^{n+1}\alpha'(z) \prod_{i=1}^{n-1} \beta_i +\] +\end{os} + +Possiamo osservare che i metodi di iterazione funzionale non sono particolarmente convenienti per determinare +gli autovalori, anche se si utilizzano di fatto per qualche richiesta ``specifica''.\\ +Nel caso, ad esempio, di una matrice hermitiana tridiagonale, si può osservare che nel calcolo degli autovalori +estremali le condizioni di convergenza del metodo di Newton sono soddisfatte e quindi possiamo ottenere +la soluzione con poche operazioni aritmetiche osservando che sia $p$ che $p'$ si possono calcolare +con poco sforzo dalle loro relazioni ricorrenti a tre termini (viste nella Sezione~\ref{subsec:hermdiag}). + +\begin{os} + Consideriamo $p_n(x)$ polinomio caratteristico; possiamo osservare facilmente che se $x \to -\infty$ allora + $p_n(x) \to \infty$. In generale, infatti, la parte principale del polinomio è $(-1)^{n} z^n$, che va all'infinito + sia nel caso $n$ pari sia nel caso $n$ dispari. +\end{os} diff --git a/capitoli/capitolo2.tex b/capitoli/capitolo2.tex new file mode 100644 index 0000000..7e88f99 --- /dev/null +++ b/capitoli/capitolo2.tex @@ -0,0 +1,656 @@ +\chapter{Il calcolo degli autovalori} + +In questo capitolo ci occuperemo di presentare i metodi principalmente usati nel calcolo +effettivo degli autovalori di matrici Hermitiane tridiagonali e in forma di Hessenberg. + +\section{Il metodo di Sturm} +Introdurremo ora un metodo efficiente per il calcolo di singoli autovalori di una matrice +hermitiana in forma tridiagonale. Per tutta la sezione tratteremo il caso di una matrice +reale per semplicità, ma il caso complesso è risolubile in modo analogo. + +Abbiamo visto nella Sezione~\ref{sec:eqsecolare} un metodo efficiente per valutare il polinomio +caratteristico di una matrice di questo tipo con costo $O(n)$. Possiamo affinare la nostra osservazione +notando che anche la valutazione di tutti i polinomi $p_k$ in un punto $x$ fissato continua +ad avere un costo $O(n)$. \\ +Consideriamo, data una matrice $T_n$ in forma tridiagonale hermitiana, la seguente funzione +\[ +\begin{array}{cccl} + f: & \R & \longto & \{ 0 , \ldots , n \} \\ + & x & \longmapsto & \sharp \{ \ \textrm{cambi di segno nel vettore} \ (p_0(x) , \ldots , p_n(x)) \ \} +\end{array} +\] +Perché $f$ sia ben definita conveniamo che se $p_j(x) = 0$ allora il suo segno è lo stesso di $p_{j-1}(x)$. +Questa è una buona definizione perché $p_0(x) = 1$ e quindi non è mai $0$. +\begin{os} + Dalla definizione di $f$ si deduce che se il suo valore di cambia in un punto, allora in quel punto ci deve + essere uno zero di (almeno) uno dei polinomi $p_j(x)$. +\end{os} +Osserviamo cosa succede quando un polinomio ``interno'', ovvero un $p_j$ con $j \in 1 \ldots n-1$ ha uno +zero in $\bar x$. +Innanzitutto sappiamo da quanto visto nel capitolo precedente che $p_{j-1}(x) \neq 0 \neq p_{j+1}(x)$; è +possibile però affinare questa affermazione osservando meglio la relazione ricorrente a tre termini: +\[ + p_{j+1}(x) = (\alpha_{j+1} - x) p_j(x) - \beta_j^2 p_{j-1}(x) +\] +Se $p_j(x) = 0$ si ottiene che $p_{j-1}(x) \cdot p_{j+1}(x) < 0$, e quindi anche in un intorno di $\bar x$. +Ricordando le definizione di $f$ si osserva che il segno di $p_j(x)$ è quindi indifferente ai fini del numero +di cambiamenti di segno. In particolare $f$ non cambia segno in $\bar x$. +Evidentemente $p_0(x)$ non può cambiare segno, quindi ci rimane da verificare cosa succede quando cambia segno +$p_n(x)$. \\ +Ricordiamo alcune particolarità dei polinomi $p_n$ viste precedentemente +\begin{enumerate}[(i)] + \item Ogni $p_j$ ha limite a $-\infty$ uguale a $+\infty$; + \item Gli zeri di $p_{j-1}$ separano gli zeri di $p_j$, nel senso visto alla fine del precedente capitolo + (Sezione~\ref{sec:eqsecolare}); + \item Tutti gli zeri di un polinomio di una matrice hermitiana tridiagonale sono semplici; +\end{enumerate} +Osserviamo quindi che per ogni radice di $p_n$ si ha che il segno della sua derivata e quello di $p_{n-1}$ sono +opposti. La condizione di semplicità sugli zeri ci assicura che la derivata sarà infatti diversa da $0$ in +$\bar x$ e quindi $p_n'(\bar x) p_{n-1}(\bar x) < 0$. In particolare la costanza locale del segno della derivata +intorno allo $0$ ci assicura anche la costanza di quello di $p_{j-1}$ e quindi il \emph{cambio di valore di $f$}. +In sintesi $f$ agisce come una sorta di ``contatore di zeri''. Dato infatti un qualsiasi intervallo $[a,b]$ si verifica, +usando le considerazioni precedenti che +\[ + f(b) - f(a) = \sharp \{ \ \text{zeri del polinomio caratteristico in } [a,b) \ \} +\] + +Possiamo dunque applicare questa considerazione per applicare il metodo di bisezione per calcolare +uno specifico autovalore di $T_n$. Queste proprietà di $f$ ci permettono di calcolare infatti singolarmente +l'$i$-esimo autovalore di $T_n$ (ordinati con l'ordinamento di $\R$) senza bisogno di calcolare tutti gli altri. +Ricordando la diseguaglianza di Hirsch ($||\lambda|| \leq ||T_n||$) e supponendo di aver fissato $i$ possiamo +applicare il seguente procedimento. + +Cominciamo col calcolare $f(0)$; il suo valore ci dirà quanti autovalori ci sono prima dello $0$, e quindi +nell'intervallo $[-||T_n||, 0)$. Se il nostro autovalore sta lì (ovvero $i \leq f(0)$) allora calcoliamo +$f(-\frac{||T_n||}{2})$ e ripetiamo il procedimento; in caso contrario procediamo analogamente con $f(\frac{||T_n||}{2})$. \\ +Iterando un numero sufficiente di volte questo procedimento otterremo alla fine il valore desiderato. + +Osserviamo che il procedimento può essere applicato a ad una qualsiasi matrice hermitiana, a patto +di portarla in forma tridiagonale (che è sempre possibile tramite matrici unitarie). +Ricordando le stime dei costi computazionali fatte in precedenza ci rendiamo conto che il costo principale è +quello della riduzione ($O(n^3)$) rispetto a quello del calcolo dell'autovalore ($O(n^2)$). +Se si volessero calcolare tutti gli autovalori il costo rimarrebbe ancora dell'ordine di $n^3$. Nonostante questo +esistono metodi (che vedremo in seguito) che permettono di calcolare tutti gli autovalori con una complessità di +$O(n^2)$ e che quindi saranno più interessanti per il calcolo dello spettro completo della matrice. \\ +Il metodo di Sturm, comunque, trova delle applicazioni anche in questo ultimo caso nell'ambito del calcolo parallelo, +dove altri algoritmi non possono essere implementati. Si può osservare invece che, una volta ottenuta la fattorizzazione, +non sia difficile implementare il metodo di Sturm dividendo fra i vari processori gli autovalori da calcolare. + +\section{Il metodo QR} +In questa sezione esporremo il metodo QR per il calcolo degli autovalori, che è il metodo più utilizzato +nelle moderne applicazioni del calcolo degli autovalori. Si basa sulla fattorizzazione QR già vista nel corso +di Analisi Numerica per la risoluzione di sistemi lineari. Questa può venire realizzata tramite matrici +di Householder. Cominceremo ricordando alcuni risultati riguardo la fattorizzazione, per poi esporre ed +analizzare il metodo e le sue implementazioni. + +\subsection{La fattorizzazione QR} +\'E noto che ogni matrice $A \in \mat{\C}{n}$ si può fattorizzare nel seguente modo +\[ + A = QR +\] +dove $Q$ è una matrice unitaria e $R$ è una matrice triangolare superiore. +\begin{os} + La fattorizzazione non è unica. Se supponiamo $A = QR$ e $S$ una matrice di fase, ovvero diagonale tale che $|s_{ii}|=1$ +per ogni $i = 1 \ldots n$, allora $A = QS\herm{S}R$ è ancora un fattorizzazione. Se $S \neq I$ le fattorizzazioni sono +diverse. Si può però mostrare che non ci sono altre matrici (non di fase) per cui questo è vero. Si dice che +la fattorizzazione QR è \emph{essenzialmente unica}. +\end{os} +Il nostro scopo è costruire una successione di matrici tramite questo procedimento di fattorizzazione +che ci porti a determinare gli autovalori. + +\subsection{Costruzione della successione} +Data una matrice $A$ di cui vogliamo conoscere gli autovalori, consideriamo +la successione definita nel seguente modo +\[ +\left\{ \begin{array}{ll} + A_0 & = A \\ + A_{k+1} & = R_k Q_k \quad \text{dove} \ Q_k R_k \ \text{è la fattorizzazione QR di} \ A_k +\end{array} \right. +\] +\begin{os} \label{os:qr_simili_ak} + Osserviamo che per ogni $k$ $A_{k+1}$ è simile ad $A_k$. Infatti $A_{k+1} = \herm{Q_k}Q_k R_k Q_k$. + Per ogni $k$ la matrice $A_k$ è simile a $A_{k+1}$ tramite trasformazione unitaria, che preserva + il condizionamento del problema di calcolo degli autovalori. Questa quindi è una ``buona'' successione + nel senso in cui ne avevamo parlato nella Sezione~\ref{sec:analisidelcondizionamento}. +\end{os} + +Cominceremo ad analizzare il metodo QR facendo delle supposizioni piuttosto restrittive, che poi allenteremo +in seguito. Cominciamo col supporre che gli autovalori della matrice $A$ siano tutti distinti e ordinabili +per modulo in modo strettamente crescente, ovvero $|\lambda_1| < \ldots < |\lambda_n|$. Questo in +particolare implica che la matrice $A$ è diagonalizzabile e quindi esiste una $X$ invertibile tale che +$A = XDX^{-1}$. Supponiamo ora che $X^{-1}$ ammetta fattorizzazione $ X^{-1} = LU$\footnote{dove supponiamo +che $L$ sia triangolare inferiore con gli elementi delle diagonale uguali a $1$ e $U$ triangolare superiore}. +\begin{pr} \label{pr:metpot:ak} + Se si ha la successione di matrici $A_k$ come quella definita sopra, e per ogni $k$ si considera $Q_k R_k$ + la\footnote{al solito, sarebbe corretto dire \textbf{una} fattorizzazione} fattorizzazione QR di $A_k$, allora + \[ + A^k = Q_0 Q_1 \ldots Q_k R_k \ldots R_1 R_0 + \] +\end{pr} +\begin{proof} + Proviamo la tesi per induzione su $k$. Se $k = 0$ si ha $A_0 = A = Q_0 R_0$ che è banalmente vero. Se considero + la tesi vera per $k$. Considerando le seguenti uguaglianze + \[ \begin{array}{ll} + \displaystyle + A^{k+1} = \prod_{i=1}^{k+1} Q_0 R_0 = Q_0 (\prod_{i=1}^{k} R_0 Q_0) R_0 = Q_0 (\prod_{i=1}^{k} A_1) R_0 = \\ + \displaystyle + = Q_0 (\prod_{i=1}^{k} Q_1 R_1) R_0 = Q_0 \prod_{i=1}^{k} Q_i \prod_{i=1}^{k} R_{k-i+1} R_0 + \end{array} + \] + si ottiene esattamente la tesi. Per quanto oscure possano sembrare provare a fare il calcolo con $k = 3$ o $4$ + potrebbe chiarire molto le idee. +\end{proof} +Ora vorremmo usare quanto scoperto sulle potenze di $A$ per studiare la convergenza del nostro metodo. Consideriamo +che $A^k = X D^{k} X^{-1}$ e quindi ricordando che esiste la fattorizzazione $LU$ di $X^{-1}$ si ha +\begin{equation} +A^k = XD^{k}LU= X D^k LD^{-k}D^k U +\end{equation} +Osserviamo ora che la matrice $D^k L D^{-k}$ è triangolare inferiore ed ha la diagonale con soli $1$. Se chiamiamo +$X = QR$ la fattorizzazione QR di $X$ possiamo scrivere +\begin{equation} \label{eq:metpot:1} + A^k = X[I + \Gamma^{(k)}]D^k U = QR [ I + \Gamma^{(k)}] D^k U = Q[I + R\Gamma^{(k)}R^{-1}]RD^k U +\end{equation} +A questo punto consideriamo anche che per ogni $k$ esiste la fattorizzazione QR di $[I + R\Gamma^{(k)}R^{-1}] = P_k T_k$ +ed in particolare possiamo scegliere $P_k$ a termini positivi. Osserviamo ora che i termini di $\Gamma^{(k)}$ +sono dati dalla seguente relazione +\[ +\gamma_{ij} = + \left\{ \begin{array}{ll} + 0 & \text{se} \ i \leq j \\ + (\frac{\lambda_j}{\lambda_i})^{k} l_{ij} & \text{se} \ i > j + \end{array} \right. +\] +ed in particolare ricordando che se $j < i$ si ha che $\lambda_j < \lambda_i$ si ottiene che la matrice $\Gamma^{(k)}$ +tende ad una matrice diagonale per $k$ che tende all'infinito. Più precisamente, $\lim_{k \to \infty} \Gamma^{(k)} = I$. +Da questo si ottiene che $P_k \to I$ e anche $T_k \to I$\footnote{questo non sarebbe vero a priori, in quanto la scomposizione +QR è sempre definita a meno di una matrice di fase. Richiedere però che $P_k$ abbia elementi positivi ci permette +sia di definire univocamente la scomposizione desiderata sia di avere l'esistenza del limite.} +Confrontando l'equazione~\ref{eq:metpot:1} e la Proposizione~\ref{pr:metpot:ak} si ottengono due fattorizzazioni +QR della matrice $A^k$. +\[ + A^k = QP_k T_k R D^k U = Q_0 \ldots Q_k R_k \ldots R_0 +\] +Due fattorizzazioni QR della stessa matrice devono forzatamente differire per una matrice di fase e quindi +si ottengono le due relazioni +\[ + \left\{ \begin{array}{l} + Q_0 \ldots Q_k = Q P_k S_k \\ + R_{k} \ldots R_0 = \herm{S_k}T_k R D^k U + \end{array} \right. +\] +Possiamo riscrivere ora $Q_k$ ed $R_k$ in modo da riuscire ad utilizzare queste relazioni\footnote{Si può +osservare quanto i passaggi di questa dimostrazione siano la cosa meno intuitiva pensabile (o quasi). Presumibilmente +questa è risultato di anni di affinamento e di ``pulizia'' } +\[ + \left\{ \begin{array}{l} + Q_k = \herm{(Q_0 \ldots Q_{k-1})}(Q_0 \ldots Q_k) = \herm{S_{k-1}}\herm{P_{k-1}}\herm{Q}Q P_k S_k = + \herm{S_{k-1}}\herm{P_{k-1}}P_k S_k\\ + R_k = (R_k \ldots R_0)(R_{k-1} \ldots R_0)^{-1} = \herm{S_k}T_k R D^{k} U U^{-1} D^{-k+1} R^{-1} T_{k-1}^{-1} S_{k-1} + \end{array} \right. +\] +Dunque $Q_k R_k = A^{k} = \herm{S_{k-1}}\herm{P_{k-1}}P_k T_k R D R^{-1} T_{k-1}^{-1} S_{k-1}$ e ricordando che +$T_k$ e $P_k$ al limite vanno all'identità se scriviamo la nostra uguaglianza per $k~\to~\infty$ otteniamo +$S_{k-1} A^k \herm{S_{k-1}} = R D R^{-1}$. Possiamo quindi osservare che gli elementi sulla diagonale di $RDR^{-1}$ +sono gli stessi di $D$ (grazie al fatto che $R$ è triangolare superiore). In particolare gli elementi diagonali +sono gli autovalori di $A$ e quindi abbiamo provato che il metodo converge. +\begin{os} + In realtà non è rilevante conoscere esplicitamente $S_k$ perché siamo interessati solo a conoscere gli elementi + sulla diagonale di $RDR^{-1}$. Avendo che gli elementi di $S_k$ sono di modulo $1$ gli elementi diagonali vengono + moltiplicati per un numero complesso e per il suo coniugato, lasciandoli invariati. +\end{os} + +\subsection{Il costo computazionale} \label{subsec:qr_costo} +Vorremmo ora valutare il costo computazionale di questo metodo. Consideriamo dapprima il caso di una matrice +generale. Sappiamo che il costo di una fattorizzazione $QR$ è $O(n^3)$ e sperimentalmente si ottiene che il +numero di passi per avere convergenza cresce linearmente con la dimensione. Questo ci permette di concludere +che in un caso totalmente generale il costo computazionale del metodo QR è $O(n^4)$. + +Facciamo ora qualche supposizione sulla matrice. Prendiamo ad esempio una matrice tridiagonale hermitiana. +In questo caso ci ricordiamo che il costo del calcolo della fattorizzazione QR (almeno della prima) è $O(n)$. +Possiamo osservare che la matrice ottenuta dopo il primo passo è ancora tridiagonale hermitiana, e quindi +le considerazioni fatte sul primo passo valgono anche per i seguenti. In particolare il costo del metodo +è $O(n^2)$. + +Analogamente per le matrici di Hessenberg (anche se non lo mostriamo ora) il costo è di $O(n^3)$ perché +il calcolo della scomposizione QR è $O(n^2)$. + +\subsection{Migliorare la convergenza} +Il metodo QR come esposto fino ad ora funziona ma ha il difetto di avere una convergenza di tipo +lineare. In generale questo può essere un problema perché più gli autovalori della matrice sono +vicini più, potenzialmente, potrebbe essere lenta (o addirittura assente) la convergenza. + +Possiamo osservare meglio questo con un esempio; consideriamo una matrice $2\times 2$ con un +elemento ``piccolo'' in posizione $(2,1)$, ovvero sulla buona strada per essere triangolarizzata\footnote{% +Ovviamente tutta questa frase è terribilmente imprecisa, ma il nostro scopo è, per ora, solo dare +un'idea dei vantaggi che si potrebbero ottenere da un nuovo approccia e non formalizzarlo in +alcun modo}. +Proviamo a vedere cosa succede effettuando un passo generico dell'iterazione. Consideriamo la matrice $A_k$ +con un elemento piccolo $\eps$ sotto la diagonale e una sua scomposizione QR +\[ + A_k = \left[ \begin{array}{cc} + a & b \\ + \eps & c \\ + \end{array}\right] + = \left[ \begin{array}{cc} + \frac{a}{\sqrt{a^2 + \eps^2}} & \frac{-\eps}{\sqrt{a^2+\eps^2}} \\ + \frac{\eps}{\sqrt{a^2+\eps^2}} & \frac{a}{\sqrt{a^2 + \eps^2}} + \end{array} \right] + \left[ \begin{array}{cc} + \sqrt{a^2 + \eps^2} & \frac{ab + \eps c}{\sqrt{a^2 + \eps^2}} \\ + 0 & \frac{ac - \eps b}{\sqrt{a^2+\eps^2}} + \end{array} \right] = Q_kR_k +\] +Si avrà che +\[ + A_{k+1} = R_kQ_k = \left[ \begin{array}{cc} + \sqrt{a^2 + \eps^2} & \frac{ab + \eps c}{{a^2 + \eps^2}} \\ + 0 & \frac{ac - \eps b}{{a^2+\eps^2}} + \end{array} \right] + \left[ \begin{array}{cc} + \frac{a}{\sqrt{a^2 + \eps^2}} & \frac{-\eps}{\sqrt{a^2+\eps^2}} \\ + \frac{\eps}{\sqrt{a^2+\eps^2}} & \frac{a}{\sqrt{a^2 + \eps^2}} + \end{array} \right] += \left[ \begin{array}{cc} + \times & \times \\ + \frac{\eps(ac - \eps b)}{a^2 + \eps^2} & \times + \end{array} \right] +\] +Considerando che $ac -\eps b$ è il determinante delle matrice (e quindi +il prodotto degli autovalori) e $a^2 + \eps^2$ una buona +approssimazione del quadrato di un autovalore\footnote{questo perché il vettore $e_1$ va a finire in se stesso moltiplicato +per $a$, a meno di epsilon che è piccolo}, $\eps$ è stato diminuito di un fattore dell'ordine +di $\frac{\lambda_1}{\lambda_2}$, come ci si aspettava. + +Consideriamo ora cosa succede applicando una tecnica di \emph{shifting}. Calcoliamo la fattorizzazione QR della +matrice $A-cI$, invertiamo l'ordine dei fattori e risommiamo $cI$. +Abbiamo dunque +\[ + A_k - cI = \hat Q \hat R \quad \longrightarrow \quad A_{k+1} = \hat R \hat Q + cI +\] +\begin{os} + $A_k$ ed $A_{k+1}$ sono simili. Consideriamo infatti le seguenti uguaglianze + \[ + A_{k+1} = \hat R \hat Q + cI = \herm{\hat Q}\hat Q \hat R \hat Q + cI = \herm{\hat Q} (A_k - cI) \hat Q + cI + = \herm{\hat Q} A_k \hat Q + \] + E quindi le due matrici sono simili per trasformazione hermitiana, il che preserva anche il condizionamento del + problema come visto nella Sezione~\ref{sec:analisidelcondizionamento}. +\end{os} + +Possiamo osservare che risvolgendo i conti con il ``nuovo'' algoritmo si ottiene in posizione sottodiagonale +un fattore dell'ordine di $\eps^2$. Sembra quindi che questo nuovo metodo abbia una convergenza molto più veloce +del precedente! + +Anche se questo esempio ci fornisce solo delle osservazioni in un caso particolare e non una +dimostrazioni formale delle proprietà di convergenza che si potrebbero ottenere in generale +con uno shifting, possiamo in ogni caso discutere come applicarlo. Esistono teoremi che provano +l'effettiva efficienza di questo approccio ma sono piuttosto tecnici e ``conterecci'' (cit.) e +non li affronteremo in questo corso. +\begin{figure}[hb] +\[ + A_k = \left[ \begin{array}{cccc} + \alpha_{11}^{(k)} & \times & \hdots & \times \\ + \beta_{1}^k & \ddots & & \vdots \\ + & \ddots & \ddots& \times \\ + & & \beta_{n-1}^k & \alpha_{nn}^{(k)} + \end{array} \right] +\] +\caption{Struttura di una matrice in forma di Hessenberg superiore} +\label{fig:hessenbergsup} +\end{figure} +Appurato che questo trucco funziona, ci chiediamo come applicarlo ad una matrice generale. L'idea +è di togliere alla matrice $A_k$ un'altra matrice $\alpha_k I$, dove $\alpha_k = \alpha_{nn}^{(k)}$ +(si veda la Figura~\ref{fig:hessenbergsup}). +Per semplicità osserviamo il caso delle matrici di Hessenberg, che poi sarà il caso implementato in pratica +date le considerazioni sulla complessità fatte in precedenza. + +Il caso di una matrice complessa viene gestito esattamente con lo shifting di $-\alpha_{nn}^{(k)}I$ come descritto +sopra, e si verifica che le cose funzionano bene. Più complesso, invece, è il caso di una matrice reale. +In quella situazione infatti gli autovalori possono essere complessi coniugati e non si desidera passare da aritmetica +reale ad aritmetica complessa. Questo porterebbe a problemi di complessità, ma il danno più grave sarebbe +perdere la simmetria\footnote{Per simmetria intendiamo la certezza di ottenere autovalori complessi coniugati, +cosa di cui non si potrebbe essere certi con una matrice complessa qualsiasi. } della matrice, +e quindi in definitiva parecchia informazione sul problema. +\begin{os} + Nel caso complesso Hessenberg risulta semplice determinare la qualità dell'approssimazione ottenuta + dell'autovalore. Possiamo assumere di fermare l'iterazione quando + \[ + |\beta_n| \leq u( |\alpha_{nn}^{(k)}| + |\alpha_{n-1,n-1}^{(k)}|) + \] + dove $u$ è la precisione di macchina, + ed a quel punto assumere che $\alpha_{nn}^{(k)}$ è una buona approssimazione dell'autovalore + cercato e ridurci a ripetere il procedimento sul minore di nord ovest di ordine $n-1$, che è ancora in forma + di Hessenberg. +\end{os} +Per determinare come eseguire lo shifting nel caso reale conviene cambiare punto di vista su quanto effettuato fino +ad ora. Possiamo osservare che se poniamo $p_k(z) = z - \alpha_k$ di fatto lo shifting è equivalente a considerare +la matrice $\hat A_k = p(A_k)$. Dato che riteniamo che $\alpha_k$ sia una buona approssimazione dell'autovalore +cercato della matrice per analogia nel caso reale possiamo utilizzare $p_k(x) = (x - \lambda)(x - \con{\lambda})$ +che è un polinomio reale. Si verifica (e, ancora una volta, noi non lo faremo) che tutto continua a funzionare +bene ma sorgono dei problemi di complessità. \\ +Il polinomio $p_k$ è infatti adesso di II grado e non è per nulla banale, in generale, calcolare $A_k^2$. +Inoltre $p_k(A_k)$ non è neppure una matrice in forma di Hessenberg, il che sembrerebbe farci perdere tutti +i vantaggi computazionali che avevamo fino a questo momento. Per fortuna esiste una tecnica che, modificando +l'iterazione, riesce a riolvere questo problema. + +\subsection{La tecnica del Bulge Chasing} +Nell'applicazione della tecnica dello shifting vista nel paragrafo precedente, abbiamo supposto di +calcolare $p_k(A_k)$ e dopo calcolare la fattorizzazione QR. Ci siamo però accorto che se $p_k$ è +un polinomio di secondo grado vengono persi tutti i vantaggi computazionali dati dalla forma di Hessenberg. +Vogliamo quindi ora modificare la fattorizzazione QR \textbf{mentre} calcoliamo $p_k(A_k)$ in modo da +rendere la risultante matrice in forma di Hessenberg e diminuire la complessità del calcolo del polinomio. +La fattorizzazione QR ottenuta sarà ``essenzialmente uguale''\footnote{ovvero sarà uguale a meno di una +matrice di fase reale} a quella che avremmo ottenuto seguendo +il procedimento precedente; questo modo di operare è detto \emph{Bulge Chasing}\footnote{bulge chasing in inglese significa inseguimento +del bernoccolo, e s riesce ad apprezzare il senso del nome osservando come questa tecnica si traduce graficamente sugli elementi +non zero della matrice. Questi si comportano infatti come un bernoccolo che scende sempre di più sulla +sottodiagonale per poi sparire lasciando una matrice in forma di Hessenberg superiore.}. + +Possiamo cominciare a calcolare solo la prima colonna della matrice $p_k(A_k)$, ovvero $p_k(A_k)e_1$. +Una volta calcolata questa possiamo calcolare anche una matrice di Householder $P_0$ tale che +$P_0 p_k(A_K)e_1 = \alpha e_1$. \\ +Si costruiscono poi altre $n-1$ matrici di Householder tali che fissato +\[ + Z = P_0 \ldots P_{n-1} +\] +si abbia +\[ + A_{k+1} = \herm{Z} A_k Z +\] +ed è possibile dimostrare che questa iterazione produce una matrice simile a meno di una matrice di fase reale +rispetto a quella presentata in precedenza. + +\section{Divide et Impera} +\subsection{L'idea} +Introdurremo ora un altro metodo, piuttosto recente, per il calcolo di tutti gli autovalori della matrice. +Questo è stato introdotto nel 1980 da Cuppen. Il metodo permette il calcolo di autovalori solo per matrici +tridiagonali hermitiane e l'osservazione che ne sta alla base è che una matrice tridiagonale è ``quasi'' +diagonale a blocchi, più precisamente se $H$ è la nostra matrice +\[ + H = \left[ \begin{array}{cc|cc} + \sblocko{T_1}{2} & & \\ + & & & \\ \hline + & & \sblocke{T_2}{2} \\ + & & & \\ + \end{array} \right] ++ \left[ \begin{array}{cc|cc} + & & & \\ + & \beta_{n-1} & & \\ \hline + & & \beta_{n-1} & \\ + & & & + \end{array} \right] +\] +Ovvero è una diagonale a blocchi più una correzione di rango 2. A ben vedere, però, si può fare anche di meglio. +Se sostituiamo in $T_1$ il valore $\alpha_{\frac{n}{2}}$ con $\hat \alpha_{\frac{n}{2}} = \alpha_{\frac{n}{2}} - \beta_{n-1}$ +e in $T_2$ il valore $\alpha_{\frac{n}{2} + 1}$ con $\hat \alpha_{\frac{n}{2} + 1} = \alpha_{\frac n 2 + 1} - \beta_{n-1}$, otteniamo +una matrice a blocchi tridiagonali più un correzione di rango $1$: +\[ + H = \left[ \begin{array}{cc|cc} + \sblocko{\hat T_1}{2} & & \\ + & & & \\ \hline + & & \sblocke{\hat T_2}{2} \\ + & & & \\ + \end{array} \right] ++ \left[ \begin{array}{cc|cc} + & & & \\ + & \beta_{n-1} & \beta_{n-1}& \\ \hline + & \beta_{n-1} & \beta_{n-1} & \\ + & & & + \end{array} \right] +\] +Supponiamo ora di conoscere gli autovalori di $\hat T_1$ e di $\hat T_2$, ed in particolare le matrici +unitarie $Q_1$ e $Q_2$ che ci permettono di diagonalizzarle, ovvero +\[ + T_1 = Q_1 D_1 \herm Q_1 \qquad + T_2 = Q_2 D_2 \herm Q_2 +\] +con $D_1$ e $D_2$ le matrici con gli autovalori sulla diagonale e $0$ altrove. + +Tutto questo può funzionare se +riusciamo a mostrare che siamo veramente in grado di calcolare facilmente gli autovalori della matrice a blocchi +con la correzione. + +Se consideriamo ora la matrice $D$ così formata +\[ + \hat D = \left[ \begin{array}{cc|cc} + \sblocko{D_1}{2} & & \\ + & & & \\ \hline + & & \sblocke{D_2}{2} \\ + & & & + \end{array} \right] +\] +e calcoliamo $B = \herm Q A Q$ otteniamo +\[ + B = \herm Q A Q = \hat D + \beta_{\frac{n}{2}}z\herm z +\] +con $z = \left[ \begin{array}{c} q_1 \\ q_2 \end{array}\right]$ dove $q_i$ è l'ultima colonna di $\herm Q_i$ +per $i = 1,2$. + +\subsection{La ricerca degli autovalori} +Abbiamo quindi ricondotto il problema a calcolare gli autovalori di una matrice $D + w\herm w$ dove $D$ +è diagonale e $w$ è un vettore qualsiasi. Calcolando il polinomio caratteristico di $B$ ed assumendo +che $\lambda \neq \hat d_i$ otteniamo +\[ + p(\lambda) = \deter{\lambda I - B} = \deter{ \lambda I - D }\cdot \deter{I + \theta(\lambda I - D)^{-1} z\herm z} +\] +Osserviamo che stiamo assumendo che $\lambda I - D$ sia invertibile, e quindi questa formula per il calcolo +del polinomio caratteristico vale solo per $\lambda \in \C \setminus (\spe{D_1} \cup \spe{D_2})$. Sapendo che $p$ +è continuo possiamo però concludere che vale per tutto $\C$. \\ +Notiamo inoltre che $( I + \theta(\lambda I - D)^{-1}z\herm z)$ è una matrice elementare e quindi ha determinante\footnote{% +Ricordiamo che in genearale una matrice elementare $I - \sigma u \herm v$ ha determinante $1 - \sigma \herm v u$} +$1 - \theta (\lambda I - D)^{-1} \herm zz$; sviluppando ulteriormente si ottiene +\begin{equation} \label{eqn:polmindivetimp} + p(\lambda) = \prod_{j=1}^{n} (\lambda - \hat d_j) ( 1 + \theta (\lambda I - D)^{-1} \herm zz ) + = \prod_{j=1}^{n} (\lambda - \hat d_j) ( 1 + \theta \sum_{k=1}^{n} \frac{z_k^2}{\lambda - \hat d_k} ) +\end{equation} +ed estendendo per continuità a tutto $\C$ si ottiene infine +\[ + p(\lambda) = \prod_{j=1}^n (\lambda - \hat d_j) + \theta\sum_{k=1}^n z_k \prod_{\substack{s=1 \\ s\neq k}}^n (\lambda - \hat d_s) +\] +che è una sorta di equazione secolare come quella che si era ottenuta partendo dalle relazioni ricorrenti a tre +termini nella Sezione~\ref{sec:eqsecolare}. + +Siamo ora costretti a fare delle assunzioni sulla struttura di $z$ e di $\hat D$. In realtà ci renderemo conto +in seguito che queste non sono restrittive perché nei casi in cui non saranno verificate ci troveremo con un +problema semplificato, che potremo riportare a questo caso qua\footnote{Penso, perché in realtà non mi è ancora +molto chiaro come si dovrebbe fare}. \\ +Assumiamo dunque che +\begin{itemize} + \item $z_j \neq 0$ per ogni $j = 1 \ldots n$; + \item $\hat d_k \neq \hat d_j$ per ogni $k \neq j$, ovvero che tutti gli autovalori siano distinti; +\end{itemize} +A questo punto dalla relazione~\ref{eqn:polmindivetimp} ricaviamo che +\begin{equation} \label{eqn:eqsecdivetimp} + p(\lambda) = 0 \iff 1 + \theta \sum_{j=1}^n \frac{z_j^2}{\lambda - \hat d_j} = 0 +\end{equation} + +e quindi gli autovalori delle matrici di ordine $\frac{n}{2}$ separano quelli della matrice grande, e si +può applicare (ad esempio) il metodo di bisezione, o in generale altri procedimenti di iterazione +funzionale. + +\begin{os} + Notiamo che per applicare la bisezione nella (\ref{eqn:eqsecdivetimp}) abbiamo bisogno di conoscere, oltre + ai $\hat d_j$ anche gli $z_j$ e ricordando che $z$ è costruito a partire dalle matrici $Q_1$ e $Q_2$, è chiaro + che dobbiamo conoscere anche queste due. Queste erano le matrici che diagonalizzavano $T_1$ e $T_2$ e si + ottenevano quindi \textbf{conoscendo gli autovettori} di $T_1$ e $T_2$. Dobbiamo allora, per poter procedere + con il metodo, calcolarci tutti gli autovettori. +\end{os} + +\subsection{Autovettori e problemi di stabilità} +Il fatto di dover calcolare gli autovettori ha un lato positivo ed uno negativo, precisamente +\begin{enumerate}[(a)] + \item Il calcolo effettivo risulta inaspettatamente semplice, tanto che, trovati gli autovalori saremo + capaci di trovare ogni autovettore con costo $O(n)$ e quindi di ottenerli tutti con costo $O(n^2)$; + \item Il problema del calcolo degli autovettori non è in generale ben condizionato e non si riescono a + dare condizioni perchè lo sia. Dato che influenzerà anche il calcolo degli autovalori nei passaggi successivi, + non possiamo garantire l'accuratezza del risultato finale; +\end{enumerate} + +L'idea per trovare gli autovettori è cercare quelli di $\hat D + \beta_{\frac n 2}z\herm z$ e poi una +volta ottenuta la matrice $U$ con questi, moltiplicarla per la matrice a blocchi con $Q_1$ e $Q_2$ sulla +diagonale (che d'ora in poi chiameremo $\hat Q$) per trovare gli autovettori della matrice $T$. \\ +Osserviamo che se $v$ è autovettore per la matrice $D + \beta_{\frac n 2}z\herm z$ allora +\[ + (\hat D + \theta z \herm z - \lambda I)v = 0 +\] +e quindi +\[ + (\hat D - \lambda I)v = -\theta z \herm z v +\] +Se fosse $\herm z v = 0$ avrei che $(\hat D - \lambda I)v = 0$ ma questo non è possibile perché $v$ +è non nullo e $\hat D - \lambda I$ è invertibile (come assunto precedentemente). Quindi deve essere +$\herm z v \neq 0$ e quindi dato che $v$ è determinato a meno di uno scalare possiamo assumere +$\herm z v = 1$. In definitiva si ottiene +\[ + v = - \theta z (\hat D - \lambda I)^{-1} +\] +che si può scrivere anche più esplicitamente come +\begin{equation} \label{eqn:calcoloautovettdivetimp} + v_j = \frac{- \theta z}{d_j - \lambda} +\end{equation} +Riassumendo, vogliamo trovare la matrice $U$ con i $v_j$ sulla diagonale e questo si può fare con +la Formula~\ref{eqn:calcoloautovettdivetimp} con costo $O(n^2)$. Ottenuta la matrice $U$ avremo +la matrice per diagonalizzare $T$ calcolando $\hat Q U$, e potremmo quindi procedere con il metodo. + +Sorgono però dei problemi computazionali non banali, più precisamente +\begin{enumerate}[(i)] + \item La matrice $U$ deve essere ortogonale ma questo non è garantito dall'algoritmo. Se ad un passo + abbiamo perdita di ortogonalità questo poi causerà un accumulo di errore in tutti i passi successivi + portando ad una imprecisione del calcolo. Sembra che in una implementazione del 2006 si sia riusciti + a risolvere questo problema. %% TODO: inserire una citazione + \item Come già sottolineato prima il calcolo degli autovalori potrebbe essere mal condizionato dal principio + portando ad un accumulo di errore notevole ad ogni passo. + \item Apparentemente il costo computazionale del calcolo di $\hat Q U$ non è trascurabile in quanto + un prodotto matrice per matrice in generale costa $O(n^3)$. Fortunatamente $U$ non è una matrice qualsiasi: + matrici del tipo $u_{ij} = \frac{r_i s_j}{x_i - y_j}$ sono dette matrici \emph{Cauchy-like} ed esistono + algoritmi per calcolare il prodotto fra una Cauchy-like ed una matrice generica con costo $O(n^2\log{n})$ +\end{enumerate} + +Come ultima nota, ricordiamo che questo algoritmo è applicabile solo alle matrici tridiagonali hermitiante +(e, previa tridagonalizzazione, a qualsiasi matrice hermitiana) ma non alle matrici in forma di Hessenberg +che non presentano purtroppo alcuna proprietà di separazione\footnote{ovvero quella che ci permette di trovare +i limite su cui applicare la bisezione o qualsiasi altra iterazione funzionale}. \\ +Sono stati fatti molti tentativi a questo proposito, ma non esiste attualmente nessuna implementazione +robusta del metodo Divide et Impera sulle matrici di Hessenberg. + +\section{Il metodo delle potenze} \label{sec:metodopotenze} +Per ultimo analizzeremo il metodo delle potenze che ci permette di trovare gli autovettori di una matrice +conoscendo gli autovalori. In generale è particolarmente comodo per calcolare l'autovalore dominante. +Consideriamo dunque questo caso per primo + +\subsection{Il metodo diretto} +Supponiamo $A \in \mat{\C}{n}$ diagonalizzabile, per semplicità. Elimineremo questa ipotesi in seguito. +Consideriamo gli autovalori ordinati in modo che +\[ + |\lambda_1| \geq |\lambda_2| \geq \ldots \geq |\lambda_n| +\] +e aggiungiamo l'ipotesi che $\lambda_1$ sia semplice e che sia in modulo strettamente maggiore degli altri. +Il metodo si basa su questa semplice osservazione (la cui paternità viene, ancora una volta, attribuita a Gauss): +Se prendiamo un vettore $y_0 \in \C^n$ e la nostra scelta non è incredibilmente sfortunata\footnote{% +dove con incredibilmente sfortunata intendiamo che il prodotto scalare tra $y_0$ e l'autovettore relativo +a $\lambda_1$ è esattamente uguale a $0$} possiamo considerare la successione +\begin{equation} + \left\{ \begin{array}{ll} + y_0 & = y_0 \\ + y_k & = Ay_{k-1} + \end{array} \right. +\end{equation} +Se scriviamo $y_0$ nella base di autovettori per $A$ abbiamo +\begin{equation} + y_0 = \sum_{i=1}^{n} \alpha_i v_i +\end{equation} +e quindi osservando che $y_k = Ay_{k-1} = A^{k}y_0$ dopo $k$ iterazioni otteniamo +\begin{equation} \label{eqn:metpotite} + y_k = A^ky_0 = \sum_{i=1}^n \alpha_i \lambda_i^k v_i = + \lambda_i^k \cdot \Big( \alpha_1 v_1 + \underbrace{\sum_{i=2}^n \alpha_i (\frac{\lambda_i}{\lambda_1})^k v_i}_{% +\text{tende a}\ 0\ \text{se}\ k \to \infty} \Big) +\end{equation} +e ricordando l'ipotesi fatta precedentemente, ovvero che $|\lambda_1| > |\lambda_i|$ per ogni $i$ abbiamo +che la seconda parte dell'uguaglianza va a $0$ per $k \to \infty$ e quindi la successione di vettori +tende ad un multiplo di $v_1$, ovvero l'autovettore cercato. + +Purtroppo questa implementazione del metodo non è realistica, perché si incorrerebbe sicuramente nel caso di +overflow o underflow in poche iterazioni, e probabilmente prima di avere una buona approssimazione dell'autovettore. +Si ricorre quindi al semplice stratagemma di riscalare ad ogni iterazione il vettore ottenuto, ad esempio +dividendolo per la sua norma infinito. In questo modo otteniamo una successione di vettori unitari che convergeranno +all' autovettore unitario. \\ +Possiamo ora emprimere la successione in questo modo +\[ + \left\{ \begin{array}{ll} + y_0 & = y_0 \\ + y_k & = \displaystyle \frac{Ay_{k-1}}{||Ay_{k-1}||_\infty} + \end{array} \right. +\] +\begin{os} + Questo metodo mi permette anche di valutare e raffinare la stima dell'autovalore dominante. Se considero + infatti il rapporto fra le $j$-esime componenti di due vettori consecutivi, ovvero $\frac{y_k,j}{y_{k-1,j}}$ + non è difficile verificare tramite la (\ref{eqn:metpotite}) che + converge all'autovalore cercato. +\end{os} + +Esistono delle varianti del metodo delle potenze che sfruttano le idee qui esposte per risolvere problemi simili +e migliorare le condizioni di convergenza. + +\subsection{Il metodo inverso con shift} +Osserviamo come prima cosa che con pochi cambiamenti si potrebbe calcolare l'autovalore di modulo più piccolo +considerando, invece che la matrice $A$, la matrice $A^{-1}$. \\ +Potremmo riscrivere l'iterazione in questo modo +\begin{equation} + \left\{ \begin{array}{ll} + y_0 & = y_0 \\ + y_k & = \beta_{k} \cdot A^{-1}y_{k-1} + \end{array} \right. +\end{equation} +dove $\beta_{k} = ||y_{k}||_\infty$\footnote{adotteremo questa notazione per tutta la sezione, d'ora in poi}. +Questo procedimento ci imporrebbe però di calcolare l'inversa di $A$, un procedimento che in generale si tende ad +evitare per problemi di instabilità. Possiamo quindi rileggere l'espressione precedente come risoluzione di +un sistema lineare, ovvero +\begin{equation} + \left\{ \begin{array}{lll} + y_0 &=& y_0 \\ + Az_k &=& y_{k-1} \\ + y_k &=& \beta_k \cdot z_k + \end{array} \right. +\end{equation} +A questo punto possiamo scegliere varie tecniche per risolvere il sistema lineare; sottolineamo che un metodo diretto +che utilizza una fattorizzazione in questo caso è molto conveniente rispetto ad uno iterativo. Se calcoliamo +la fattorizzazione di $A$, infatti, possiamo poi usarla per risolvere tutti i sistemi lineari della successione con +un costo basso. + +In particolare, ricordiamo che per una tridiagonale hermitiana e per una matrice in forma di Hessenberg superiore +il costo di una fattorizzazione QR sono rispettivamente $O(n)$ e $O(n^2)$, e sono anche il costo della risoluzione +del sistema lineare. Si verifica sperimentalmente che, partendo da una buona approssimazione degli autovalori, +il metodo converge in genere in 3-4 passi, indipendemente dalla dimensione di $A$. Si conclude quindi che il calcolo +dell'autovettore dominante risulta essere $O(n)$ per le tridiagonali e $O(n^2)$ per le matrici in forma di +Hessenberg. + +Ci poniamo ora il problema di come calcolare gli autovettori che stanno nella parte centrale dello spettro, ed è qui +che interviene lo \emph{shifting}. Non è difficile osservare che gli autovalori della matrice $A - \gamma I$ sono gli +stessi di $A$ ``shiftati'' di $\gamma$, ovvero sono +\[ + \spe{A - \gamma I} = \{ \lambda - \gamma \ | \ \lambda \in \spe{A} \ \} +\] +Supponiamo ora di avere una buona approssimazione $\hat \lambda_j$ dell'autovalore $\lambda_j$, dove con ``buona +approssimazione'' intendiamo tale che +\[ + |\hat \lambda_j - \lambda_j| < |\hat \lambda_j - \lambda_k| \quad \forall k \in \spe{A}\setminus\{\lambda_j\} +\] +In questo caso $\hat \lambda_j - \lambda$ è l'autovalore di modulo più piccolo della matrice $A - \hat \lambda_j I$ +e il suo autovettore è quello relativo all'autovalore $\lambda_j$ della matrice $A$. Possiamo quindi applicare +il metodo delle potenze inverso a $A - \lambda_j I$ e ottenere l'autovettore cercato. Questa operazione prende +il nome di \emph{metodo delle potenze inverso con shift}. + +\begin{os} + In questo modo si può applicare un metodo qualsiasi per ottenere un'approssimazione degli autovalori (ad esempio + il metodo QR) e poi calcolare tutti gli autovettori della matrice con il metodo delle potenze inverso con shift. + Se la matrice è tridiagonale hermitiana si possono ottnere tutti con costo $O(n^2)$, mentre se è in forma di + Hessenberg superiore il costo diventa $O(n^3)$ per le considerazioni fatte in precedenza. +\end{os} + +\begin{os} + Un'altra cosa che si può notare è che il metodo fornisce anche un possibile raffinamente per l'autovalore + $\lambda_j$ tramite il rapporto fra le componenti di $y_k$ e di $y_{k-1}$. Si potrebbe essere tentati + di sostituire questo eventuale raffinamento al posto dello shifting ma si verifica che questa non è necessariamente + una buona pratica. Esistono alcuni casi in cui può inficiare la convergenza del metodo. +\end{os} + diff --git a/capitoli/capitolo3.tex b/capitoli/capitolo3.tex new file mode 100644 index 0000000..b3da59c --- /dev/null +++ b/capitoli/capitolo3.tex @@ -0,0 +1,412 @@ +\chapter{Decomposizione in valori singolari} \label{ch:svd} + +In questa sezione ci occuperemo di un tipo di fattorizzazione basato sulle proprietà spettrali, e quindi differente +dalle fattorizzazioni viste fino ad ora (come la QR o la LU). Cominceremo esponendo un caso concreto in cui +ci si trova nella necessità di utilizzarla. + +\section{Problemi lineari ai minimi quadrati} +Consideriamo il seguente problema; sia $A$ una matrice $m \times n$ con $m \geq n$ e $b$ un vettore +di $\R^m$. Vogliamo trovare $x$ tale che $Ax = b$. In generale questo problema è risolubile solo se +$b \in \imm{A}$ vista come applicazione lineare, ma non è conveniente affrontare il problema risolvendo +effettivamente il sistema lineare. Possiamo quindi riformulare la nostra richiesta in questo modo: cerchiamo +$x$ tale che +\[ + x = \min_{x \in \R^n}( || Ax - b ||_2 ) +\] +Se $x$ è effettivamente soluzione del sistema lineare avremo $||Ax - b||_2 = 0$, ed in caso contrario +avremo un $x$ tale che $Ax$ sia una buona\footnote{dove buona significa che non si potrebbe trovare +un altro $x'$ tale ceh $Ax'$ sia più vicino (nel senso della norma 2) a $b$ di quanto lo sia già $Ax$} +approssimazione di $b$. + +Analizziamo alcune tecniche per la risoluzione di questo problema + +\subsection{Fattorizzazione QR} +Consideriamo la fattorizzazione QR di $A = QR$. Osserviamo che in questo caso $Q \in \matr{\R}{n}{n}$ e +$R \in \matr{\R}{m}{n}$. Osservando che minimizzare la norma 2 è la stessa cosa che minimizzarne il +quadrato si ottiene +\[ + ||Ax - b||_2^2 = ||QRx - b||_2^2 = ||Q(Rx - \trasp Qb)||_2^2 = ||Rx - \trasp Qb||_2^2 +\] +dove l'ultimo passaggio è giustificato dal fatto che $Q$ è unitaria. +Consideriamo che la matrice $R$ e il vettore $\trasp Qb$ avranno una struttura di questo tipo: +\[ + R = \left[ \begin{array}{c} + \hat R \\ + \trasp 0 + \end{array} \right] +\qquad \trasp Qb = \left[ \begin{array}{c} + w_1 \\ + w_2 + \end{array} \right] +\] +dove $\hat R$ è una matrice quadrata $n \times n$, $w_1$ un vettore con $n$ componenti e $w_2$ un vettore +di $\R^{m-n}$. Possiamo quindi riscrivere la relazione precedente in questo modo +\[ + ||Ax - b||_2^2 = ||\hat Rx - w_1||_2^2 + ||w_2||^2 +\] +Abbiamo ricondotto il problema a minimizzare la norma di $\hat Rx - w_1$. Se $\hat R$ è invertibile allora +la soluzione al problema è evidentemente unica ed è la soluzione del sistema lineare $\hat Rx = w_1$. +Osserviamo che $\hat R$ è invertibile se e solo se lo è $\rk{A} = n$; per ora assumeremo che +questo sia vero, riservandoci di analizzare il caso più generale in seguito. + +In conclusione la fattorizzazione QR ci ha permesso di ricondurre il problema alla risoluzione di un sistema +lineare quadrato di ordine $n$. Analizziamo ora un diverso approccio. + +\subsection{Sistema delle equazioni normali} +Questo sistema deriva dalla seguente osservazione. Supponiamo di avere $x$ soluzione del sistema $Ax = b$. Allora +$x$ deve essere anche soluzione del sistema quadrato $\trasp AAx = \trasp Ab$, che si ottiene semplicemente moltiplicando +a sinistra la precedente relazione per $\trasp A$. +Osserviamo ancora una volta che scrivendo la fattorizzazione QR di $A$ e supponendo che $A$ abbia rango massimo si +ottiene lo stesso risultato di prima: +\[ + A = QR \qquad \trasp AAx = b \iff \trasp RRx = \trasp R\trasp Qb \iff \trasp R\hat R = \trasp Rw_1 \iff + \hat Rx = w_1 +\] +e quindi si ha l'unicità della soluzione e la risolubilità del sistema lineare. In generale però, il calcolo +di $\trasp AA$ potrebbe essere oneroso e, soprattutto, nessuno ci garantisce in una situazione generale +che il rango di $A$ sia massimo. + +\subsection{Teorema di decomposizione in valori singolari} +Possiamo pensare di voler migliorare l'idea delle equazioni normali. In altre parole, vogliamo trovare il +modo di evitare il calcolo di $\trasp AA$. Consideriamo dunque il seguente +\begin{te}[Decomposizione in valori singolari] +Siano $m \geq n$ e $A \in \matr{\R}{m}{n}$. Esistono $U \in \matr{\R}{m}{n}$ e $V \in \mat{\R}{n}$ ortogonali e +$\Sigma \in \matr{\R}{m}{n}$ tali che +\[ + \Sigma = \left[ \begin{array}{cccc} + \sigma_1 & & & \\ + & \sigma_2 & & \\ + & & \ddots & \\ + & & & \sigma_n \\ \hline + \multicolumn{4}{c}{\trasp 0} \\ + \end{array} \right]; \qquad \textrm{dove} \: \sigma_i \geq \sigma_j \ \forall i < j \qquad \textrm{e} \qquad +A = U\Sigma\trasp V +\] +\end{te} + +\begin{os} + Osservando che $\Sigma$ è quasi diagonale si capisce che in un certo senso questa è una decomposizione spettrale. + In particolare si può scrivere $\trasp AA$ come + \[ + \trasp AA = \trasp V\Sigma\trasp U U \Sigma V = \trasp V \left[ \begin{array}{cccc} + \sigma_1^2 & & & \\ + & \sigma_2^2 & & \\ + & & \ddots & \\ + & & & \sigma_n^2 \\ \hline + \multicolumn{4}{c}{\trasp 0} \\ + \end{array} \right] V + \] +e quindi se prendiamo $\lambda_i$ gli autovalori di $\trasp AA$ (che sono reali perché la matrice $\trasp AA$ +è simmetrica) ordinati in modo decrescente abbiamo che $\sigma_i = \sqrt{\lambda_i}$ per ogni $i = 1 \ldots n$. +\end{os} +Inoltre questa fattorizzazione mette in luce altre proprietà della matrice $A$. In particolare: +\begin{os} + Se $A$ ha rango $k$, allora $\sigma_1 \ldots \sigma_k$ sono tutti diversi da $0$ mentre $\sigma_{k+1} \ldots +\sigma_n$ sono $0$. Questo si nota dal fatto che $\trasp AA$ ha lo stesso rango di $A$ ed il suo rango + è pari al numero\footnote{inteso come numero moltiplicato per la molteplicità algebrica} di autovalori diversi da $0$. + L'ordinamento che abbiamo richiesto sui $\sigma_i$ ci permette di concludere. +\end{os} + +Possiamo ora osservare come cambia il problema lineare ai minimi quadrati quando introduciamo questa +nuova fattorizzazione. +\[ + ||Ax - b||_2^2 = ||U\Sigma\trasp Vx - b||_2^2 = ||\Sigma\trasp Vx - \trasp Ub||_2^2 +\] +e ponendo $z = \trasp V x$ e $\trasp Ub = \left[ \begin{array}{c} w_1 \\ w_2 \end{array} \right] $ si ottiene +\[ + \Bigg|\Bigg|\Sigma z - \left[ \begin{array}{c} w_1 \\ w_2 \end{array} \right] \Bigg|\Bigg|_2^2 = + \Bigg|\Bigg|\left[ \begin{array}{ccc} \sigma_1 & & \\ & \ddots & \\ & & \sigma_n \end{array} \right] z - w_1\Bigg|\Bigg|_2^2 + ||w_2||_2^2 +\] +Se il rango di $A$ è $n$ allora la matrice $\diag{\sigma_1 \ldots \sigma_n}$ è invertibile e quindi per +minimizzare il primo fattore è sufficiente risolvere un sistema diagonale di ordine $n$. + +Se però $A$ è di ordine $k < n$ allora si può ripartizionare $\trasp Ub$ in una parte con $k$ componenti +e una parte con le restanti $n-k$. Riscrivendo l'espressione si ottiene che si può minimizzare il primo fattore +risolvendo un sistema di $k$ equazioni e scegliendo arbitrariamente le restanti $n-k$. +\begin{os} Come regola generale si preferisce scegliere queste ultime componenti tutte nulle in modo + da minimizzare la norma della soluzione. \`E infatti generalmente preferibile ottenere una soluzione di norma piccola. +\end{os} +Dalle relazioni sopra possiamo anche ottenere una espressione esplicita della soluzione $z$. In particolare +\[ + z_j = \frac{w_{1,j}}{\sigma_j} = \frac{\trasp U_j b }{\sigma_j} \quad \text{dove} \ U_j \ \text{è la $j$-esima +colonna di} \ U +\] +Ora possiamo ricordare che $x = Vz$ e quindi se $A$ è di rango massimo +\[ + x = Vz = \sum_{k=1}^{n} \frac{V_k\trasp U_kb}{\sigma_k} = \underbrace{\left( \sum_{k=1}^{n} \frac{V_k\trasp U_k}{\sigma_k} \right)}_{A^+} b +\] +e chiamiamo $A^+$ \emph{pseudo-inversa} di $A$. Più precisamente +\[ + A^+ = V \Sigma^{-1} \trasp U +\] +% TODO: Controllare che le uguaglianze scritte sull'inversa abbiano senso. Una è giusta di sicuro, +% ma quale? +Si verifica subito infatti che e $A^+A = I$. % \footnote{ma attenzione! Non è vero che $AA^+ = A^+A$ perchè +% queste sono addirittura due matrici di ordine diverso. Il loro prodotto dà sempre l'identità, ma non dello stesso +% spazio.}. +Questa pseudo-inversa di chiama anche \emph{inversa di Moore-Penrose}. + +Se $A$ non è di rango massimo possiamo ugualmente definire la pseudo-inversa ``fermando'' la somma +a $k$ dove $k$ è il rango di $A$. Abbiamo dunque +\[ + A^+ = \sum_{j=1}^{k} \frac{V_j\trasp U_j}{\sigma_j} +\] +e ancora una volta vale l'eguaglianza $x = A^+b$ dove $x$ è il vettore di rango minimo che risolve (nel senso +che minimizza il valore della norma) + il problema lineare ai minimi quadrati. + +\subsection{Interpolazione polinomiale} +Abbiamo visto nel corso di analisi numerica che dati $(x_i,y_i)$ con $i = 0 \ldots n$ è sempre possibile +trovare un polinomio di grado al più $n$ tale che $p(x_i) = y_i$ per tutti gli $i$. + +Nelle applicazioni concrete si ha però a che fare con grandi moli di dati sperimentali e raramente +il grado del polinomio che si vorrebbe usare per creare un modello matematico ha lo stesso ordine +di grandezza. Ci chiediamo: ``\`E allora possibile trovare il polinomio di grado $m \ll n$ che meglio +approssimi la distribuzione dei nostri dati sperimentali?''; la risposta è sì e si tratta di risolvere +un problema lineare ai minimi quadrati con una matrice $m \times n$. +Indagheremo in seguito questa tecnica per il calcolo del miglior polinomio approssimanete un insieme di dati +sperimentali, perché dovremo superare anche il problema del condizionamente della matrice di Van der Monde +che individua il problema\footnote{Questo era un problema anche nel caso standard con matrice quadrata, e rimarrà +complesso anche nel caso della matrice rettangolare}. + +\subsection{Principali proprietà della SVD} \label{subsec:svdprop} +Abbiamo introdotto la SVD parlando di sistemi lineari perché questo è il contesto in cui è stata originariamente +concepita. Possiamo però osservare che essa ha anche delle interessanti proprietà in molti altri ambiti. + +Consideriamo la matrice $A \in \matr{\R}{m}{n}$ che individua univocamente un'applicazione lineare +\[ +T_A : \R^n \longto \R^m +\] +La \svd\ ci permette di conoscere meglio questa applicazione. Sappiamo che se $A$ è di rango $k$ allora +$A = U\Sigma\trasp V$ e i $\sigma_i$ della matrice $\Sigma$ sono nulli a partire dal ($k+1$)-esimo. +\`E chiaro dunque che la scomposizione di permette di determinare il rango di $A$ e quindi di capire +che l'immagine di $T_A$ avrà dimensione $k$ e il kernel dell'applicazione $n-k$. Ricordando però che +\[ + Ax = U\Sigma\trasp Vx = \sum_{i=1}^{k} \sigma_i U_i\trasp V_i x +\] +possiamo estrarre altre informazioni. Dato che per ogni $x$ $V_i x$ è uno scalare l'immagine di $T_A$ +deve essere contenuta nello $\Span{U_1 \ldots U_k}$. Dato che quest'ultimo ha dimensione $k$, che è la +stessa di $\imm{T_A}$, devono coincidere e quindi le prime $k$ colonne di $U$ sono una base per l'immagine. +Analogamente dall'ortogonalità delle colonne di $V$ si ha che se $x = V_j$ con $j > k$ allora $Ax = 0$ +e quindi lo $\Span{V_{k+1} \ldots V_{n}}$ è contenuto nel kernel di $T_A$. Ancora una volta per motivi +dimensionali devono coincidere. + +In sintesi si ha che se $A = U\Sigma\trasp V$ è una matrice di rango $k$ allora +\begin{itemize} + \item $\Ker{A} = \Span{V_{k+1} \ldots V_n}$; + \item $\imm{A} = \Span{U_1 \ldots U_k}$; +\end{itemize} + +Introduciamo ora un'estensione del concetto di norma indotta visto nel corso di Analisi Numerica +\begin{de} + Sia $A$ una matrice $m \times n$. Si dice \emph{norma di $A$ indotta dalla norma vettoriale $||\cdot||$} + la seguente funzione + \[ + \begin{array}{rcl} +||\cdot|| : \matr{\R}{m}{n} &\longto& \R \\ + A & \longmapsto & \displaystyle \max_{||x|| = 1} ||Ax|| + \end{array} + \] +\end{de} +Questa è effettivamente una norma, ma la verifica viene qui omessa. +%TODO: Magari si potrebbe anche fare, suvvia! + +\begin{os} + Osserviamo la seguente catena di uguaglianze + \[ + ||Ax||_2 = ||U\Sigma \trasp V x||_2 = ||\Sigma \trasp V x||_2 = ||\Sigma z||_2 +\] +Queste ci dicono che, data l'invertibilità e l'ortogonalità di $V$, $||A||_2 = ||\Sigma||_2 = \sigma_1$. +\end{os} +Date queste considerazioni possiamo introdurre anche una generalizzazione del condizionamento +ridefinendole con la nuova norma e con la pseudo inversa. Nel caso della norma due si ottiene che +\[ + \cond{A} = ||A^+|| \cdot ||A||_2 = \frac{\sigma_1}{\sigma_k} +\] +dove $\sigma_k$ è il più piccolo $\sigma_i$ non nullo, ovvero, come al solito, $k$ è il rango di $A$. +Un'analisi dell'errore effettuata sul problema lineare ai minimi quadrati mostrerebbe come effettivamente +l'errore generato dal procedimento dipende proprio da questo coefficiente. + +\subsection{\tsvd, pulizia del rumore e compressione di immagini} +Le considerazioni fatte nella Sezione~\ref{subsec:svdprop} ci permettono di introdurre delle tecniche +per ridurre il condizionamento di alcuni problemi. + +Supponiamo di avere ad esempio un sistema lineare $Ax = b$ con $A$ una matrice con un condizionamento +molto alto. Siamo consci di non avere speranza di risolvere in maniera esatta il sistema senza aumentare +la precisione dei tipi che utilizziamo negli algoritmi. +Se ad esempio il condizionamento è nell'ordine di $10^{12}$ e la precisione di macchina di $10^{16}$ sappiamo +che probabilmente avremo circa $4$ cifre decimali corrette (nella migliore delle ipotesi). La soluzione di aumentare +la precisione di macchina (ad esempio portarla a $10^{-32}$) potrebbe essere una soluzione ma appesantirebbe +molto l'esecuzione dell'algoritmo. + +Consideriamo dunque la \svd\ di $A = U\Sigma\trasp V$. +Possiamo supporre che $\sigma_n$ sia molto piccolo e che +questo causi il cattivo condizionamento (ricordiamo che $\cond{A} = \frac{\sigma_1}{\sigma_n}$). Possiamo +pensare di troncare la matrice $\Sigma$ sostituendola con una matrice $\hat \Sigma$ identica ad eslusione del posto +$(n,n)$ dove rimpiazziamo $\sigma_n$ con $0$, e risolvere il problema $\hat Ax = U\hat \Sigma\trasp Vx = b$. +Questo \textbf{è un altro problema}, ma potrebbe essere molto meglio condizionato del precedente (ad esempio +se $\sigma_{n-1} \gg \sigma_n$) e talvolta è la scelta migliore. + +Questa pratica di ``troncamento'' viene chiamata \tsvd, ovvero \svd\ con troncamento. \`E tipicamente +utile nella ricostruzione di immagini (che vedremo più avanti) perché non ci interessa la soluzione esatta +del problema, ma la soluzione esatta di un problema ``semplice'' che si avvicini ai nostri dati. +Questo procedimento viene anche detto di soglia, o di filtro, perché è possbile decidere una soglia minima +sotto la quale i $\sigma_i$ non possono scendere, pena essere messi a $0$. In questo modo, fissata la +soglia $s$, avremo che il condizionamento sarà maggiorato da $\sigma_1s^{-1}$. + +In generale non è un problema banale scegliere il livello di soglia $s$. Nei casi più semplici si ha +un salto dei valori singolari, che passano da un ordine di grandezza ad uno (o a più) inferiori, dividendo +in due zone ben distinte quelli prossimi a $0$ e quelli $\gg 0$. + +Osservaiamo che in generale non abbiamo alcuna garanzia che i risultati ottenuti tramite +questa tecnica abbiano un riscontro con il problema che aveva generato i dati di partenza, e va quindi +usata con molta attenzione. + +Un altro esempio pratico di utilizzo della \tsvd\ è quello della compressione delle immagini. Supponiamo di avere +un'immagine rappresentata come una matrice di pixel $A$\footnote{non esiste un motivo per cui la matrice dovrebbe +essere quadrata, è solo per rendere più chiaro l'esempio} di dimensione $n \times n$. Possiamo scrivere +$A = U\Sigma\trasp V$ e pensare di limitarci ad una matrice di rango $k$ e quindi tronvare tutti i $\sigma_i$ +con $i > k$. In questo modo potremo rappresentare l'immagine considerando solo le prime $k$ colonne di $U$, le +prime $k$ righe di $V$ e i $\sigma_1 \ldots \sigma_k$. +Per fare un esempio pratico supponiamo $n = 1024$, ovvero un'immagine da 1 Megapixel. Questa occuperebbe in memoria +(supponendo che sia in bianco e nero a 256 colori) $1 MB$. Decidendo di comprimerla con una matrice di rango $15$ +avremmo invece una dimensione di $15 KB$! Ovviamente l'immagine risultante darebbe solamente un'idea di quella originale, +ma si potrebbe pensare di trovare un punto d'incontro fra dimensione e qualità\footnote{e magari di raffinare anche +il metodo di compressione, ma questo lo vedremo in seguito} (si veda ad esempio la Figura~\ref{fig:camosci}). + +\begin{figure}[ht!] +\begin{center} + \includegraphics[scale=0.2]{camosci/camoscio_100.png} + \includegraphics[scale=0.2]{camosci/camoscio_50.png} + \includegraphics[scale=0.2]{camosci/camoscio_25.png} + \includegraphics[scale=0.2]{camosci/camoscio_15.png} + \includegraphics[scale=0.2]{camosci/camoscio_8.png} + \caption{Una successione di camosci di 300 pixel di lato e di rango rispettivamente $100$, $50$, $25$, $15$ e $8$; le + immagini sono state ridimensionate per stare nella pagina, e sono state realizzate con un programma + identico a quello realizzato in laboratorio durante il corso.} \label{fig:camosci} +\end{center} +\end{figure} + + +\section{Calcolo della decomposizione in valori singolari} +In questa sezione introdurremo dei metodi per il calcolo della \svd\ e faremo qualche altra considerazione +sui suoi possibili utilizzi. + +\subsection{Approssimazione di rango fissato} +Supponiamo di avere una matrice $A \in \mat{\R}{n}$ e di volerne trovare una approssimazione efficiente. +Un'idea può essere quella di rappresentarla con una matrice di rango fissato $k < n$ che le assomigli il +più possibile. \\ +Consideriamo la procedura seguita anche alla fine della sezione precedente +\begin{enumerate} + \item Calcoliamo la fattorizzazione \svd\ di $A = U \Sigma V$; + \item Tronchiamo la $\Sigma$ ponendo $\sigma_{k+1} \ldots \sigma{n} = 0$ e chiamiamo $\tilde \Sigma$ + la nuova matrice; + \item Approssimiamo $A$ con $U \tilde \Sigma V = \sum_{i=1}^{k} \sigma_j U_j \trasp{V_j}$; +\end{enumerate} +\begin{os} + Questa approssimazione di $A$ è molto pratica nel caso non si abbia sufficiente spazio per + salvare $A$ nella memoria di un calcolatore. Suggerisce infatti un metodo immediato per ridurre + (circa) di un fattore $\frac{n}{k}$ lo spazio occupato. \`E infatti sufficiente salvare le prime $k$ + colonne di $U$, le prime $k$ righe di $A$ e i primi $k$ valori sulla diagonale di $\Sigma$. +\end{os} +Una domanda naturale a questo punto è: ``Quanto differiscono le due matrici?''. Osserviamo che +\[ + ||A - B||_2 = ||U\Sigma \trasp V - U \tilde \Sigma \trasp V||_2 = ||U[\Sigma - \tilde \Sigma] \trasp V||_2 + = \sigma_{k+1} +\] +Se $\sigma_{k+1}$ è sufficientemente piccolo abbiamo quindi un piccolo errore. Questo, di fatto, si +verifica in molte applicazioni pratiche dove i $\sigma_i$ piccoli possono rappresentare i disturbi +all'informazione che si intendeva analizzare (come nel caso della trasmissione di segnali). + +In realtà possiamo dire di più. Sia $B$ una matrice di rango $k$. Sappiamo che +\[ + \Dim{\Ker{B}} + \Dim{\imm{B}} = n \qquad \Dim{\Ker{B}} \geq n - k +\] +Considero il sottospazio $S = \Span{V_1,\ldots,V_{k+1}} \subseteq \R^n$. Per una questione di dimensioni +deve esistere un vettore non nullo $z \in S \cap \Ker{B}$, e possiamo supporre $||z||_2 = 1$. +Osserviamo che +\[ +|| (A - B)z ||_2 = ||Az||_2 = ||\sum_{i=0}^{k+1} \sigma_i U_i \trasp V_i z||_2 \geq + || \sigma_{k+1} U_i \trasp V_i z ||_2 = \sigma_{k+1} +\] +In particolare abbiamo mostrato che la nostra approssimazione era la migliore possibile, nel senso che +per ogni altra approssimazione ha una distanza maggiore o uguale da $A$ (secondo la norma 2). + +\subsection{Metodi di calcolo, errori e costo computazionale} +Abbiamo visto che la \svd\ è una sorta di decomposizione spettrale della matrice $A$. Più precisamente +i $\sigma_i$ che si trovano sulla diagonale di $\Sigma$ sono le radici degli autovalori di $\trasp AA$ +(che è semidefinita positiva). \\ +Un primo modo per affrontare il calcolo della fattorizzazione potrebbe quindi essere +\begin{enumerate}[(a)] + \item Calcolare $\trasp AA$; + \item Determinare la decomposizione spettrale di $\trasp AA = V D \trasp V$; + \item Calcolare la fattorizzazione $QR$ di $AV = UR$; +\end{enumerate} +Osserviamo ora che $\trasp R\trasp U U R = \trasp RR = \trasp V \trasp AA V = D$; $\trasp RR$ è quindi +la fattorizzazione di Cholesky di $D$. Si può mostrare che la diagonalità di $D$ implica che anche $R$ sia +diagonale e quindi $A = UR\trasp V$ è quasi la \svd\ di $A$. In effetti non abbiamo ancora considerato +il problema dell'ordine (vorremmo $\sigma_i \geq \sigma_j$ se $i \geq j$). +Questo problema sarebbe risolto nel momento in cui la colonna di $AV$ di norma maggiore fosse in prima posizione +(e conseguentemente le altre in ordine di norma discendente). +Possiamo quindi introdurre una opportuna matrice di permutazione $P$ e riscrivere la relazione +nel seguente modo +\[ + AVP = U\Sigma +\] +In questo modo la prima colonna di $AVP$ è quella di norma maggiore e quindi i $\sigma_i$ saranno +in ordine decrescente. + +\begin{os} + Per eseguire il procedimento sopra descritto abbiamo bisogno di conoscere la matrice $\trasp AA$, che tipicamente + può essere grande (ad esempio se $m \gg n$). Calcolare la sua decomposizione spettrale potrebbe introdurre + molti problemi di stabilità, e occupare molto spazio in memoria. Sarebbe quindi interessante trovare un + metodo per avere una decomposizione spettrale di $\trasp AA$ senza doverla effettivamente calcolare. +\end{os} + +Supponiamo ora di avere $U,V$ matrici ortogonali e $B$ matrice bidiagonale tali che +\[ + A = UB\trasp V +\] +allora si ha che +\[ + \trasp AA = \trasp V \trasp B B V +\] +e $\trasp B B$ è una matrice tridiagonale; avere la decomposizione spettrale di $\trasp B B$ è quindi equivalente +ad avere la decomposizione spettrale di $\trasp A A$! + +Sappiamo inoltre che calcolare la decomposizione spettrale di una matrice tridiagonale simmetrica è particolarmente +semplice. + +L'unico pezzo che manca è mostrare come è possibile calcolare le matrici $U$ e $V$ che bidiagonalizzano $A$. +Possiamo usare le matrici di Householder in questo modo: +\begin{enumerate}[(a)] + \item Calcoliamo $P_1$ tale che $P_1 Ae_1 = \alpha e_1$, e quindi $P_1A$ abbia la prima colonna + nulla ad eccezione dell'elemento in posizione $(1,1)$; + \item Calcoliamo $Q_1$ tale che $P_1 A Q_1$ abbia la prima riga nulla ad esclusione dei primi + due elementi (in posizione $(1,1)$ e $(1,2)$); + \item Iteriamo il procedimento sopra lavorando sulla seconda colonna e sulla seconda riga, e poi di seguito + per tutte le righe e colonne; +\end{enumerate} +Si verifica che il procedimento sopra porta effettivamente ad una matrice bidiagonale e che $\trasp BB$ +è tridiagonale simmetrica. + +Analizziamo ora il costo computazionale di questo procedimento. Il primo passo consiste nel calcolo delle +due matrici ortogonali che bidiagonalizzano $A$. Il costo di ogni passo del procedimento è il calcolo +di due matrici di Householder e quindi $O(n)$. Viene ripetuto $n$ volte fino ado ottenere un +costo complessivo di $O(n^2)$. Diventa poi $O(mn^2)$ perchè bisogna effettuare le moltiplicazioni. + +Analogamente il costo del calcolo degli autovalori con il metodo \qr\ è $O(n^2)$; il metodo richiederebbe +però di calcolare la matrice $\trasp BB$ che potrebbe essere piuttosto grande. In realtà esiste un metodo +(che qui non esponiamo) per applicare il metodo \qr\ a $\trasp BB$ senza calcolarla esplicitamente ma +conoscendo solamente $B$, lasciando il costo totale a $O(mn^2)$. + +Un problema da affrontare, infine, è quello dell'errore. Il teorema di Bauer-Fike (Teorema~\ref{te:BauerFike}) ci +assicura infatti che il problema del calcolo degli autovalori di una matrice simmetrica è ben condizionato, +ma assicurandoci solo una maggiorazione dell'errore assoluto, e non una dell'errore relativo. Sfortunatamente +nelle applicazioni si è spesso interessati a calcolare con precisione i valori singolari piccoli e questo +potrebbe essere un problema. Negli ultimi anni sono state sviluppate tecniche per il calcolo della \svd\ che +hanno tenuto conto di questo problema ma non sono ancora state implementate in programmi come \matlab\ o librerie +come \lapack. + + + diff --git a/capitoli/capitolo4.tex b/capitoli/capitolo4.tex new file mode 100644 index 0000000..6a68e56 --- /dev/null +++ b/capitoli/capitolo4.tex @@ -0,0 +1,346 @@ +\chapter{Risoluzione di sistemi lineari} + +In questo capitolo affronteremo il tema della risoluzione dei sistemi lineari introducendo dei metodi +iterativi specifici per alcune classi di matrici particolarmente interessanti; queste individueranno +solitamente sistemi troppo grandi per essere risolti tramite metodi diretti e in cui la convergenza +dei metodo classici (Jacobi e Gauss Seidel) è quasi assente. + +\section{Sitemi lineari con matrici definite positive} + +\subsection{Metodo del gradiente} +Supponiamo di avere una matrice $A \in \mat{\R}{n}$ definita positiva ed un sistema lineare +\[ + Ax = b +\] +In molti casi pratici (come ad esempio nello studio delle Vibrazioni, vedi Sezione~\ref{sec:vibsistcont}) +ci si trova a risolvere sistemi lineari con matrici definite positive sparse o strutturate\footnote{in +cui in generale il costo del prodotto matrice vettore è basso} e in cui è conveniente usare un metodo +iterativo. + +Consideriamo la seguente funzione +\begin{equation} + \Phi(x) = \frac{1}{2} \trasp x A x - \trasp x b +\end{equation} +Osserviamo che il suo gradiente è dato dalla seguente espressione +\begin{equation} + \nabla \Phi(x) = Ax - b +\end{equation} +e quindi vale $0$ solo se $x$ è una soluzione del sistema lineare. Possiamo quindi riformulare la ricerca +della soluzione del sistema lineare come ricerca dei punti stazionari della funzione $\Phi$. +Possiamo osservare che se $\bar x$ è un punto stazionario per $\Phi$ allora calcolando la matrice +delle derivate seconde si ottiene esattamente $A$; ricordando che $A$ è definita positiva si può concludere +che $\bar x$ è un punto di minimo per $\Phi$ e quindi +\[ + A\bar x = b \iff \bar x = \min_{x \in \R^n} ( \Phi(x) ) +\] +In sintesi abbiamo ricondotto il problema della risoluzione del sistema lineare ad un problema di minimizzazione. +Ricordando che siamo alla ricerca di un metodo iterativo vorremmo affrontare il problema nel modo seguente +\begin{enumerate}[(a)] + \item Scegliamo un punto $x_0$ a caso; + \item Cerchiamo di determinare in che direzione si trova il minimo; + \item Ci spostiamo ponendo $x_1 = x_0 + \alpha_0v_0$ dove $v_0$ è la \emph{direzione di decrescita} + appena determinata e $\alpha_0$ un opportuno scalare; +\end{enumerate} + +I \emph{metodi del gradiente}, ovvero quei metodi basati sulle considerazioni appena fatte, assumono +nomi diversi a seconda della tecnica scelta per determinare la direzione di decrescita. + +\subsection{Il metodo del gradiente ottimo} +Una prima scelta piuttosto naturale per la direzione di decrescita nel punto $x_k$ potrebbe essere $-\nabla \Phi(x_k)$. +Ricordiamo infatti dall'analisi che il gradiente indica la direzione in cui la funzione ``cresce'' di più. +Questa scelta si dice del \emph{gradiente ottimo} ed è stata, storicamente, la prima ad essere implementata +e studiata. \\ +Una volta scelta la direzione dobbiamo determinare $\alpha_k$. Per fare questo studiamo la seguente funzione di +$\alpha$ che valuta $\Phi$ sulla retta\footnote{nel senso di retta affine} $x_k + \Span{v_k}$: +\[ + g(\alpha) = \Phi(x_k + \alpha v_k) +\] +Ricordando che vogliamo trovare il minimo di $\Phi$ e osservando che $g$ è convessa cerchiamo anche qui un punto +stazionario di $g$; questo sarà l'$\alpha_k$ che ci permette di ottenere il valore minimo di $\Phi$ sulla direzione +determinata da $v_k$. \\ +Otteniamo +\[ + g'(\alpha) = \alpha \trasp v_k A v_k + \trasp v_k (A x_k - b) = 0 +\] +e quindi ponendo $r_k = v - Av_k$ si ottiene +\[ + \alpha_k = \frac{\trasp v_k (-Ax_k + b)}{\trasp v_k A v_k} = \frac{\trasp v_k r_k}{\trasp v_k A v_k} +\] +Osserviamo in particolare che tenere traccia del valore di $r_k$ è utile per decidere quando +fermare il metodo. $||r_k|| = ||Ax_k - b||$ è indice di quanto siamo ``distanti'' dalla soluzione. + +Si è verificato che questo metodo è convergente per ogni scelta di $x_0$ però ci si è accorti che +non è la scelta migliore della direzione di decrescita. + +\subsection{Il metodo del gradiente coniugato} +Dopo l'introduzione del metodo del gradiente ottimo si è studiata un altro metodo di scelta, a cui +dobbiamo però premettere alcune definizioni. + +\begin{de} Data una matrice $A \in \mat{\R}{n}$ una $n$-upla di vettori $(p_1 \ldots p_n)$ di $\R^n$ + si dicono \emph{$A$-coniugati} se + \[ + \left[ \begin{array}{ccc} + \quad \trasp p_1 \quad \\ + \quad \vdots \quad \\ + \quad \trasp p_n \quad \\ + \end{array} \right] + A + \left[ \begin{array}{ccc} + \multirow{3}{*}{$p_1$} & \multirow{3}{*}{$\ldots$} & \multirow{3}{*}{$p_n$} \\ + & & \\ + & & + \end{array} \right] + = D + \] + dove $D$ è una matrice diagonale. +\end{de} + +\begin{os} \label{os:coniugli} + Se abbiamo una $n$-upla di vettore $A$-coniugati possiamo facilmente dire che sono linearmente +indipendenti. +\end{os} + +Vorremmo ora impostare l'iterazione in modo che i vettori $v_0, v_1, \ldots$ che definiscono le +direzioni di descrescita siano $A$-coniugati. Osserviamo in particolare che la condizione di +lineare indipendenza ci permette di dire che non possiamo fare più di $n$ iterazioni dove $n$ è +la dimensione della matrice $A$. Scopriremo, per fortuna, che questo è solo apparentemente un +problema. + +Dobbiamo ora trovare un metodo dati $v_1, \ldots, v_{k-1}$ vettori $A$-coniugati per determinare +$v_k$ tale che sia $A$-coniugato con tutti gli altri. Poniamo $v_k = r_k + \beta_k v_{k-1}$; +per avere la condizione di ortogonalità\footnote{secondo il prodotto scalare definito da $A$} +dovremo avere +\[ + (\trasp r_k + \beta_k\trasp v_{k-1}) A v_{k-1} = 0 +\] +e quindi +\[ + \beta_k = \frac{\trasp r_k A v_{k-1}}{\trasp v_{k-1} A v_{k-1}} +\] +Si può verificare che questa condizione non è solo necessaria ma anche sufficiente. Un successione di vettori +scelti in questo modo è infatti forzatamente $A$-coniugata\footnote{questo risultato non verrà dimostrato qui.} + +Avendo risolto il problema del trovare effettivamente la successione, ci chiediamo come affrontare +il limite al numero di iterazioni che ci è indicato Osservazione~\ref{os:coniugli}. Ci aiuta il +seguente +\begin{te} + Se ho $\{x_k\}_{k=1,\ldots,n}$ una successione di vettori che rispetti le condizioni osservate precedentemente con $x_0 = 0$ + allora per ogni $k$ si ha che + \[ + \Phi(x_k) = \min_{x \in \Span{v_0, \ldots, v_k-1}}(\Phi(x)) + \] + ed in particolare dopo $n$ iterazioni $\Phi(x_n)$ è il minimo assoluto di $\Phi(x)$. +\end{te} +Questo teorema ci dice, in particolare, che questo metodo iterativo è in realtà un metodo diretto, ovvero +è convergente in un numero finito di passi per ogni scelta di punto iniziale. + +Poniamo ora $e_k = x_k - x$ l'errore al passo $k-esimo$. Il teorema sopra ci dice che $e_n = 0$ ma ci chiediamo +come si comporta $e_k$ mentre $k$ si avvicina $n$. Non dobbiamo infatti dimenticare che questo è un metodo +iterativo e quindi in molti casi pratici saremo interessati a fermarci prima di avere la convergenza totale. +Esiste un altro teorema che ci dà un risultato piuttosto preciso sulla velocità di convergenza +\begin{te} + Sia $||\cdot||_A$ la norma indotta dalla matrice $A$\footnote{ricordiamo che questa è definita nel seguente modo + $||x||_A := \sqrt{\trasp x A x}$} + ; allora per ogni $k$ e per ogni scelta iniziale di $x_0$ si + ha + \[ + ||e_k||_A \leq \left( \frac{2\sqrt{\cond{A}}}{\sqrt{\cond{A}} - 1} \right)^{k} ||e_0||_A + \] +\end{te} +Ancora una volta la velocità di convergenza dipende dal condizionamento della matrice del problema. Per +matrici con un piccolo condizionamento questa è molto veloce, mentre per matrici con condizionamento +più grande potrebbe diventare lenta. + +\subsection{Precondizionamento} +Supponiamo di avere una matrice $A$ definita positiva che individua un problema mal condizionato, in cui la velocità +di convergenza del metodo del gradiente coniugato è molto lenta. + +Sappiamo dai risultati di Analisi Numerica che non possiamo riuscire a risolvere con precisione +un sistema mal condizionato; ci chiediamo però se sia possibile perlomeno risolverlo velocemente, +pur con la consapevolezza che i risultati saranno molto imprecisi. + +La risposta è sì e l'idea è usare un \emph{precondizionamento}, ovvero analizzare un altro problema +che si ottiene dal primo moltiplicandolo a destra e/o a sinistra per delle altre matrici rendendolo +ben condizionato. Ovviamente i risultati finali risentiranno del cattivo condizionamento del problema +iniziale, ma la velocità di convergenza sarà elevata. + +Dato il sistema $Ax = b$ consideriamo il seguente +\[ + LA\trasp L {\trasp L}^{-1} x = L b +\] +che è equivalente. Osserviamo poi che $LA\trasp L$ è simile a $L^{-1}( L A \trasp L) L$ e quindi +a $A\trasp L L$. Ricordiamo ora che il condizionamento della matrice è dato da $\frac{\lambda_{max}}{\lambda_{min}}$ +e cerchiamo quindi una matrice $M = \trasp L L $ tale che gli autovalori di $A \trasp LL $ siano molto vicini +\footnote{e quindi il loro rapporto sia molto vicino ad $1$, che è il valore minimo in cui possiamo sperare +per il condizionamento di una matrice}. + +Osserviamo che se fosse possibile, ad esempio, scegliere $M = A^{-1}$ allora avremmo la situazione migliore possibile. +Evidentemente però questa non è un opzione, perché se fossimo a conoscenza di $A^{-1}$ avremmo già +completamente risolto il nostro problema. In ogni caso, però, un buon precondizionamento si ottiene cercando +di approssimare un'inversa di $A$. + +Non ci occuperemo in questo corso di tecniche di precondizionamento che sono varie e a volte complesse. +Sottolineamo solo alcune problematiche che potrebbero nascere usando questo approccio +\begin{enumerate}[(a)] + \item Per come abbiamo definito le matrici in gioco, $M$ dovrebbe essere definita positiva; in realtà + esiste un modo per ovviare a questo problema, ma non verrà esposto qui; + \item Una volta trovata $M$ (che potrebbe essere un'operazione complicata) dovremmo trovare anche + $L$ e quindi fare una fattorizzazione; ancora una volta, esiste un modo per ignorare il fatto che esista + la matrice $L$ ed usare solo $M$; + \item Se $A$ è una matrice strutturata, saremo probabilmente interessati a mantenerne la struttura. Questo si può + fare accontentandosi di approssimazioni dell'inversa piuttosto vaghe, ma poco invasive (come ad esempio una matrice diagonale); +\end{enumerate} + +\section{Matrici strutturate} +Uno dei punti cardine nell'applicazione dei metodi per la soluzione dei sistemi lineari sarà riuscire a +sfruttare la struttura delle matrici con cui dovremo operare. + +\subsection{Le matrici di Toeplitz} \label{subsec:toeplitz} +Molte delle matrici con cui avremo a che fare risolvendo sistemi lineari in pratica sono matrici di Toeplitz. +\begin{de} + Sia $A$ una matrice $n \times n$; $A$ si dice di \emph{Toeplitz} se le sue diagonali sono costanti, ovvero se per + ogni $i,j$ e per ogni $k \in \Z$ per cui ha senso + \[ + a_{ij} = a_{i+k,j+k} + \] +\end{de} +Queste matrici hanno una struttura molto particolare, ed esiste un modo piuttosto comodo di effettuare il +prodotto matrice per vettore. Consideriamo il caso seguente con una matrice di Toeplitz triangolare inferiore +\[ + \left[ \begin{array}{cccc} + t_0 & & & \\ + t_1 & \ddots & & \\ + \vdots & \ddots & \ddots & \\ + t_n & \cdots & t_1 & t_0 \\ + \end{array} \right] + \left[ \begin{array}{c} + p_0 \\ + p_1 \\ + \vdots \\ + p_n + \end{array} \right] += \left[ \begin{array}{l} + t_0p_0 \\ + t_1p_0 + t_0p_1 \\ + \vdots\\ + t_np_0 + t_{n-1}p_1 + \ldots + t_0p_n + \end{array} \right] +\] +Si osserva che il vettore che si ottiene ha i coefficienti che sono quelli del prodotto di questi due polinomi +\[ + \left\{ \begin{array}{lll} + t(x) &=& t_0 + t_1 z + \ldots + t_n z^n \\ + p(x) &=& p_0 + p_1 z + \ldots + p_n z^n + \end{array} \right. +\] +Possiamo quindi calcolare il prodotto matrice vettore nello stesso modo in cui calcoleremmo i coefficienti del +polinomio prodotto, ovvero con la trasformata discreta di Fourier. + +Avremo quindi un costo delle moltiplicazione $O(n\log(n))$\footnote{utilizzando la \fft.} e quindi +un costo complessivo del metodo del gradiente coniugato di $O(n^2\log(n))$. + +% TODO: Inserire gli esempi delle applicazioni del metodo del gradiente a qualche caso particolare +% di matrici, come ad esempio le matrici elementari e le matrici con nugoli di autovalori appiccicati. + + +\subsection{Matrici di Toeplitz tridiagonali simmetriche} +Vorremmo ora mostrare un'analisi di un caso paricolare, ovvero dei sistemi lineari con +una matrice di Toeplitz simmetrica tridiagonale. \\ +Questo è ad esempio il caso che discretizza il problema differenziale $\triangle u = f$ nel caso di +$u$ in una variabile reale. Le conclusione che otteremo su questo caso particolare ci permetteranno poi +di analizzare anche i casi in più variabili. + +Supponiamo ora di avere una qualsiasi matrice $T$ tridiagonale simmetrica di Toeplitz di dimensione $n$; chiamiamo $a$ gli +elementi sulla diagonale e $b$ quelli sulla sotto e sopradiagonale\footnote{in effetti queste due scelte +individuano completamente la matrice di cui stiamo parlando.}. \\ +Siamo interessati a studiare le proprietà spettrali di questa matrice per poter dare una stima +del suo condizionamento in norma 2, che come abbiamo visto influenza la convergenza del metodo del +gradiente coniugato. + +Osserviamo ceh se $\lambda$ è un autovalore per $T$ allora la matrice $T - \lambda I$ deve essere singolare +e in particolare deve esistere una soluzione non banale del sistema lineare +\[ + (T - \lambda I)x = 0 \iff \left[ \begin{array}{ccccc} + a - \lambda & b & & & \\ + b & a -\lambda & b & & \\ + & \ddots & \ddots & \ddots & \\ + & & b & a - \lambda & b \\ + & & & b & a + \end{array} \right] + \left[ \begin{array}{c} + x_1 \\ + x_2 \\ + \vdots \\ + x_{n-1} \\ + x_n + \end{array} \right] = +\left[ \begin{array}{c} + 0 \\ + 0 \\ + \vdots \\ + 0 \\ + 0 + \end{array} \right] +\] +Preso un qualsiasi $j$ compreso fra $2$ e $n-1$ possiamo scrivere la relazione sopra come +\[ + bx_{j-1} + (a- \lambda)x_j + bx_{j+1} = 0 +\] +Ponendo $x_0 = x_{n+1} = 0$ la relazione vale anche per $j = 1$ e $j=n$. Apparentemente non abbiamo +chiarito molto e trovare una soluzione esplicita sembra complicato. Possiamo però provare a porre +$x_j = x^{j}$, e vedere se riusciamo a trovare una soluzione particolare di questo tipo. Sostituendo +nelle relazioni sopra (per $j$ fra $2$ e $n-1$) si ottiene +\[ + bx^{j-1} + (a- \lambda)x^j + bx^{j+1} = 0 +\] +e ricordando che l'autovettore non può essere nullo e quindi $x^j \neq 0$ per ogni $j$, questa è soddisfatta +se e solo se +\[ + b + (a-\lambda)x + bx^2 = 0 \iff 1 + \frac{a - \lambda}{b} + x^2 = 0 +\] +Passiamo ora ad analizzare il caso che ci interessa, ovvero $a = 2$ e $b = 1$\footnote{ovvero la matrice che discretizza +il problema differenziale di Laplace.}; per il terzo teorema di Gerschgorin sappiamo che $|\lambda - 2| < 2$ e +quindi +\[ + \left| \frac{a - \lambda}{b} \right|< 2 +\] +Possiamo allora porre $\frac{a - \lambda}{b} = -2 \cos\theta$ per $\theta \in (0,\pi)$ e otteniamo l'equazione +\[ + 1 - 2x\cdot\cos \theta + x^2 = 0 +\] +Risolvendola otteniamo +\[ + x_{1,2} = \cos \theta \pm \sqrt{\cos^2\theta - 1} = \cos \theta \pm i \cdot \sin \theta = e^{\pm i \theta} +\] +Abbiamo quindi ottenuto due soluzioni che andrebbe bene per tutte le $j = 2, \ldots, n-1$ ma nessuna delle due +soddisfa le condizione per $j = 0$ e $j = n$. Osserviamo però che una qualsiasi combinazione lineare +$\alpha x_1 + \beta x_2$ soddisfa le condizione interne, e cerchiamo quindi di determinare $\alpha$ e $\beta$ +in modo che anche le condizioni al contorno siano soddisfatte. Si ottiene +\[ + x_0 = 0 = \alpha + \beta +\] +e quindi $\beta = -\alpha$; ponendo poi $j = n+1$ si ottiene +\[ + x_{n+1} = 0 = \alpha e^{i\cdot(n+1) \theta} - \alpha e^{-i \cdot (n+1) \theta} = \alpha( 2 i \sin ((n+1)\theta) ) +\] +e quindi $\theta_k = \frac{k\pi}{n+1}$ con $k = 1, \ldots, n$. Abbiamo trovato quindi $n$ autovettori distinti +e siamo in grado di calcolare i relativi autovalori ricordando che +\[ + \frac{a - \lambda_k}{b} = -2 \cos \theta_k = -2 \cos (\frac{k\pi}{n+1}) \Rightarrow \lambda_k = a + 2b\cos \theta_k +\] +Se costruiamo la matrice degli autovettori +\[ + U = \left[ \begin{array}{c|c|c|c} + \multirow{3}{*}{$x_1$} & \multirow{3}{*}{$x_2$} & \multirow{3}{*}{$\ldots$} & \multirow{3}{*}{$x_n$} \\ + & & & \\ + & & & + \end{array} \right] +\] +possiamo osservare che $\trasp UU = D$ con $D = \gamma I$. Abbiamo quindi che $U$ è quasi unitaria, in particolare +$\frac{1}{\gamma} U$ lo è. Inoltre possiamo osservare che gli elementi di $U$ non dipendono da $a$ e da $b$ e che +$u_{ij} = \sin(\frac{ij\pi}{n+1}) = u_{ji}$ e quindi $U$ è simmetrica. In altre parole abbiamo una decomposizione +spettrale $T = UDU$ dove tutta l'informazione sulla matrice è contenuta nella parte diagonale. + +Osserviamo infine che $D = \diag{a + 2b\cos(\theta_1) , \ldots, a + 2b \cos(\theta_n)}$ e quindi l'autovalore più +piccolo è $a + 2b\cos(\theta_1)$. + diff --git a/capitoli/capitolo5.tex b/capitoli/capitolo5.tex new file mode 100644 index 0000000..2f3a9ec --- /dev/null +++ b/capitoli/capitolo5.tex @@ -0,0 +1,267 @@ +\chapter{Calcolo degli autovalori di matrici strutturate} + +Abbiamo visto nell'analisi dei sistemi lineari vari metodi per utilizzare la struttura +delle matrici per ottimizzare il procedimento e diminuire il costo computazionale. \\ +Questo in generale è più difficile nel calcolo degli autovalori. L'unica struttura che siamo finora +riusciti a sfruttare per abbassare il costo è stata la tridiagonalità. + +\section{Strutture note} +In generale si parla di matrice strutturata quando una matrice è individuata da un numero di +parametri dell'ordine minore di $n^2$. \\ +Ricapitoliamo le strutture principali viste fino ad ora e i relativi vantaggi nella risoluzione +di sistemi lineari. +\begin{description} + \item[Matrici sparse] Parliamo di matrici sparse quando ci sono pochi elementi non nulli, ovvero un numero + con un ordine di grandezza strettamente inferiore a $n^2$. In questo caso riusciamo spesso ad ottimizzare + i metodi di moltiplicazione matrice per vettore e quindi possiamo trarre vantaggio dall'applicazione + di metodi iterativi; + + \item[Van der Monde] Non abbiamo analizzato in dettaglio\footnote{ad eccezione delle matrici di Fourier per il calcolo + della \dft, dove si riesce a scendere ad un costo $O(n\log n)$.} queste matrici ma esiste un metodo (tramite un'opportuna + rappresentazione dell'inversa) per risolvere un sistema lineare con un costo $O(n^2)$. + + \item[Toeplitz o H\"ankel] Abbiamo visto queste matrici nella Sezione~\ref{subsec:toeplitz} e tramite la + trasformata discreta di Fourier abbiamo mostrato che il costo del prodotto matrice vettore è molto basso. + Possiamo quindi ipotizzare di applicare dei metodi iterativi per risolvere il sistema. + + \item[Diagonali con correzione di rango 1] Queste martici sono piuttosto interessanti e sono le prime di + cui ci occuperemo. Sono appunto composte dalla somma di una matrice diagonale $D$ con una matrice di rango $1$ + $u\trasp u$; +\end{description} + +\section{Il metodo di Lanczos} +\subsection{Un'alternativa al metodo di Householder} +Introduciamo ora un metodo alternativo a quello di Householder per la tridiagonalizzazione di una +matrice simmetrica. \\ +Osserviamo che se $A$ è una matrice simmetrica in $\mat{\R}{n}$, allora esiste una matrice $T \in \mat{\R}{n}$ +tridiagonale simmetrica e una matrice unitaria $Q$ tali che +\[ + A = QT\trasp Q +\] +e quindi anche +\[ + AQ = QT +\] +Osserviamo ora solo la prima colonna di quest'uguaglianza, ovvero $AQe_1 = Aq_1 = QTe_1$. Se scriviamo +\[ + T = \left[ \begin{array}{cccc} + \alpha_1 & \beta_1 & & \\ + \beta_1 & \ddots & \ddots & \\ + & \ddots & \ddots & \beta_{n-1} \\ + & & \beta_{n-1} & \alpha_n \\ + \end{array} \right] +\] +Possiamo riscrivere la relazione come $Aq_1 = \alpha_1 q_1 + \beta_1 q_2$ e, una volta scelto $q_1$ vettore +di norma $1$, +si ha che $\trasp q_1 A q_1 = \alpha_1 \trasp q_1 q_1 + \beta_1 \trasp q_1 q_2 = \alpha_1$; possiamo quindi +calcolare $\alpha_1$ da cui possiamo poi ricavare $\beta_1$ considerando che $\beta q_2 = Aq_1 - \alpha_1 q_1$ +e quindi +\[ +\beta_1 = ||Aq_1 - \alpha_1 q_1||_2 \qquad \text{e} \qquad q_2 = \frac{Aq_1 - \alpha_1 q_1}{\beta_1} +\] +Ripetendo il procedimento con la seconda colonna (ora che conosciamo $q_2$) e poi continuando ancora si ottiene +la regola generale +\[ + \alpha_i = \trasp q_i A q_i \qquad \beta_i = ||Aq_i - \alpha_i q_i||_2 \qquad q_{i+1} = \frac{Aq_i - \alpha_i q_i}{\beta_i} +\] +e si può quindi ricostruire tutta la matrice $Q$ e la matrice $T$. + +Il costo computazionale dominante nello svolgimento di queste operazioni è dato dai prodotti matrice vettore +che costano generalmente $O(n^2)$ e portano quindi ad un costo complessivo del metodo di $O(n^3)$ (lo stesso +costo del metodo di Householder). \\ +Questo metodo non viene però generalemente utilizzato per calcolare la tridiagonalizzazione. Il motivo è che +non è numericamente stabile, ed in generale la matrice $Q$ ottenuta non è ortogonale. + +\begin{os} + A questo punto è naturale chiedersi che rapporto esiste fra la matrice calcolata con il metodo di Householder + e quella calcolata con il metodo di Lanczos, al variare del primo vettore $q_1$ scelto all'inizio. La risposta + che è possibile verificare è che scegliendo $q_1 = e_1$ le matrici differiscono per una matrice di fase. +\end{os} + +Nonostante in generale il metodo non venga usato per la sua poca precisione esiste un particolare caso in cui +risulta essere utile, ed è precisamente il seguente + +\subsection{Il quoziente di Rayleigh} +Cominciamo con una definizione +\begin{de} + Si dice \emph{quoziente di Rayleigh di $A$ e $x$} e si indica con $\ray{A}{x}$ lo scalare + \[ + \ray{A}{x} = \frac{\trasp x A x}{\trasp xx} + \] +\end{de} +Si può osservare che il minimo del quoziente di Rayleigh su tutto $\R^n$ corrisponde al modulo dell'autovalore minimo +e il massimo al modulo dell'autovalore massimo. \\ +Osserviamo poi che preso un generico sottospazio $k$-dimensionale $S \subseteq \R^n$ abbiamo che se +\[ + \lambda = \min_{x \in S} \ray{A}{x} +\] +allora $\lambda$ è l'autovalore di modulo minimo su un sottospazio di $\R^n$. Se $S$ è sufficientemente grande +possiamo pensare di usare $\lambda$ come approssimazione di $\lambda_{min}$. \\ +Consideriamo $\{ q_1 , \ldots, q_k \}$ base del sottospazio $S$ e la matrice $Q$ con i vettori $q_i$ come colonne. +Se prendiamo $x \in S$ allora +\[ +x = \sum_{i=1}^{k} \alpha_i q_i +\] +e quindi se $\alpha = (\alpha_1, \ldots, \alpha_k)$ si ha $x = Q\alpha$. +\[ +\frac{\trasp x A x}{\trasp xx} = \frac{\trasp \alpha \trasp Q A Q \alpha}{\trasp \alpha \trasp Q Q \alpha} = + \frac{\trasp \alpha \trasp Q A Q \alpha}{\trasp \alpha \alpha} +\] +In conclusione è sufficiente minimizzare $\ray{\trasp Q A Q}{x}$ su $\R^k$, ed essendo $\trasp Q A Q$ una matrice +$k \times k$ questo procedimento può risultare sensibilmente più economico rispetto all'idea originale. \\ +\begin{de} + Data una matrice $A$ a coefficienti reali\footnote{definiamo il procedimento sui numeri reali solo per non appesantire + la notazione, ma non c'è nessuna restrizione ad usarlo sui complessi.} e $x$ un vettore di $\R^n$. + Si dice \emph{sottospazio di Krylov} di $A$ e $v$ di ordine $j$ e si indica con $\kryl{A}{v}{j}$ il sottospazio + \[ + S = \Span{v, Av, \ldots, A^{j-1}v} + \] +\end{de} +Osserviamo che in generale $\dim{S} \leq j$. \\ +Siamo ora interessati ad utilizzare un sottospazio di Krylov come sottospazio $S$ con cui approssimare il nostro autovalore. +Per farlo però dobbiamo trovare una base ortonormale di $S$; possiamo procedere calcolando la scomposizione \qr\ della +matrice dei vettori che generano: +\[ + \left[ \begin{array}{c|c|c|c} + \multirow{4}{*}{$v$} & \multirow{4}{*}{$Av$} & \multirow{4}{*}{$\ldots$} & \multirow{4}{*}{$A^{j-1}v$} \\ + & & & \\ + & & & \\ + & & & \\ + \end{array} \right] = QR +\] +Si può mostrare che le prime $j$ colonne di $Q$ sono una base dello spazio $S$. Per farlo è sufficiente osservare +che essendo $R$ triangolare superiore e $n \times j$ con $j < n$ deve avere le ultime $n - j$ righe nulle. \\ +Calcolando ora $\trasp Q A Q = (b_{ij})$ si ottiene un matrice $k\times k$ simmetrica. Osserviamo in particolare +che se $i < j+1$ allora $b_{ij} = \trasp q_i A q_j$ e $Aq_j \in \Span{v, Av, \ldots , A^{j-1}v}$ per costruzione. +In particolare $Aq_j$ è ortogonale a $q_i$ e quindi $b_{ij} = 0$. La simmetria della matrice ci permette +di concludere che $B$ è tridiagonale, e si può verificare che è la matrice $k\times k$ generata dal metodo +di Lanczos dopo $k-1$ iterazioni. \\ +A questo punto si può supporre di avere una buona approssimazione dell'autovalore di modulo massimo (anche se +non c'è nessuna garanzia di averla davvero). Questa è di fatto l'unica applicazione del metodo di Lanczos, +data la sua instabilità numerica. + +\section{Matrici con struttura di rango}\label{sec:struttura_di_rango} +\subsection{Qualche esperimento con il metodo \qr} +Abbiamo spesso incontrato durante il corso matrici diagonali con correzioni di rango 1, +ovvero della forma $D + u\trasp u$. Queste +sono molto interessanti perché si ritrovano in molti problemi computazionali e perché sono inverse +di matrici tridiagonali. \\ +Ci domandiamo ora se esiste un metodo efficiente per applicare il Metodo~\qr\ a queste matrici. +Sappiamo di poterle tridiagonalizzare con matrici di Householder con un costo computazionale $O(n^2)$, ma +vogliamo provare ad applicare il \qr\ alla matrice piena senza dover necessariamente passare +per il procedimento di tridiagonalizzazione\footnote{Abbiamo fatto notare nella Sezione~\ref{subsec:qr_costo} che +in generale non è conveniente applicare il metodo ad una matrice piena; cercheremo però di trovare +qualche via più breve per questa particolare classe di matrici.}. \\ +Possiamo osservare sperimentalmente che facendo qualche passo del metodo \qr\ (anche utilizzando lo shift) +la struttura non viene completamente persa. + +Indichiamo con $\alpha_k$ il rango massimo delle sottomatrici quadrate strettamente contenute nella parte +inferiore della matrice della $k$-esima iterazione del \qr, e con $\beta_k$, analogamente, il rango massimo +di quelle superiori. + +\textbf{Esperimento 1}: Supponiamo di scegliere una matrice qualsiasi (complessa) e di applicare +il metodo. Osserveremo che $\alpha_0 = \alpha_1 = \ldots = \alpha_k = 1$ +mentre $\beta_k$ cresce. + +\textbf{Esperimento 2}: Supponiamo ora di restringere la scelta ad una matrice con $D$ reale, ovvero +$A = D + u\trasp u$ dove $D = \diag{\gamma_1, \ldots, \gamma_n}$ e i $\gamma_i$ sono tutti reali. Allora +otterremo sperimentalmente $\alpha_i = 1$ e $\beta_i = 3$ per ogni $i \geq 2$. + +\textbf{Esperimento 3}: Analogamente a prima scegliamo $D$ complessa ma con elementi di modulo $1$\footnote{ovvero +quella che abbiamo chiamato \emph{matrice di fase}.}. Otterremo ancora una volta $\alpha_i = 1$ e $\beta_i = 3 \: +\forall i \geq 2$. + +Come mai i $\beta_k$ in questi ultimi due casi non crescono più di $3$? Cerchiamo di rispondere analizzando separatamente +i vari casi. + +\subsection{Conservazione del rango nella parte triangolare inferiore} +Ricordiamo dall'Osservazione~\ref{os:qr_simili_ak} che le matrici $A_k$ generate dal metodo \qr\ sono +simili per trasformazione ortogonale. Se assumiamo che $R_k$ sia invertibile possiamo anche mostrare +qualcosa di più +\[ + A_{k+1} = R_k Q_k + \alpha_k I = R_k Q_k R_k R_k^{-1} + \alpha_k R_k R_k^{-1} = R_k A_k R_k^{-1} +\] +e quindi $A_{k+1}$ è simile ad $A_k$ tramite una trasformazione con una matrice triangolare superiore +$R_k$. Questo ci assicura che nella parte inferiore della matrice $A_{k+1}$ il rango venga conservato +(nel senso degli $\alpha_k = 1$). + +%% TODO: Spiegare perché il rango si conserva, da fare quando anche io lo avrò capito. + +\subsection{Limitazione del rango nella parte triangolare superiore} +Ci occuperemo ora di spiegare perché il rango di tutte le sottomatrici strettamente contenute nella +parte triangolare superiore è limitato superiormente da $3$, sia nel caso in cui $D$ sia una matrice +reale, sia in quello in cui sia una matrice di fase. Consideriamo il primo e osserviamo cosa succede +al primo passo del metodo. Poniamo $A_0 = D + u\trasp v$; si ha che: +\[ + A_1 = \herm{Q_1} A_0 Q_1 = \herm{Q_1}(D+ u\trasp v)Q_1 = \herm{Q_1} DQ_1 + u_1\trasp{v_1} +\] +Ricordando che $D$ è reale si può concludere che $\herm{Q_1}DQ_1$ è hermitiana e diagonale; +possiamo quindi scrivere il $k$-esimo passo del metodo in questo modo +\[ + A_{k+1} = H_{k+1} + u_{k+1}\trasp v_{k+1} +\] +dove $H_{k+1}$ è una matrice hermitiana. In particolare si ha $H_{k+1} = A_{k+1} - u_{k+1}\trasp v_{k+1}$. +Da quanto visto prima sappiamo che il rango nella parte inferiore di $H_{k}$ non può superare $2$. +Ricordando che $H_k$ è hermitiana si può concludere che il rango è al massimo $2$ nella parte superiore. +Osservando nuovamente che $A_k = H_k + u_k\trasp v_k$ si ottiene che il rango di $A_k$ nella parte superiore +non può superare $3$ e si ha quindi la tesi. + +La stessa cosa si può mostrare che quando la matrice diagonale $D$ è una matrice di fase. Ci sono due +procedure possibile per effettuare la dimostrazione; una è scrivere $D = QR$ ed osservare che data +l'hermitianità di $D$ si ottiene che $R$ deve forzatamente essere una matrice di fase. Questa via +richiede però tediosi passaggi molto contosi che quindi non svolgeremo. Un'alternativa più elegante +è utilizzare il \emph{Nullity theorem}, dimostrato attorno al 1960. Questo però non fa parte del +programma del corso e quindi non seguiremo neanche questa via. + +\subsection{Metodo \qr\ per il calcolo delle radici dei polinomi} +Il motivo principale (e storicamente il primo) per cui ci si è interessati a queste matrici +è stato la ricerca delle radici dei polinomi tramite l'uso delle matrici Companion. \\ +Le matrici Companion hanno una struttura come la seguente: +\[ +F = \left[ \begin{array}{cccc} + 0 & \cdots & \cdots & \times \\ + 1 & \ddots & & \vdots \\ + &\ddots & 0 & \times \\ + & & 1 & \times + \end{array} \right] +\] +La matrice $F$ si può scrivere come una matrice unitaria più una correzione di rango $1$ nel seguente modo +\[ +F = Q + u\trasp e_n = \left[ \begin{array}{cccc} + 0 & & & 1 \\ + 1 & \ddots & & \\ + & \ddots & \ddots & \\ + & & 1 & 0 \\ + \end{array} \right] ++ \left[ \begin{array}{cccc} + \: &\: &\: & v_1 \\ + & & & \vdots \\ + & & & \vdots \\ + & & & v_n \\ + \end{array} \right] +\] +e quindi sarebbe conveniente poter applicare delle ottimizzazioni al \qr\ sfruttando le osservazioni fatte +sul rango delle matrici contenute nella parte inferiore e superiore della matrice che viene iterata. + +Supponendo di voler determinare le radici del polinomio $p(x) = p_0 + p_1x + \ldots + p_nx^n$ si ottiene +la matrice +\[ +F = \left[ \begin{array}{cccc} + 0 & \cdots & \cdots & \frac{-p_0}{p_n}\\ + 1 & \ddots & & \vdots \\ + &\ddots & 0 & \vdots \\ + & & 1 & \frac{p_{n-1}}{p_n} + \end{array} \right] +\] +In generale, affrontando il problema della ricerca degli autovalori, usiamo il teorema di Bauer-Fike (Teorema~\ref{te:BauerFike}) +per assicurarci di ottenere il risultato con una buona approssimazione. Questo però non è sempre sufficiente +se $p_n$ è piccolo, perché la norma della matrice può crescere arbitrariamente. Come affrontare questo problema? + +Una soluzione può essere evitare di ricondursi ad un problema agli autovalori analizzando il seguente \emph{problema +generalizzato agli autovalori}\footnote{In generale si dice \emph{problema generalizzato agli autovalori} un problema +del tipo $\deter{A - \lambda B} = 0$. Se $B$ è invertibile questo può sempre essere ricondotto a trovare gli +autovalori di $B^{-1}A$, ma non sempre è conveniente. }: +\[ + \deter{F - \lambda I} = 0 \iff \deter{p_n F - \lambda( I + p_n e_n\trasp e_n)} = 0 +\] +Parleremo dei possibili metodi per analizzare questo problema nel Capitolo~\ref{cap:autovalori_generalizzato}. \ No newline at end of file diff --git a/capitoli/capitolo6.tex b/capitoli/capitolo6.tex new file mode 100644 index 0000000..fa796d7 --- /dev/null +++ b/capitoli/capitolo6.tex @@ -0,0 +1,32 @@ +\chapter{Problema generalizzato agli autovalori} \label{cap:autovalori_generalizzato} +Vorremmo in questo capitolo analizzare\footnote{in realtà ci accontenteremo di dare uno sguardo +al problema, perché non avremo tempo per approfondirlo veramente.} il problema generalizzato +agli autovalori. In altre parole, date due matrici $A$ e $B$ vogliamo trovare i possibili +$\lambda$ tali che +\[ + \deter{ A - \lambda B} = 0 +\] + +\section{Il caso delle matrici Companion} +Ispirati dal problema visto alla fine della Sezione~\ref{sec:struttura_di_rango} analizziamo +il problema nel caso con $A$ in forma di Hessenberg e $B$ triangolare superiore. \\ +Per cercare di non peggiorare il condizionamento del problema sarebbe preferibile lavorare +unicamente con trasformazioni unitarie. Cerchiamo di generare una sequenza di matrici +$A_k$ e $B_k$ tali che +\[ + \deter{A - \lambda B} = 0 \iff \deter{A_k - \lambda B_k} = 0 \quad \forall k \in \N +\] +Nel nostro caso vogliamo anche mantenere le proprietà di struttura della matrice, ovvero +vorremmo che $A_k$ sia sempre in forma di Hessenberg e che $B_k$ sia sempre in forma +triangolare superiore. Cerchiamo delle matrici unitarie $U_k$ e $Q_k$ in modo da definire +la seguente successione +\[ + \left\{\begin{array}{lcl} + A_{k+1} &=& U_kA_kQ_k \\ + B_{k+1} &=& U_kB_kQ_k + \end{array} \right. +\] +e scegliendo opportunamente le matrici in modo che $A_k$ e $B_k$ siano rispettivamente +Hessenberg e triangolare superiore. \\ +Se queste condizioni sono soddisfatte allora $A_k - \lambda B_k$ è singolare solo se +$a_{jj}^{(k)} - \lambda b_{jj}^{(k)} = 0$ per qualche $j$, ovvero solo se $\lambda = \frac{a_{jj}^{(k)}}{b_{jj}^{(k)}}$ diff --git a/capitolo1.tex b/capitolo1.tex deleted file mode 100644 index 55c8be3..0000000 --- a/capitolo1.tex +++ /dev/null @@ -1,687 +0,0 @@ -\chapter{Il polinomio caratteristico} -In questo capitolo ci occuperemo di descrivere le forme normali tipicamente usate per -calcolare agevolmente gli autovalori di una matrice. Descriveremo dei metodi efficienti -per valutare in un punto il polinomio caratteristico, che potranno essere usati -nei capitolo seguenti per implementare gli algoritmi di calcolo effettivo. \\ -Premetteremo a questo una breve esposizione degli utilizzi pratici più comuni dei -metodi che verranno in seguito esposti. - -\section{Esempi pratici di utilizzo} -Prima di cominciare ad analizzare in dettaglio l'argomento presentiamo due applicazioni pratiche -(che poi verranno analizzate in maggior dettaglio) che richiederanno la determinazione mediante -metodi numerici degli autovalori di una matrice associata al problema. - -\subsection{Risoluzione di equazioni algebriche} -\label{subsec:esempi:eqalgebriche} -Un problema comune è, data un'equazione algebrica della forma -\[ - p(z) = p_0 + p_{1}z + \ldots + p_{n}z^{n} = 0 -\] -trovare la $n$ radici $z_1 , \ldots , z_n$ tali che $p(z_i) = 0 \ \forall i = 1\ldots n$. - -Risolvere questo problema tramite algoritmi di iterazione funzionale, come vedremo, potrebbe non essere -conveniente, e quindi ci si riconduce spesso (quasi sempre) ad un problema di calcolo di autovalori tramite -il seguente procedimento. \\ -Consideriamo la matrice -\[ - F = \begin{bmatrix} - 0 & 0 & \ldots & -\frac{p_0}{p_n} \\ - 1 & 0 & & -\frac{p_1}{p_n} \\ - 0 & \ddots & \ddots & \vdots \\ - 0 & \hdots & 1 & -\frac{p_{n-1}}{p_n} \\ - \end{bmatrix} -\] -detta matrice di \emph{Frobenius}\index{Frobenius, matrice di} o matrice \emph{Companion} \index{Companion, matrice}. Questa -ha come polinomio caratteristico esattamente $p(z)$ e quindi i suoi autovalori sono esattamente le radici dello stesso. \\ -Osserveremo inoltre che sarà possibile mostrare la stabilità all'indietro del procedimento per calcolare -gli autovalori, ovvero potremo essere sicuri che gli autovalori calcolati mediante l'aritmetica approssimata -di macchina saranno le radici di un polinomio i cui coefficienti ``disteranno poco'' da quelli originali di $p(z)$. -Questo in generale non ci assicura di avere un risultato con una buona approssimazione; più precisamente questo sarà -garantito solo nel caso in cui il problema sia ben condizionato\footnote{Ricordiamo che un problema è ben condizionato -quando a piccole variazioni dei dati iniziali corrispondono piccole variazioni dei dati finali.}. - -\subsection{Equazioni differenziali} -Un altro caso in cui il calcolo di autovalori ci permetterà di risolvere un problema comune sarà quello delle -equazioni differenziali. Non abbiamo ancora gli strumenti per approfondire questo argomento, ma possiamo anticipare -che i metodi per il calcolo di autovalori ci permetteranno sia di arrivare alla soluzione (in qualche caso) che -di stimare l'effetto di una perturbazione dei dati iniziali (in altri casi). - -\section{Analisi del condizionamento} \label{sec:analisidelcondizionamento} -In questa sezione vorremmo analizzare il condizionamento del nostro problema. Il calcolo degli autovalori non -è sempre un problema ben condizionato, come possiamo mostrare con questo esempio: \\ -Sia $F$ la matrice di Frobenius associata al polinomio $z^n$, ovvero la matrice con soli zeri ad eccezione della -sottodiagonale, composta da soli $1$. \\ -I suoi autovalori sono tutti $0$ ed hanno moleplicità algebrica $n$ e molteplicità geometrica $1$\footnote{il che si -capisce facilmente notando che la matrice $F$ è in forma di Jordan}. \\ -Se noi perturbiamo la matrice sottraendole la matrice $\eps e_1 \trasp{e_n}$ otteniamo la matrice di Frobenius -associata al polinoio $z^n + \eps$. Da quanto abbiamo osservato nella Sezione~\ref{subsec:esempi:eqalgebriche} sappiamo che -gli autovalori di quest'ultima sono le radici $n$-esime dell'unità moltiplicate per $||\eps||^{\frac{1}{n}}$; -possiamo osservare che al crescere di $n$ anche se $\eps$ è piccolo questo numero può diventare piuttosto grande, e -portare quindi ad errori non trascurabili. -\subsection{Il caso di una matrice diagonalizzabile} -Cominciamo ad analizzare un caso relativamente semplice, ovvero quello dove $A$ è una matrice diagonalizzabile, -per cui dimostreremo un risultato detto -\begin{te}[di Bauer - Fike] \label{te:BauerFike} - Se $A \in \mat{\R}{n}$ è una matrice diagonalizzabile tramite il cambio di base $V^{-1}$ ed $\eta$ è - un autovalore della matrice perturbata $A + \delta A$ allora esiste un autovalore $\lambda$ di $A$ tale che - \[ - ||\lambda - \eta|| \leq ||\delta A || \cdot \cond{V} - \] -\end{te} -\begin{proof} -Sappiamo che esiste $V$ base di autovettori tali che -\[ - A = VDV^{-1} \; \textrm{con} \ D \ \textrm{diagonale} -\] -Supponiamo ora di aver calcolato $\eta$ autovettore di una matrice $A + \delta A$ e verifichiamo -quanto dista $\eta$ dagli autovettori di $A$.\\ -Osserviamo che questo equivale a -\[ - (A + \delta A) y = \eta y \ \iff \ (A - \eta y) = \delta A y -\] -Possiamo distinguere due casi: -\begin{description} - \item[$(A-\eta I)$ è singolare] Questo è il caso migliore in cui possiamo sperare, in quanto questo significa - che $\eta$ è un autovalore di $A$ e quindi la distanza è $0$. - \item[$(A-\eta I)$ non è singolare] ed allora ammette un'inversa. Abbiamo quindi che - \[ - y = -(A - \eta I)^{-1}( \delta A y ) - \] - Consideriamo dunque una norma matriciale indotta tale che data una matrice $D$ diagonale si abbia - $||D|| = \max_{i = 1 \ldots n}\{|d_{ii}|\}$\footnote{la norma $1$, $2$ e $\infty$ soddisfano questo - requisito, ad esempio; questo tipo di norma è detta \emph{assoluta}.} ed effettuiamo le seguenti maggiorazioni - \[ - ||y|| \leq ||(A -\eta I)^{-1}|| \cdot || \delta A || \cdot ||y|| - \] - che si verifica solo se (ricordando che essendo $y$ un autovettore - $y \neq 0$ e quindi $||y|| \neq 0$) - \[ - 1 \leq ||V|| \cdot ||( D -\eta I)^{-1}|| \cdot ||V^{-1}|| \cdot || \delta A || - \leq \frac{\cond{V} \cdot ||\delta A ||}{\min_{i = 1 \ldots n}\{ \lambda_i - \eta\}} - \] - da cui si ottiene che esiste un $j \in 1 \ldots n$ tale che - \[ - ||\lambda_j - \eta|| \leq ||\delta A || \cdot \cond{V} - \] -\end{description} - \`E evidente quindi che in entrambi i casi è valida la diseguaglianza della tesi (nel primo caso si ha addirittura - che $||\lambda - \eta|| = 0$), e quindi il teorema è provato. -\end{proof} - -\begin{os} - Dobbiamo fare attenzione al fatto che questa maggiorazione ottenuta dal precedente teorema è in valore - assoluto, e quindi non ci dice nulla sull'errore relativo. Saremo certi di ottenere un buon - condizionamento solo nel caso in cui gli autovalori trovati non siano troppo ``piccoli''. -\end{os} - -Data questa maggiorazione dell'errore ci possiamo chiedere come fare a minimizzare l'unico fattore -su cui possiamo avere un ``controllo'', ovvero $\cond{V}$. Dalle proprietà delle norme matriciali -indotte sappiamo che $\forall V \ \cond{V} \geq 1$. \\ -Inoltre possiamo osservare che se $V$ è una matrice unitaria allora $\cond{V}$ vale esattamente $1$. \\ -Sembra quindi opportuno, quando possibile, cercare di rendere diagonale la matrice $A$ tramite un cambio -di base unitario. Quando è possibile farlo? \\ -Grazie alla forma normale di Schur possiamo dare una caratterizzazione completa delle matrici per cui questo -è possibile. Si può infatti provare che data $A \in \mat{\C}{n}$ questa è diagonalizzabile mediante -matrici unitarie se e solo se $A$ è normale, ovvero $A\herm{A} = \herm{A}A$. - -\begin{os} - Ci ricordiamo che per risolvere i sistemi lineari abbiamo individuato due classi di metodi: - \begin{description} - \item[I metodi diretti] i quali forniscono una soluzione ``esatta'' del problema in un numero - finito di passi, a meno dell'errore di macchina e algoritmico. - \item[I metodi iterativi] i quali invece forniscono una soluzione approssimata del sistema, - iterando un numero finito di passi di una successione che converge solamente dopo un numero - infinito. - \end{description} -Nel caso della ricerca degli autovalori la prima classe di metodi non può essere applicata, in quanto -il problema è equivalente a trovare le radici del polinomio caratteristico, problema che \emph{non può -essere risolto tramite una formula}. -\end{os} - -Siamo quindi consci che la nostra unica opportunità per arrivare alla soluzione sarà eseguire una -successione di cambi di base (che sono degli invarianti del problema) che porti la matrice in una forma -in cui gli autovalori siano facilmente determinabili. \\ -Il condizionamento del problema sarà quindi maggiorabile con il prodotto dei condizionamenti di tutti i -cambi di base (si può infatti mostrare che prese due matrici $V$, $S$ si ha $\cond{VS}\leq\cond{V}\cdot\cond{S}$) -e quindi dovremo -cercare dei cambi di base con un piccolo condizionamento (come, ad esempio, quelli unitari). - -Il teorema di Bauer--Fike ci permette di dare una maggiorazione globale sul condizionamento degli autovalori, -ma in alcuni casi è possibile dare anche una maggiorazione del condizionamento per un autovalore singolo. \\ -Consideriamo ad esempio il caso di un autovalore con molteplicità algebrica e geometrica $1$. - -\begin{pr} - Data una matrice $A \in \mat{\C}{n}$, una matrice di perturbazione $\eps F$, un autovalore - $\lambda \in \spe{A}$ ed $\eta$ un autovalore della matrice perturbata $A + \eps F$ si ha che, - dati $y, w$ autovettori destro e sinistro di modulo $1$ relativi a $\lambda$ - \[ - ||\eta - \lambda|| \leq \frac{1}{\herm{w}y} \cdot ||\eps F|| - \] -\end{pr} -\begin{proof} - Sappiamo che $\eta$ e il suo autovettore relativo\footnote{che evidentemente non è unico, ma possiamo supporre - di sceglierlo in modo continuo} $y$ sono funzioni analitiche di $\eps$ e quindi - possiamo scrivere - \[ \left\{\begin{array}{l} - \eta(\eps) = \lambda + \eps \cdot \xi + O(\eps^2) \\ - y(\eps) = y + \eps \cdot w + O(\eps^2) \\ - \end{array}\right. - \] -Effettuando un'analisi al I ordine otteniamo -\begin{align*} - (A + \eps F) ( y + \eps w) & = (\lambda + \eps \xi)(y + \eps w) \\ - Ay + \eps A w + \eps Fy & = \lambda y + \lambda \eps w + \eps \xi y \\ -\end{align*} -considerando che $Ay = \lambda y$ e dividendo tutto per $\eps$ si ottiene -\[ - Aw + Fy = \lambda w + \xi y -\] -Sappiamo inoltre che deve esistere $u$ autovettore sinistro unitario di $A$ relativo all'autovalore -$\lambda$ e quindi, moltiplicando tutto per $u$ -\begin{align*} - \herm{u}Aw + Fy & = \lambda \herm{u} w + \xi \herm{w} y \\ - Fy & = \xi \herm{u} y -\end{align*} -Ricordando infine che, a meno di termini di ordine maggiore di $1$, $||\eps \xi|| = ||\lambda - \eta||$ e -che $||u|| = ||y|| = 1$ si ottiene -\[ - ||\lambda - \eta|| = ||\eps \xi|| \leq || \eps F|| \cdot \frac{1}{\herm{u}y} -\] -che è la tesi. -\end{proof} - -%% 1 ottobre 2009 -\section{Operazioni preliminari} -In questa sezione vorremmo introdurre delle operazioni preliminari da compiere prima di applicare -un qualsiasi metodo per il calcolo effettivo degli autovalori. \\ -\subsection{Matrici di Householder} -I metodi che solitamente vengono usati accettano infatti in input solo matrici particolari, più -precisamente -\begin{description} - \item[Matrici hermitiane tridiagonali] Ovvero delle matrici hermitiane tali che $a_{ij} = 0$ se - $| i -j | \geq 2$ e tale che $a_{ij} = \con{a_{ji}} \ \forall i,j \in 1 \ldots n$. - \item[Matrici in forma di Hessenberg superiore] Ovvero le matrici tali che $a_{ij} = 0$ se $i > j +1$. -\end{description} - -\begin{figure}[h] -\begin{center} - \subfigure{ -$ T = - \begin{bmatrix} - \alpha_1 & \con{\beta_1} & 0 & 0 \\ - \beta_1 & \ddots & \ddots & 0 \\ - 0 & \ddots & \ddots & \con{\beta_{n-1}} \\ - 0 & 0 & \beta_{n-1} & \alpha_n \\ - \end{bmatrix}$ -} -\subfigure{ -$ H = -\begin{bmatrix} - \times & \hdots & \hdots & \times \\ - \times & \ddots & & \vdots \\ - 0 & \ddots & \ddots & \vdots \\ - 0 & 0 & \times & \times \\ -\end{bmatrix}$ -} -\end{center} - \caption{Struttura delle matrici tridiagonali e di Hessenberg superiore} -\end{figure} - -Abbiamo quindi la necessità di trovare un algoritmo efficiente e stabile per trasformare -una generica matrice $A$ in una matrice $T$ o $H$ rispettivamente tridiagonale o in forma -di Hessenberg superiore. \\ -Per quanto osservato nella Sezione~\ref{sec:analisidelcondizionamento} cercheremo una $Q$ unitaria -tale che -\[ - QA\herm{Q} = T \qquad \textrm{oppure} \qquad QA\herm{Q} = H -\] -Si osserva subito che sia $Q$ che $T$ sono unitarie e quindi una condizione necessaria per il verificarsi -della prima eventualità è che anche $A$ sia hermitiana\footnote{in quanto la stiamo trasformando per congruenza, -che conserva l'hermitianità} - -\begin{de}[Matrici di Householder] - Una matrice $P$ si dice \emph{matrice elementare di Householder} se esistono $\sigma \in \R \setminus \{0\}$ - e $u \in \R^n$ tali che $P = I - \sigma u \herm{u}$ e $\sigma = \frac{2}{||u||_2}$. -\end{de} - -Sia $P$ una matrice di Householder. Allora valgono le seguenti: -\begin{description} - \item[$P$ è Hermitiana] Se abbiamo $P = I -\sigma u \herm{u}$ allora $p_{ij} = u_i\con{u_j}$, e quindi - $\con{p_{ji}} = \con{u_j\con{u_i}} = u_i\con{u_j} = p_{ij}$. - \item[$P$ è unitaria] Se consideriamo che $P$ è hermitiana abbiamo che $P\herm{P} = P^2 = - (I - \sigma u \herm{u})^2 = I -2\sigma u \herm u + \sigma^2 \herm u u u \herm u = I$. - \item[$\deter{P} = -1$] Consideriamo una base dello spazio ottenuta imponendo come primo - vettore $u$ e costruendo gli altri ortogonali a lui. Si osserva facilmente che la matrice - associata a $P$ diventa come la matrice identità ad eccezione del posto $(1,1)$ dove si trova - un $-1$ (infatti $Pu = -u$) e quindi $\det{P} = -1$. -\end{description} - -Consideriamo ora una generica matrice $A$ e mostriamo che esiste una matrice unitaria $P$ tale che -$PA\herm{P}$ ha tutti gli elementi delle prima colonna con indice maggiore di $1$ uguali a $0$. -Questo sarà il passaggio che poi ci permetterà di mostrare per induzione che si può portare una -qualsiasi matrice in forma di Hessenberg superiore. \\ -Data la seguente matrice generica $A$ -\[ - A = \left[ \begin{array}{c|cc} - a_{11} & \multicolumn{2}{|c}{\herm{w}} \\ - \hline - \multirow{2}{*}{$v$} & \sblocke{\; \hat{A}\;}{2} \\ - & & - \end{array} \right] -\] -So che esiste una matrice $\hat P$ di Householder tale che $\hat{P}v = \beta e_1$ da cui si ottiene che -\[ - P = \left[ \begin{array}{c|cc} - 1 & \multicolumn{2}{c}{\herm{0}} \\ - \hline - \multirow{2}{*}{$0$} & \sblocke{ \quad \hat P \quad}{2} \\ - & & - \end{array} \right] -\qquad - PA\herm{P} = \left[ \begin{array}{c|cc} - a_{11} & \multicolumn{2}{|c}{\herm{w} \herm{\hat{P}}} \\ -\hline - \multirow{2}{*}{$\hat Pv$} & \sblocke{\hat P \hat A \herm{\hat{P}}}{2} \\ - & & - \end{array} \right] -\] -Ricordando che $\hat{P}v = \beta e_1$ si ottiene che in $n-2$ passi la matrice di partenza si può ridurre -in forma di Hessenberg superiore. \\ -Si può osservare che se la matrice di partenza era hermitiana anche la matrice ridotta lo sarà, -dato che la trasformazione per matrici di Householder è unitaria, e quindi la matrice ottenuta -sarà tridiagonale. - -\subsection{Valutazione del costo computazionale} -Il costo computazionale di ogni passo del procedimento sopra descritto è dato da -\begin{enumerate} - \item Calcolo di $\hat P$; - \item Calcolo di $\herm{w} \hat{P}$ (qualora sia necessario, cioè quando $A$ non è - hermitiana); - \item Calcolo di $\hat{P}\hat{A}\herm{\hat{P}}$; -\end{enumerate} -I primi due sono $O(n)$ mentre il terzo è il più grande, $O(n^2)$. Il procedimento completo -risulta quindi con un costo computazionale di $O(n^3)$. - -\subsection{I vantaggi della riducibilità} -Data la matrice in forma tridiagonale o in forma di Hessenberg superiore è facile verificare che -la condizione di riducibilità è verificata solo se $\exists i \: \beta_i = 0$ dove i $\beta_i$ sono -gli elementi della sottodiagonale. Non è però vero il contrario, ovvero se i $\beta_i$ sono tutti -diversi da $0$ non è certo che la matrice sia irriducibile\footnote{questa implicazione vale solo -nel caso hermitiano tridiagonale}. D'ora in poi diremo che la matrice è \emph{non riducibile} -se tutti i $\beta_i$ non sono $0$, mentre useremo il termine \emph{irriducibile} per -indicare la condizione usuale di irriducibilità. \\ -La riducibilità porta notevoli vantaggi computazionali alla risoluzione del problema in quanto -si ottiene una matrice del tipo -\[ - M = \left[ \begin{array}{c|c} - A & B \\ - \hline - 0 & C \\ - \end{array} \right] -\] -e quindi è immediato verificare che gli autovalori di $M$ sono quelli di $A$ uniti a quelli di $C$. - -\begin{pr} - Sia $A$ una matrice tridiagonale hermitiana irriducibile. Allora tutti i suoi autovalori hanno molteplicità $1$. -\end{pr} -\begin{proof} - Sia $\lambda$ un autovalore di $A$. Sappiamo che $A - \lambda I$ non è un isomorfismo, e che la molteplicità - geometrica di $\lambda$ è pari al rango di $A - \lambda I$. - Se consideriamo il minore di sud-ovest $J$ possiamo osservare che: - \begin{itemize} - \item $J$ è triangolare superiore - \item la diagonale $J$ è composta dagli elementi $\beta_1 \ldots \beta_n$ della sottodiagonale di $A$ - \end{itemize} -Queste due osservazioni ci permettono di concludere che $\deter{A - \lambda I} = \prod_{i=0}^{n}~\beta_i$ che -è diverso da $0$, e quindi la molteplicità geometrica di $\lambda$ è $1$. Sapendo che la matrice è -hermitiana possiamo anche essere sicuri che sia diagonalizzabile, e quindi che per ogni autovalore -la molteplicità geometrica coincida con quella algebrica. In particolare l'autovalore $\lambda$ ha -molteplicità $1$. -\end{proof} - -Osserviamo che se la matrice invece che essere tridiagonale hermitiana è in forma di Hessenberg superiore, -possiamo solo affermare che ogni autovalore ha molteplicità gemetrica $1$. Non possiamo però controllare -la molteplicità algebrica e quindi non possiamo essere certi della diagonalizzabilità della matrice. - -\section{Il polinomio caratteristico} -Il primo metodo che si può pensare di applicare cercando gli autovalori di una data matrice $A$ è -quello di cercare gli zeri del polinomio caratteristico. Nonostante questo sia raramente applicabile, -alcune analisi sulla ``struttura'' del polinomio potranno fornirci dei risultati teorici che ci saranno -utili in seguito. - -\subsection{Il caso delle matrici Hermitiane tridiagonali} \label{subsec:hermdiag} -Consideriamo una matrice $A \in \mat{\C}{n}$ in forma tridiagonale hermitiana. -In tutta la sezione indicheremo con -\begin{description} - \item[$A_k$: ] Il minore di nord-ovest di ordine $k$ della matrice $A$. Osserviamo in particolare - che si tratta ancora di una matrice hermitiana tridiagonale per ogni $k$. - \item[$p_k(z)$: ] Il polinomio caratteristico delle matrice $A_k$, ed in particolare $p_n = p$; - \item[$\lambda_i^{(k)}$: ] L'$i$-esimo autovalore della matrice $A_{k}$. L'ordinamento non ha importanza - dove non è espressamente specificato; -\end{description} -Se proviamo a calcolare il polinomio caratteristico di $A_k$ sviluppando sull'ultima riga (o, analogamente, -sull'ultima colonna) otteniamo la seguente relazione ricorrente e tre termini: -\[ -p_k(z) = \deter{A - zI} = (\alpha_k - z) p_{k-1}(z) - |\beta_{k-1}|^2 p_{k-2}(z) -\] -Questa relazione ha senso anche nel caso $k = 1, 2$ a patto di porre $p_{0}(z) = 1$ e $p_{-1}(z) = 0$. -Una volta nota questa relazione valutare il polinomio caratteristico di $A = A_n$ in un punto diventa molto -meno oneroso (computazionalmente) rispetto al calcolare tutti i coefficienti. \\ -Si può infatti stimare la complessità del calcolo $p_k(z)$ a partire da $p_{k-1}(z)$ e $p_{k-2}(z)$ -con circa $5$ operazioni aritmetiche, e quindi -la valutazione del polinomio in un qualsiasi punto $z$ risulta costare $O(n)$. -\begin{os} \label{os:autovalpol} - Dalla formula possiamo dedurre che se $\xi$ è un autovalore della matrice $A_k$ allora non può essere - anche autovalore della matrice $A_{k-1}$. -\end{os} -Supponiamo per assurdo che $p_{k-1}(\xi) = 0 = p_k(\xi)$. Dunque si avrebbe -$p_k(\xi) = 0 = (\alpha_k - \xi) p_{k-1}(\xi) - |\beta_{k-1}|^2 p_{k-2}(\xi) = |\beta_{k-1}|^2 p_{k-2}(\xi)$ -e quindi anche $p_{k-2}(\xi)$ deve essere nullo. Ripetendo questa considerazione si ottiene che anche $p_0(\xi)$ -deve essere nullo, ma $p_0(\xi) = 1$ (il polinomio costante) che è assurdo. -In definitiva per ogni $k \neq j$ si ha che $\spe{A_k} \cap \spe{A_j} = \emptyset$. - -\subsection{L'equazione secolare} \label{sec:eqsecolare} -Una domanda che sorge spontanea dopo queste considerazioni è: ``Che relazione possiamo trovare -fra gli autovalori di due minori $A_k$ e $A_{k-1}$ di una matrice $A$?''. \\ -Il polinomio come scritto nella sezione precedente ci permette solamente di notare che -gli autovalori sono distinti. Possiamo però estrapolare delle informazioni più dettagliate rappresentandolo -in una opportuna base (di polinomi). -Per questo paragrafo possiamo limitarci, per semplicità di notazione, al caso di una matrice simmetrica -in $\mat{\R}{n}$, anche se il caso complesso si tratta con gli stessi passaggi. -Dividiamo la matrice $A$ in blocchi nel modo seguente -\[ - A= \left[ \begin{array}{cc|c} - \sblocko{A_{n-1}}{2} & \\ - & & \beta_{n-1} \\ \hline - & \beta_{n-1} & \alpha - \end{array} - \right] -\] -Dato che la matrice $A_{n-1}$ è simmetrica esiste una matrice ortogonale $Q_{n-1}$ tale che -$D_{n-1} = Q_{n-1}A\trasp{Q_{n-1}}$ dove $D$ è la matrice con gli autovalori di $A$ sulla -diagonale. \\ -Consideriamo dunque la matrice $\hat Q$ così composta: -\[ - \hat Q = \left[ -\begin{array}{cc|c} - \sblocko{Q_{n-1}}{2} & \\ - & & \\ \hline - & & 1 -\end{array} \right] -\] -$\hat Q$ è sempre ortogonale e si verifica che -\[ - \left[ \begin{array}{cc|c} - \sblocko{Q_{n-1}}{2} & \\ - & & \\ \hline - & & 1 - \end{array} \right] - \left[ \begin{array}{cc|c} - \sblocko{A_{n-1}}{2} & \\ - & & \beta_{n-1}\\ \hline - & \beta_{n-1} & \alpha_{n} \\ - \end{array} \right] - \left[ \begin{array}{cc|c} - \sblocko{\trasp{Q_{n-1}}}{2} & \\ - & & \\ \hline - & & 1 - \end{array} \right] -= -\left[ \begin{array}{cc|c} - \sblocko{D_{n-1}}{2} & \multirow{2}{*}{$w$} \\ - & & \\ \hline - \multicolumn{2}{c|}{\trasp{w}} & 1 - \end{array} \right] = B_n -\] -Una matrice come $B_n$, ovvero una diagonale ``orlata'' sull'ultima riga e sull'ultima -colonna si dice \emph{matrice a freccia}\footnote{Penso che il motivo sia piuttosto -evidente guardando la forma degli elementi non nulli}. -Dato che questa trasformazione viene realizzata tramite matrici ortogonali anche il -polinomio caratteristico rimane invariato e quindi si ha che -\[ - p_n(z) = \deter{B_n - zI} -\] -Ricordiamo ora un risultato di Analisi Numerica -\begin{pr} - Sia $M$ una matrice a blocchi come la seguente - \[ - M = \left[ \begin{array}{c|c} - A & B \\ \hline - C & D \\ - \end{array} \right] - \] -dove $A$ e $D$ sono matrici quadrate. Allora Esiste una matrice $\Gamma$ delle stesse dimensioni di $D$ -tale che -\[ - M = \left[ \begin{array}{c|c} - I & 0 \\ \hline - \times & I - \end{array} \right] - \left[ \begin{array}{c|c} - A & 0 \\ \hline - 0 & \Gamma - \end{array} \right] -\left[ \begin{array}{c|c} - I & \times \\ \hline - 0 & I - \end{array} \right] -\] -ed in particolare $\Gamma = D - C A^{-1} B$ è detta \emph{complemento di Schur di $A$ in $M$}. -\end{pr} -\begin{proof} - Provando a scrivere la relazione più esplicitamente otteniamo -\[ - \begin{bmatrix} - I & 0 \\ - \trasp{\alpha} & I - \end{bmatrix} - \begin{bmatrix} - A & 0 \\ - 0 & \Gamma - \end{bmatrix} - \begin{bmatrix} - I & \beta \\ - 0 & I - \end{bmatrix} = - \begin{bmatrix} - A & B \\ - C & D - \end{bmatrix} -\] -dove $\trasp \alpha$, $\beta$ e $\Gamma$ sono le incognite. Sviluppando si ottengono le seguenti equazioni -\[ - \left\{ - \begin{array}{l} - A \beta = B \\ - \trasp \alpha A = C \\ - \trasp \alpha A \beta + \Gamma = D - \end{array} \right. -\] -Ricordando che $\deter{A} \neq 0$ e considerando le prime due equazioni come degli insiemi di -sistemi lineari si ottiene che esistono e sono unici $\alpha$ e $\beta$ che soddisfano le richieste, ed -in particolare sono -\[ -\left\{ \begin{array}{l} - \trasp \alpha = C A^{-1} \\ - \beta = A^{-1} B -\end{array} \right. -\] -In conclusione $\Gamma = D - \trasp \alpha A \beta = D - C A^{-1} A A^{-1} B = D - C A^{-1} B$ -e quindi la tesi è provata. -\end{proof} -\begin{os} - Questa proposizione ci è utile perché ci permette di calcolare il determinante di una matrice di questo -tipo calcolando semplicemente il prodotto del determinante di $A$ per quello di $\Gamma$. -\end{os} -Osserviamo prima di tutto che la matrice $B_n - zI$, per $z$ fissato, è in questa forma. Possiamo -scrivere -\[ - B_n - zI = \left[ \begin{array}{ccc|c} - \lambda_1^{(n-1)} - z & & & \multirow{3}{*}{$w$} \\ - & \ddots & & \\ - & & \lambda_{n-1}^{(n-1)} -z& \\ \hline - \multicolumn{3}{c|}{\trasp{w}} & \alpha_n -z - \end{array} \right] = -\left[ \begin{array}{cc|c} - \sblocko{E_{n-1}}{2} & \multirow{2}{*}{$w$} \\ - & & \\ \hline - \multicolumn{2}{c|}{\trasp{w}} & \alpha_n -z - \end{array} \right] -\] -dove $E_{n-1}$ ed $[ \alpha_n -z ]$ sono quadrate\footnote{la seconda in particolare è -semplicemente uno scalare}. -Calcoliamo dunque il polinomio caratteristico della matrice (in tutti i punti dove $E_{n-1}$ è -invertibile, ovvero in tutti gli $z$ che sono diversi dagli autovalori di $A_{n-1}$) -$B_n$ -\[ -p_n(z)=\deter{B_n - zI}=\deter{A} (\alpha_n - z - \trasp{w}E_{n-1}^{-1}w) -\] -E quindi possiamo scrivere -\[ - p_n(z) = \Bigg[ \prod_{j=1}^{n-1} (\lambda_j^{(n-1)} - z) \Bigg] \cdot - \Bigg[ \alpha_n - z - \sum_{i=1}^{n} \frac{w_i^2}{\lambda_i^{(n-1)} - z}\Bigg] -\] -e per continuità possiamo estenderlo a tutto $\C$, ottenendo -\[ - p_n(z) = (\alpha_n - z)\cdot \prod_{j=1}^{n-1} (\lambda_j^{(n-1)} - z) - \sum_{i=1}^{n}w_i^2\prod_{\substack{i=1\\j\neq i}}^{n}(\lambda_i^{(n-1)}-z) -\] -\begin{os} - Nel definire il polinomio siamo stati costretti ad escludere una quantità finita di punti (precisamente - gli autovalori di $A_{n-1}$), ma è evidente che - due funzioni polinomiali su $\C$ o su $\R$ che sono uguali a meno di una quantità finita di punti devono coincidere. -\end{os} -Questa forma del polinomio ci permette di valutarlo negli autovalori $\lambda_i^{(n-1)}$ della matrice -$A_{n-1}$. Otteniamo la seguente -\[ - p_n( \lambda_i^{(n-1)} ) = 0 - w_i^2\prod_{\substack{i=1\\i\neq j}}^{n} (\lambda_i^{(n-1)} - z) \neq 0 -\] -e quindi, in particolare, per ogni $i$ si ottiene $w_i \neq 0$. -Siamo ora interessati a cercare le radici del polinomio, sfruttando le informazioni che supponiamo -di avere sugli autovalori della matrice di ordine $n-1$. \\ -Consideriamo che $\forall j=1 \ldots n-1 \quad p(\lambda_j^{(n-1)}) \neq 0$, per quanto visto nell'~Osservazione~\ref{os:autovalpol}, -e quindi le radici del polinomio sono le radici della funzione -\[ - g(\xi) = \alpha_n - \xi- \sum_{j=1}^{n} \frac{w_i^2}{\lambda_j^{(n-1)} - \xi} -\] -Questa equazione ($g(\xi) = 0$) è detta \emph{equazione secolare}. Le ragione del nome curioso non -sono note, anche se esistono due teorie principali. Una sostiene che l'appellativo deriva dall'usanza -diffusa nei primi del novecento di chiamare \emph{polinomio secolare} il polinomio caratteristico -di una matrice, mentre l'altra sostiene che invece il nome sia dovuto ad una sua utilità -in alcune teorie di descrizione del moto di pianeti (che tipicamente hanno tempi piuttosto lunghi). \\ -Ricordando che annullare $g$ è la stessa cosa che annullare $p_n$ possiamo tracciare un grafico -qualitativo di $g$ (come si vede in Figura~\ref{fig:eqsecolare}) e notare che ad ogni asintoto verticale -di $g$ corrisponde un autovalore di $A_{n-1}$ e che gli autovalori della matrice $A_n$ sono separati -da quelli di $g$, in quanto la derivata di $g$ è sempre negativa (e quindi la funzione monotona). -\begin{figure}[ht] - \begin{center} - \begin{tikzpicture} -\fill[blue!8] (-6.5,-3.5) rectangle (5.5,2.5); - %% Disegnamo gli assi -\begin{scope}[very thin] - \draw[->] (-6,0) -- (5,0) node[anchor=north] {$\xi$}; - \draw[->] (-0.5,-3) -- (-0.5,2) node[anchor=east] {$g(\xi)$}; -\end{scope} - \begin{scope}[thick] - %% Prima curva - \draw (-6,2) .. controls (-5,1.75) and (-4.2,0.5) .. (-4,0); - \draw (-4,0) .. controls (-3.8,-0.5) and (-3.5,-2) .. (-3.5,-3); - - %% Seconda curva - \draw (-3.2,2) .. controls (-3.2,1.5) and (-2,1) .. (-1,0); - \draw (-1,0) .. controls (0,-1) and (0.5,-2) .. (0.55,-3); - - %% Terza curva - \draw (1,2) .. controls (1,1) and (1.5,0.5) .. (2,0); - \draw (2,0) .. controls (2.5,-0.5) and (4,-2) .. (5,-3); -\end{scope} - %% Asintoti (che corrispondono agli autovalori) -\begin{scope}[blue] - \draw (-3.4,-3) -- (-3.4,0) node[anchor=south west] {$\lambda_1$} -- (-3.4,2); - \draw (0.8,-3) -- (0.8,0) node[anchor=south east] {$\lambda_2$} -- (0.8,2); -\end{scope} - \end{tikzpicture} -\end{center} - \caption{Un grafico qualitativo di una possibile equazione secolare di una matrice con due autovalori} -\label{fig:eqsecolare} -\end{figure} - -Ovviamente queste considerazioni valgono in $\R$, e hanno senso dal momento che -gli autovalori della matrice hermitiana devono essere reali. La stessa richiesta potrebbe addirittura -non avere senso per una matrice in forma di Hessenberg che, a priori, potrebbe avere autovalori complessi. -\subsection{Metodi di iterazione funzionale per il calcolo degli autovalori} -Questa conoscenza di $g$ ci porterebbe a pensare di utilizzare metodi di iterazione funzionale -per determinare gli autovalori della nostra matrice. \\ -Se consideriamo il caso Hermitiano, infatti, potremmo applicare il metodo di \emph{bisezione}. -L'unica difficoltà in questo caso sta nel definire l'intervallo in cui sta una ed una sola radice -per poter cominciare l'iterazione. Notiamo però che presi gli autovalori di $A_{n-1}$ in modo -che $\lambda_i^{(n-1)} < \lambda_j^{(n-1)} -\iff i < j$ si ha che ogni autovalore di $A$ sta fra $\lambda_i$ ed un $\lambda_{i+1}$, ad eccezione degli -autovalori estremali. Anche in quel caso è facile trovare dei limiti su cui applicare la bisezione, considerando -la diseguaglianza di Hirsch: $|\lambda| \leq ||A||$ (dalla definizione di norma matriciale). -\begin{os} - Tutto questo procedimento ci fornirebbe un metodo per calcolare gli autovalori di $A$ a patto di conoscere - quelli di $A_{n-1}$, e quindi il problema non sembra (per ora) semplificato di molto. Prossimamente il teorema - di Sturm ci fornirà uno strumento per completare queste considerazioni, arrivando ad un risultato più pratico. -\end{os} -Infine si potrebbe pensare di applicare anche altri metodi di iterazione funzionale noti, come ad esempio -il metodo delle tangenti; purtroppo quest'ultimo non ci può dare (in questo caso) nessuna garanzia di convergenza, -e quindi non sembra adatto allo scopo. In realtà viene usato nella pratica per ``affinare'' stime di autovalori -forniti con altri metodi. \\ -\subsection{Il polinomio caratteristico delle matrici di Hessenberg} -Tutte le proprietà che siamo riusciti a trovare sulle matrici Hermitiane tridiagonali non valgono -purtroppo per le matrici di Hessenberg. Nonostante questo possiamo però mostrare un metodo -per valutare il polinomio caratteristico in un punto particolarmente vantaggioso dal punto -di vista computazionale\footnote{Non quanto quello trovato per le matrici Hermitiane tridiagonali, purtroppo}. -Cominciamo col fare alcune considerazioni; possiamo supporre che la nostra matrice sia nella forma -\[ - H = \left[ \begin{array}{cccc} - \times & \cdots & \cdots & \times \\ - \beta_{1} & \ddots & & \vdots \\ - & \ddots & \ddots & \vdots \\ - & & \beta_{n-1} & \times - \end{array} \right] -\] -con $\beta_i \neq 0$ per ogni $i$ (altrimenti sarebbe riducibile, e quindi potremmo ridurci a risolvere -dei sottoproblemi con delle Hessenberg irriducibili). \\ -Fissato $z$, consideriamo il sistema lineare $(H - zI)x = \alpha e_1$. Se consideriamo $x$ e $\alpha$ -come incognite e poniamo $x_n = 1$ ci accorgiamo che possiamo risolvere il sistema facilmente con -una sostituzione all'indietro partendo dal fondo, e determinare $x$ e $\alpha$ con complessità $O(n^2)$. \\ -Applicando poi la regola di Cramer all'ultima componente di $x$ e chiamando $H'$ la matrice di Hessenberg -a cui è stata sostituita l'ultima colonna con il vettore $x$ otteniamo -\[ - 1 = x_n = \frac{\deter{H'}}{\deter{H-zI}} = \frac{(-1)^{n+1}\alpha \prod_{i=1}^{n-1} \beta_i}{p(z)} -\] -e quindi $p(z) = (-1)^{n+1}\alpha \prod_{i=1}^{n-1} \beta_i$; osserviamo che in questa espressione -$\alpha$ è in realtà funzione di $z$ e quindi sarebbe più corretto scrivere -\[ -p(z) = (-1)^{n+1}\alpha(z) \prod_{i=1}^{n-1} \beta_i -\] -Considerando che $\alpha$ può venir calcolata partendo da $z$ con complessità $O(n^2)$ abbiamo determinato -un metodo relativamente poco oneroso di calcolare il polinomio caratteristico di $H$ in un punto. \\ -Possiamo quindi considerare ora la possibilità di applicare dei metodi di iterazione funzionale. -\begin{os} - Per applicare, ad esempio, il metodo delle tangenti, avremmo bisogno di calcolare la derivata di $p(z)$. - Possiamo fare anche questo con poco sforzo, a patto di calcolare la derivata di $a(z)$. \\ - Osserviamo che derivando la relazione di partenza si ottiene - \[ - (H - zI)x'(z) = \alpha'(z)e_1 + x(z) - \] -da cui si può ottenere $\alpha'(z)$ differenziando tutte le operazioni aritmetiche che portano ad ottenere -$x(z)$. Una volta effettuato questo si avrà -\[ - p'(z) = (-1)^{n+1}\alpha'(z) \prod_{i=1}^{n-1} \beta_i -\] -\end{os} - -Possiamo osservare che i metodi di iterazione funzionale non sono particolarmente convenienti per determinare -gli autovalori, anche se si utilizzano di fatto per qualche richiesta ``specifica''.\\ -Nel caso, ad esempio, di una matrice hermitiana tridiagonale, si può osservare che nel calcolo degli autovalori -estremali le condizioni di convergenza del metodo di Newton sono soddisfatte e quindi possiamo ottenere -la soluzione con poche operazioni aritmetiche osservando che sia $p$ che $p'$ si possono calcolare -con poco sforzo dalle loro relazioni ricorrenti a tre termini (viste nella Sezione~\ref{subsec:hermdiag}). - -\begin{os} - Consideriamo $p_n(x)$ polinomio caratteristico; possiamo osservare facilmente che se $x \to -\infty$ allora - $p_n(x) \to \infty$. In generale, infatti, la parte principale del polinomio è $(-1)^{n} z^n$, che va all'infinito - sia nel caso $n$ pari sia nel caso $n$ dispari. -\end{os} diff --git a/capitolo2.tex b/capitolo2.tex deleted file mode 100644 index 7e88f99..0000000 --- a/capitolo2.tex +++ /dev/null @@ -1,656 +0,0 @@ -\chapter{Il calcolo degli autovalori} - -In questo capitolo ci occuperemo di presentare i metodi principalmente usati nel calcolo -effettivo degli autovalori di matrici Hermitiane tridiagonali e in forma di Hessenberg. - -\section{Il metodo di Sturm} -Introdurremo ora un metodo efficiente per il calcolo di singoli autovalori di una matrice -hermitiana in forma tridiagonale. Per tutta la sezione tratteremo il caso di una matrice -reale per semplicità, ma il caso complesso è risolubile in modo analogo. - -Abbiamo visto nella Sezione~\ref{sec:eqsecolare} un metodo efficiente per valutare il polinomio -caratteristico di una matrice di questo tipo con costo $O(n)$. Possiamo affinare la nostra osservazione -notando che anche la valutazione di tutti i polinomi $p_k$ in un punto $x$ fissato continua -ad avere un costo $O(n)$. \\ -Consideriamo, data una matrice $T_n$ in forma tridiagonale hermitiana, la seguente funzione -\[ -\begin{array}{cccl} - f: & \R & \longto & \{ 0 , \ldots , n \} \\ - & x & \longmapsto & \sharp \{ \ \textrm{cambi di segno nel vettore} \ (p_0(x) , \ldots , p_n(x)) \ \} -\end{array} -\] -Perché $f$ sia ben definita conveniamo che se $p_j(x) = 0$ allora il suo segno è lo stesso di $p_{j-1}(x)$. -Questa è una buona definizione perché $p_0(x) = 1$ e quindi non è mai $0$. -\begin{os} - Dalla definizione di $f$ si deduce che se il suo valore di cambia in un punto, allora in quel punto ci deve - essere uno zero di (almeno) uno dei polinomi $p_j(x)$. -\end{os} -Osserviamo cosa succede quando un polinomio ``interno'', ovvero un $p_j$ con $j \in 1 \ldots n-1$ ha uno -zero in $\bar x$. -Innanzitutto sappiamo da quanto visto nel capitolo precedente che $p_{j-1}(x) \neq 0 \neq p_{j+1}(x)$; è -possibile però affinare questa affermazione osservando meglio la relazione ricorrente a tre termini: -\[ - p_{j+1}(x) = (\alpha_{j+1} - x) p_j(x) - \beta_j^2 p_{j-1}(x) -\] -Se $p_j(x) = 0$ si ottiene che $p_{j-1}(x) \cdot p_{j+1}(x) < 0$, e quindi anche in un intorno di $\bar x$. -Ricordando le definizione di $f$ si osserva che il segno di $p_j(x)$ è quindi indifferente ai fini del numero -di cambiamenti di segno. In particolare $f$ non cambia segno in $\bar x$. -Evidentemente $p_0(x)$ non può cambiare segno, quindi ci rimane da verificare cosa succede quando cambia segno -$p_n(x)$. \\ -Ricordiamo alcune particolarità dei polinomi $p_n$ viste precedentemente -\begin{enumerate}[(i)] - \item Ogni $p_j$ ha limite a $-\infty$ uguale a $+\infty$; - \item Gli zeri di $p_{j-1}$ separano gli zeri di $p_j$, nel senso visto alla fine del precedente capitolo - (Sezione~\ref{sec:eqsecolare}); - \item Tutti gli zeri di un polinomio di una matrice hermitiana tridiagonale sono semplici; -\end{enumerate} -Osserviamo quindi che per ogni radice di $p_n$ si ha che il segno della sua derivata e quello di $p_{n-1}$ sono -opposti. La condizione di semplicità sugli zeri ci assicura che la derivata sarà infatti diversa da $0$ in -$\bar x$ e quindi $p_n'(\bar x) p_{n-1}(\bar x) < 0$. In particolare la costanza locale del segno della derivata -intorno allo $0$ ci assicura anche la costanza di quello di $p_{j-1}$ e quindi il \emph{cambio di valore di $f$}. -In sintesi $f$ agisce come una sorta di ``contatore di zeri''. Dato infatti un qualsiasi intervallo $[a,b]$ si verifica, -usando le considerazioni precedenti che -\[ - f(b) - f(a) = \sharp \{ \ \text{zeri del polinomio caratteristico in } [a,b) \ \} -\] - -Possiamo dunque applicare questa considerazione per applicare il metodo di bisezione per calcolare -uno specifico autovalore di $T_n$. Queste proprietà di $f$ ci permettono di calcolare infatti singolarmente -l'$i$-esimo autovalore di $T_n$ (ordinati con l'ordinamento di $\R$) senza bisogno di calcolare tutti gli altri. -Ricordando la diseguaglianza di Hirsch ($||\lambda|| \leq ||T_n||$) e supponendo di aver fissato $i$ possiamo -applicare il seguente procedimento. - -Cominciamo col calcolare $f(0)$; il suo valore ci dirà quanti autovalori ci sono prima dello $0$, e quindi -nell'intervallo $[-||T_n||, 0)$. Se il nostro autovalore sta lì (ovvero $i \leq f(0)$) allora calcoliamo -$f(-\frac{||T_n||}{2})$ e ripetiamo il procedimento; in caso contrario procediamo analogamente con $f(\frac{||T_n||}{2})$. \\ -Iterando un numero sufficiente di volte questo procedimento otterremo alla fine il valore desiderato. - -Osserviamo che il procedimento può essere applicato a ad una qualsiasi matrice hermitiana, a patto -di portarla in forma tridiagonale (che è sempre possibile tramite matrici unitarie). -Ricordando le stime dei costi computazionali fatte in precedenza ci rendiamo conto che il costo principale è -quello della riduzione ($O(n^3)$) rispetto a quello del calcolo dell'autovalore ($O(n^2)$). -Se si volessero calcolare tutti gli autovalori il costo rimarrebbe ancora dell'ordine di $n^3$. Nonostante questo -esistono metodi (che vedremo in seguito) che permettono di calcolare tutti gli autovalori con una complessità di -$O(n^2)$ e che quindi saranno più interessanti per il calcolo dello spettro completo della matrice. \\ -Il metodo di Sturm, comunque, trova delle applicazioni anche in questo ultimo caso nell'ambito del calcolo parallelo, -dove altri algoritmi non possono essere implementati. Si può osservare invece che, una volta ottenuta la fattorizzazione, -non sia difficile implementare il metodo di Sturm dividendo fra i vari processori gli autovalori da calcolare. - -\section{Il metodo QR} -In questa sezione esporremo il metodo QR per il calcolo degli autovalori, che è il metodo più utilizzato -nelle moderne applicazioni del calcolo degli autovalori. Si basa sulla fattorizzazione QR già vista nel corso -di Analisi Numerica per la risoluzione di sistemi lineari. Questa può venire realizzata tramite matrici -di Householder. Cominceremo ricordando alcuni risultati riguardo la fattorizzazione, per poi esporre ed -analizzare il metodo e le sue implementazioni. - -\subsection{La fattorizzazione QR} -\'E noto che ogni matrice $A \in \mat{\C}{n}$ si può fattorizzare nel seguente modo -\[ - A = QR -\] -dove $Q$ è una matrice unitaria e $R$ è una matrice triangolare superiore. -\begin{os} - La fattorizzazione non è unica. Se supponiamo $A = QR$ e $S$ una matrice di fase, ovvero diagonale tale che $|s_{ii}|=1$ -per ogni $i = 1 \ldots n$, allora $A = QS\herm{S}R$ è ancora un fattorizzazione. Se $S \neq I$ le fattorizzazioni sono -diverse. Si può però mostrare che non ci sono altre matrici (non di fase) per cui questo è vero. Si dice che -la fattorizzazione QR è \emph{essenzialmente unica}. -\end{os} -Il nostro scopo è costruire una successione di matrici tramite questo procedimento di fattorizzazione -che ci porti a determinare gli autovalori. - -\subsection{Costruzione della successione} -Data una matrice $A$ di cui vogliamo conoscere gli autovalori, consideriamo -la successione definita nel seguente modo -\[ -\left\{ \begin{array}{ll} - A_0 & = A \\ - A_{k+1} & = R_k Q_k \quad \text{dove} \ Q_k R_k \ \text{è la fattorizzazione QR di} \ A_k -\end{array} \right. -\] -\begin{os} \label{os:qr_simili_ak} - Osserviamo che per ogni $k$ $A_{k+1}$ è simile ad $A_k$. Infatti $A_{k+1} = \herm{Q_k}Q_k R_k Q_k$. - Per ogni $k$ la matrice $A_k$ è simile a $A_{k+1}$ tramite trasformazione unitaria, che preserva - il condizionamento del problema di calcolo degli autovalori. Questa quindi è una ``buona'' successione - nel senso in cui ne avevamo parlato nella Sezione~\ref{sec:analisidelcondizionamento}. -\end{os} - -Cominceremo ad analizzare il metodo QR facendo delle supposizioni piuttosto restrittive, che poi allenteremo -in seguito. Cominciamo col supporre che gli autovalori della matrice $A$ siano tutti distinti e ordinabili -per modulo in modo strettamente crescente, ovvero $|\lambda_1| < \ldots < |\lambda_n|$. Questo in -particolare implica che la matrice $A$ è diagonalizzabile e quindi esiste una $X$ invertibile tale che -$A = XDX^{-1}$. Supponiamo ora che $X^{-1}$ ammetta fattorizzazione $ X^{-1} = LU$\footnote{dove supponiamo -che $L$ sia triangolare inferiore con gli elementi delle diagonale uguali a $1$ e $U$ triangolare superiore}. -\begin{pr} \label{pr:metpot:ak} - Se si ha la successione di matrici $A_k$ come quella definita sopra, e per ogni $k$ si considera $Q_k R_k$ - la\footnote{al solito, sarebbe corretto dire \textbf{una} fattorizzazione} fattorizzazione QR di $A_k$, allora - \[ - A^k = Q_0 Q_1 \ldots Q_k R_k \ldots R_1 R_0 - \] -\end{pr} -\begin{proof} - Proviamo la tesi per induzione su $k$. Se $k = 0$ si ha $A_0 = A = Q_0 R_0$ che è banalmente vero. Se considero - la tesi vera per $k$. Considerando le seguenti uguaglianze - \[ \begin{array}{ll} - \displaystyle - A^{k+1} = \prod_{i=1}^{k+1} Q_0 R_0 = Q_0 (\prod_{i=1}^{k} R_0 Q_0) R_0 = Q_0 (\prod_{i=1}^{k} A_1) R_0 = \\ - \displaystyle - = Q_0 (\prod_{i=1}^{k} Q_1 R_1) R_0 = Q_0 \prod_{i=1}^{k} Q_i \prod_{i=1}^{k} R_{k-i+1} R_0 - \end{array} - \] - si ottiene esattamente la tesi. Per quanto oscure possano sembrare provare a fare il calcolo con $k = 3$ o $4$ - potrebbe chiarire molto le idee. -\end{proof} -Ora vorremmo usare quanto scoperto sulle potenze di $A$ per studiare la convergenza del nostro metodo. Consideriamo -che $A^k = X D^{k} X^{-1}$ e quindi ricordando che esiste la fattorizzazione $LU$ di $X^{-1}$ si ha -\begin{equation} -A^k = XD^{k}LU= X D^k LD^{-k}D^k U -\end{equation} -Osserviamo ora che la matrice $D^k L D^{-k}$ è triangolare inferiore ed ha la diagonale con soli $1$. Se chiamiamo -$X = QR$ la fattorizzazione QR di $X$ possiamo scrivere -\begin{equation} \label{eq:metpot:1} - A^k = X[I + \Gamma^{(k)}]D^k U = QR [ I + \Gamma^{(k)}] D^k U = Q[I + R\Gamma^{(k)}R^{-1}]RD^k U -\end{equation} -A questo punto consideriamo anche che per ogni $k$ esiste la fattorizzazione QR di $[I + R\Gamma^{(k)}R^{-1}] = P_k T_k$ -ed in particolare possiamo scegliere $P_k$ a termini positivi. Osserviamo ora che i termini di $\Gamma^{(k)}$ -sono dati dalla seguente relazione -\[ -\gamma_{ij} = - \left\{ \begin{array}{ll} - 0 & \text{se} \ i \leq j \\ - (\frac{\lambda_j}{\lambda_i})^{k} l_{ij} & \text{se} \ i > j - \end{array} \right. -\] -ed in particolare ricordando che se $j < i$ si ha che $\lambda_j < \lambda_i$ si ottiene che la matrice $\Gamma^{(k)}$ -tende ad una matrice diagonale per $k$ che tende all'infinito. Più precisamente, $\lim_{k \to \infty} \Gamma^{(k)} = I$. -Da questo si ottiene che $P_k \to I$ e anche $T_k \to I$\footnote{questo non sarebbe vero a priori, in quanto la scomposizione -QR è sempre definita a meno di una matrice di fase. Richiedere però che $P_k$ abbia elementi positivi ci permette -sia di definire univocamente la scomposizione desiderata sia di avere l'esistenza del limite.} -Confrontando l'equazione~\ref{eq:metpot:1} e la Proposizione~\ref{pr:metpot:ak} si ottengono due fattorizzazioni -QR della matrice $A^k$. -\[ - A^k = QP_k T_k R D^k U = Q_0 \ldots Q_k R_k \ldots R_0 -\] -Due fattorizzazioni QR della stessa matrice devono forzatamente differire per una matrice di fase e quindi -si ottengono le due relazioni -\[ - \left\{ \begin{array}{l} - Q_0 \ldots Q_k = Q P_k S_k \\ - R_{k} \ldots R_0 = \herm{S_k}T_k R D^k U - \end{array} \right. -\] -Possiamo riscrivere ora $Q_k$ ed $R_k$ in modo da riuscire ad utilizzare queste relazioni\footnote{Si può -osservare quanto i passaggi di questa dimostrazione siano la cosa meno intuitiva pensabile (o quasi). Presumibilmente -questa è risultato di anni di affinamento e di ``pulizia'' } -\[ - \left\{ \begin{array}{l} - Q_k = \herm{(Q_0 \ldots Q_{k-1})}(Q_0 \ldots Q_k) = \herm{S_{k-1}}\herm{P_{k-1}}\herm{Q}Q P_k S_k = - \herm{S_{k-1}}\herm{P_{k-1}}P_k S_k\\ - R_k = (R_k \ldots R_0)(R_{k-1} \ldots R_0)^{-1} = \herm{S_k}T_k R D^{k} U U^{-1} D^{-k+1} R^{-1} T_{k-1}^{-1} S_{k-1} - \end{array} \right. -\] -Dunque $Q_k R_k = A^{k} = \herm{S_{k-1}}\herm{P_{k-1}}P_k T_k R D R^{-1} T_{k-1}^{-1} S_{k-1}$ e ricordando che -$T_k$ e $P_k$ al limite vanno all'identità se scriviamo la nostra uguaglianza per $k~\to~\infty$ otteniamo -$S_{k-1} A^k \herm{S_{k-1}} = R D R^{-1}$. Possiamo quindi osservare che gli elementi sulla diagonale di $RDR^{-1}$ -sono gli stessi di $D$ (grazie al fatto che $R$ è triangolare superiore). In particolare gli elementi diagonali -sono gli autovalori di $A$ e quindi abbiamo provato che il metodo converge. -\begin{os} - In realtà non è rilevante conoscere esplicitamente $S_k$ perché siamo interessati solo a conoscere gli elementi - sulla diagonale di $RDR^{-1}$. Avendo che gli elementi di $S_k$ sono di modulo $1$ gli elementi diagonali vengono - moltiplicati per un numero complesso e per il suo coniugato, lasciandoli invariati. -\end{os} - -\subsection{Il costo computazionale} \label{subsec:qr_costo} -Vorremmo ora valutare il costo computazionale di questo metodo. Consideriamo dapprima il caso di una matrice -generale. Sappiamo che il costo di una fattorizzazione $QR$ è $O(n^3)$ e sperimentalmente si ottiene che il -numero di passi per avere convergenza cresce linearmente con la dimensione. Questo ci permette di concludere -che in un caso totalmente generale il costo computazionale del metodo QR è $O(n^4)$. - -Facciamo ora qualche supposizione sulla matrice. Prendiamo ad esempio una matrice tridiagonale hermitiana. -In questo caso ci ricordiamo che il costo del calcolo della fattorizzazione QR (almeno della prima) è $O(n)$. -Possiamo osservare che la matrice ottenuta dopo il primo passo è ancora tridiagonale hermitiana, e quindi -le considerazioni fatte sul primo passo valgono anche per i seguenti. In particolare il costo del metodo -è $O(n^2)$. - -Analogamente per le matrici di Hessenberg (anche se non lo mostriamo ora) il costo è di $O(n^3)$ perché -il calcolo della scomposizione QR è $O(n^2)$. - -\subsection{Migliorare la convergenza} -Il metodo QR come esposto fino ad ora funziona ma ha il difetto di avere una convergenza di tipo -lineare. In generale questo può essere un problema perché più gli autovalori della matrice sono -vicini più, potenzialmente, potrebbe essere lenta (o addirittura assente) la convergenza. - -Possiamo osservare meglio questo con un esempio; consideriamo una matrice $2\times 2$ con un -elemento ``piccolo'' in posizione $(2,1)$, ovvero sulla buona strada per essere triangolarizzata\footnote{% -Ovviamente tutta questa frase è terribilmente imprecisa, ma il nostro scopo è, per ora, solo dare -un'idea dei vantaggi che si potrebbero ottenere da un nuovo approccia e non formalizzarlo in -alcun modo}. -Proviamo a vedere cosa succede effettuando un passo generico dell'iterazione. Consideriamo la matrice $A_k$ -con un elemento piccolo $\eps$ sotto la diagonale e una sua scomposizione QR -\[ - A_k = \left[ \begin{array}{cc} - a & b \\ - \eps & c \\ - \end{array}\right] - = \left[ \begin{array}{cc} - \frac{a}{\sqrt{a^2 + \eps^2}} & \frac{-\eps}{\sqrt{a^2+\eps^2}} \\ - \frac{\eps}{\sqrt{a^2+\eps^2}} & \frac{a}{\sqrt{a^2 + \eps^2}} - \end{array} \right] - \left[ \begin{array}{cc} - \sqrt{a^2 + \eps^2} & \frac{ab + \eps c}{\sqrt{a^2 + \eps^2}} \\ - 0 & \frac{ac - \eps b}{\sqrt{a^2+\eps^2}} - \end{array} \right] = Q_kR_k -\] -Si avrà che -\[ - A_{k+1} = R_kQ_k = \left[ \begin{array}{cc} - \sqrt{a^2 + \eps^2} & \frac{ab + \eps c}{{a^2 + \eps^2}} \\ - 0 & \frac{ac - \eps b}{{a^2+\eps^2}} - \end{array} \right] - \left[ \begin{array}{cc} - \frac{a}{\sqrt{a^2 + \eps^2}} & \frac{-\eps}{\sqrt{a^2+\eps^2}} \\ - \frac{\eps}{\sqrt{a^2+\eps^2}} & \frac{a}{\sqrt{a^2 + \eps^2}} - \end{array} \right] -= \left[ \begin{array}{cc} - \times & \times \\ - \frac{\eps(ac - \eps b)}{a^2 + \eps^2} & \times - \end{array} \right] -\] -Considerando che $ac -\eps b$ è il determinante delle matrice (e quindi -il prodotto degli autovalori) e $a^2 + \eps^2$ una buona -approssimazione del quadrato di un autovalore\footnote{questo perché il vettore $e_1$ va a finire in se stesso moltiplicato -per $a$, a meno di epsilon che è piccolo}, $\eps$ è stato diminuito di un fattore dell'ordine -di $\frac{\lambda_1}{\lambda_2}$, come ci si aspettava. - -Consideriamo ora cosa succede applicando una tecnica di \emph{shifting}. Calcoliamo la fattorizzazione QR della -matrice $A-cI$, invertiamo l'ordine dei fattori e risommiamo $cI$. -Abbiamo dunque -\[ - A_k - cI = \hat Q \hat R \quad \longrightarrow \quad A_{k+1} = \hat R \hat Q + cI -\] -\begin{os} - $A_k$ ed $A_{k+1}$ sono simili. Consideriamo infatti le seguenti uguaglianze - \[ - A_{k+1} = \hat R \hat Q + cI = \herm{\hat Q}\hat Q \hat R \hat Q + cI = \herm{\hat Q} (A_k - cI) \hat Q + cI - = \herm{\hat Q} A_k \hat Q - \] - E quindi le due matrici sono simili per trasformazione hermitiana, il che preserva anche il condizionamento del - problema come visto nella Sezione~\ref{sec:analisidelcondizionamento}. -\end{os} - -Possiamo osservare che risvolgendo i conti con il ``nuovo'' algoritmo si ottiene in posizione sottodiagonale -un fattore dell'ordine di $\eps^2$. Sembra quindi che questo nuovo metodo abbia una convergenza molto più veloce -del precedente! - -Anche se questo esempio ci fornisce solo delle osservazioni in un caso particolare e non una -dimostrazioni formale delle proprietà di convergenza che si potrebbero ottenere in generale -con uno shifting, possiamo in ogni caso discutere come applicarlo. Esistono teoremi che provano -l'effettiva efficienza di questo approccio ma sono piuttosto tecnici e ``conterecci'' (cit.) e -non li affronteremo in questo corso. -\begin{figure}[hb] -\[ - A_k = \left[ \begin{array}{cccc} - \alpha_{11}^{(k)} & \times & \hdots & \times \\ - \beta_{1}^k & \ddots & & \vdots \\ - & \ddots & \ddots& \times \\ - & & \beta_{n-1}^k & \alpha_{nn}^{(k)} - \end{array} \right] -\] -\caption{Struttura di una matrice in forma di Hessenberg superiore} -\label{fig:hessenbergsup} -\end{figure} -Appurato che questo trucco funziona, ci chiediamo come applicarlo ad una matrice generale. L'idea -è di togliere alla matrice $A_k$ un'altra matrice $\alpha_k I$, dove $\alpha_k = \alpha_{nn}^{(k)}$ -(si veda la Figura~\ref{fig:hessenbergsup}). -Per semplicità osserviamo il caso delle matrici di Hessenberg, che poi sarà il caso implementato in pratica -date le considerazioni sulla complessità fatte in precedenza. - -Il caso di una matrice complessa viene gestito esattamente con lo shifting di $-\alpha_{nn}^{(k)}I$ come descritto -sopra, e si verifica che le cose funzionano bene. Più complesso, invece, è il caso di una matrice reale. -In quella situazione infatti gli autovalori possono essere complessi coniugati e non si desidera passare da aritmetica -reale ad aritmetica complessa. Questo porterebbe a problemi di complessità, ma il danno più grave sarebbe -perdere la simmetria\footnote{Per simmetria intendiamo la certezza di ottenere autovalori complessi coniugati, -cosa di cui non si potrebbe essere certi con una matrice complessa qualsiasi. } della matrice, -e quindi in definitiva parecchia informazione sul problema. -\begin{os} - Nel caso complesso Hessenberg risulta semplice determinare la qualità dell'approssimazione ottenuta - dell'autovalore. Possiamo assumere di fermare l'iterazione quando - \[ - |\beta_n| \leq u( |\alpha_{nn}^{(k)}| + |\alpha_{n-1,n-1}^{(k)}|) - \] - dove $u$ è la precisione di macchina, - ed a quel punto assumere che $\alpha_{nn}^{(k)}$ è una buona approssimazione dell'autovalore - cercato e ridurci a ripetere il procedimento sul minore di nord ovest di ordine $n-1$, che è ancora in forma - di Hessenberg. -\end{os} -Per determinare come eseguire lo shifting nel caso reale conviene cambiare punto di vista su quanto effettuato fino -ad ora. Possiamo osservare che se poniamo $p_k(z) = z - \alpha_k$ di fatto lo shifting è equivalente a considerare -la matrice $\hat A_k = p(A_k)$. Dato che riteniamo che $\alpha_k$ sia una buona approssimazione dell'autovalore -cercato della matrice per analogia nel caso reale possiamo utilizzare $p_k(x) = (x - \lambda)(x - \con{\lambda})$ -che è un polinomio reale. Si verifica (e, ancora una volta, noi non lo faremo) che tutto continua a funzionare -bene ma sorgono dei problemi di complessità. \\ -Il polinomio $p_k$ è infatti adesso di II grado e non è per nulla banale, in generale, calcolare $A_k^2$. -Inoltre $p_k(A_k)$ non è neppure una matrice in forma di Hessenberg, il che sembrerebbe farci perdere tutti -i vantaggi computazionali che avevamo fino a questo momento. Per fortuna esiste una tecnica che, modificando -l'iterazione, riesce a riolvere questo problema. - -\subsection{La tecnica del Bulge Chasing} -Nell'applicazione della tecnica dello shifting vista nel paragrafo precedente, abbiamo supposto di -calcolare $p_k(A_k)$ e dopo calcolare la fattorizzazione QR. Ci siamo però accorto che se $p_k$ è -un polinomio di secondo grado vengono persi tutti i vantaggi computazionali dati dalla forma di Hessenberg. -Vogliamo quindi ora modificare la fattorizzazione QR \textbf{mentre} calcoliamo $p_k(A_k)$ in modo da -rendere la risultante matrice in forma di Hessenberg e diminuire la complessità del calcolo del polinomio. -La fattorizzazione QR ottenuta sarà ``essenzialmente uguale''\footnote{ovvero sarà uguale a meno di una -matrice di fase reale} a quella che avremmo ottenuto seguendo -il procedimento precedente; questo modo di operare è detto \emph{Bulge Chasing}\footnote{bulge chasing in inglese significa inseguimento -del bernoccolo, e s riesce ad apprezzare il senso del nome osservando come questa tecnica si traduce graficamente sugli elementi -non zero della matrice. Questi si comportano infatti come un bernoccolo che scende sempre di più sulla -sottodiagonale per poi sparire lasciando una matrice in forma di Hessenberg superiore.}. - -Possiamo cominciare a calcolare solo la prima colonna della matrice $p_k(A_k)$, ovvero $p_k(A_k)e_1$. -Una volta calcolata questa possiamo calcolare anche una matrice di Householder $P_0$ tale che -$P_0 p_k(A_K)e_1 = \alpha e_1$. \\ -Si costruiscono poi altre $n-1$ matrici di Householder tali che fissato -\[ - Z = P_0 \ldots P_{n-1} -\] -si abbia -\[ - A_{k+1} = \herm{Z} A_k Z -\] -ed è possibile dimostrare che questa iterazione produce una matrice simile a meno di una matrice di fase reale -rispetto a quella presentata in precedenza. - -\section{Divide et Impera} -\subsection{L'idea} -Introdurremo ora un altro metodo, piuttosto recente, per il calcolo di tutti gli autovalori della matrice. -Questo è stato introdotto nel 1980 da Cuppen. Il metodo permette il calcolo di autovalori solo per matrici -tridiagonali hermitiane e l'osservazione che ne sta alla base è che una matrice tridiagonale è ``quasi'' -diagonale a blocchi, più precisamente se $H$ è la nostra matrice -\[ - H = \left[ \begin{array}{cc|cc} - \sblocko{T_1}{2} & & \\ - & & & \\ \hline - & & \sblocke{T_2}{2} \\ - & & & \\ - \end{array} \right] -+ \left[ \begin{array}{cc|cc} - & & & \\ - & \beta_{n-1} & & \\ \hline - & & \beta_{n-1} & \\ - & & & - \end{array} \right] -\] -Ovvero è una diagonale a blocchi più una correzione di rango 2. A ben vedere, però, si può fare anche di meglio. -Se sostituiamo in $T_1$ il valore $\alpha_{\frac{n}{2}}$ con $\hat \alpha_{\frac{n}{2}} = \alpha_{\frac{n}{2}} - \beta_{n-1}$ -e in $T_2$ il valore $\alpha_{\frac{n}{2} + 1}$ con $\hat \alpha_{\frac{n}{2} + 1} = \alpha_{\frac n 2 + 1} - \beta_{n-1}$, otteniamo -una matrice a blocchi tridiagonali più un correzione di rango $1$: -\[ - H = \left[ \begin{array}{cc|cc} - \sblocko{\hat T_1}{2} & & \\ - & & & \\ \hline - & & \sblocke{\hat T_2}{2} \\ - & & & \\ - \end{array} \right] -+ \left[ \begin{array}{cc|cc} - & & & \\ - & \beta_{n-1} & \beta_{n-1}& \\ \hline - & \beta_{n-1} & \beta_{n-1} & \\ - & & & - \end{array} \right] -\] -Supponiamo ora di conoscere gli autovalori di $\hat T_1$ e di $\hat T_2$, ed in particolare le matrici -unitarie $Q_1$ e $Q_2$ che ci permettono di diagonalizzarle, ovvero -\[ - T_1 = Q_1 D_1 \herm Q_1 \qquad - T_2 = Q_2 D_2 \herm Q_2 -\] -con $D_1$ e $D_2$ le matrici con gli autovalori sulla diagonale e $0$ altrove. - -Tutto questo può funzionare se -riusciamo a mostrare che siamo veramente in grado di calcolare facilmente gli autovalori della matrice a blocchi -con la correzione. - -Se consideriamo ora la matrice $D$ così formata -\[ - \hat D = \left[ \begin{array}{cc|cc} - \sblocko{D_1}{2} & & \\ - & & & \\ \hline - & & \sblocke{D_2}{2} \\ - & & & - \end{array} \right] -\] -e calcoliamo $B = \herm Q A Q$ otteniamo -\[ - B = \herm Q A Q = \hat D + \beta_{\frac{n}{2}}z\herm z -\] -con $z = \left[ \begin{array}{c} q_1 \\ q_2 \end{array}\right]$ dove $q_i$ è l'ultima colonna di $\herm Q_i$ -per $i = 1,2$. - -\subsection{La ricerca degli autovalori} -Abbiamo quindi ricondotto il problema a calcolare gli autovalori di una matrice $D + w\herm w$ dove $D$ -è diagonale e $w$ è un vettore qualsiasi. Calcolando il polinomio caratteristico di $B$ ed assumendo -che $\lambda \neq \hat d_i$ otteniamo -\[ - p(\lambda) = \deter{\lambda I - B} = \deter{ \lambda I - D }\cdot \deter{I + \theta(\lambda I - D)^{-1} z\herm z} -\] -Osserviamo che stiamo assumendo che $\lambda I - D$ sia invertibile, e quindi questa formula per il calcolo -del polinomio caratteristico vale solo per $\lambda \in \C \setminus (\spe{D_1} \cup \spe{D_2})$. Sapendo che $p$ -è continuo possiamo però concludere che vale per tutto $\C$. \\ -Notiamo inoltre che $( I + \theta(\lambda I - D)^{-1}z\herm z)$ è una matrice elementare e quindi ha determinante\footnote{% -Ricordiamo che in genearale una matrice elementare $I - \sigma u \herm v$ ha determinante $1 - \sigma \herm v u$} -$1 - \theta (\lambda I - D)^{-1} \herm zz$; sviluppando ulteriormente si ottiene -\begin{equation} \label{eqn:polmindivetimp} - p(\lambda) = \prod_{j=1}^{n} (\lambda - \hat d_j) ( 1 + \theta (\lambda I - D)^{-1} \herm zz ) - = \prod_{j=1}^{n} (\lambda - \hat d_j) ( 1 + \theta \sum_{k=1}^{n} \frac{z_k^2}{\lambda - \hat d_k} ) -\end{equation} -ed estendendo per continuità a tutto $\C$ si ottiene infine -\[ - p(\lambda) = \prod_{j=1}^n (\lambda - \hat d_j) + \theta\sum_{k=1}^n z_k \prod_{\substack{s=1 \\ s\neq k}}^n (\lambda - \hat d_s) -\] -che è una sorta di equazione secolare come quella che si era ottenuta partendo dalle relazioni ricorrenti a tre -termini nella Sezione~\ref{sec:eqsecolare}. - -Siamo ora costretti a fare delle assunzioni sulla struttura di $z$ e di $\hat D$. In realtà ci renderemo conto -in seguito che queste non sono restrittive perché nei casi in cui non saranno verificate ci troveremo con un -problema semplificato, che potremo riportare a questo caso qua\footnote{Penso, perché in realtà non mi è ancora -molto chiaro come si dovrebbe fare}. \\ -Assumiamo dunque che -\begin{itemize} - \item $z_j \neq 0$ per ogni $j = 1 \ldots n$; - \item $\hat d_k \neq \hat d_j$ per ogni $k \neq j$, ovvero che tutti gli autovalori siano distinti; -\end{itemize} -A questo punto dalla relazione~\ref{eqn:polmindivetimp} ricaviamo che -\begin{equation} \label{eqn:eqsecdivetimp} - p(\lambda) = 0 \iff 1 + \theta \sum_{j=1}^n \frac{z_j^2}{\lambda - \hat d_j} = 0 -\end{equation} - -e quindi gli autovalori delle matrici di ordine $\frac{n}{2}$ separano quelli della matrice grande, e si -può applicare (ad esempio) il metodo di bisezione, o in generale altri procedimenti di iterazione -funzionale. - -\begin{os} - Notiamo che per applicare la bisezione nella (\ref{eqn:eqsecdivetimp}) abbiamo bisogno di conoscere, oltre - ai $\hat d_j$ anche gli $z_j$ e ricordando che $z$ è costruito a partire dalle matrici $Q_1$ e $Q_2$, è chiaro - che dobbiamo conoscere anche queste due. Queste erano le matrici che diagonalizzavano $T_1$ e $T_2$ e si - ottenevano quindi \textbf{conoscendo gli autovettori} di $T_1$ e $T_2$. Dobbiamo allora, per poter procedere - con il metodo, calcolarci tutti gli autovettori. -\end{os} - -\subsection{Autovettori e problemi di stabilità} -Il fatto di dover calcolare gli autovettori ha un lato positivo ed uno negativo, precisamente -\begin{enumerate}[(a)] - \item Il calcolo effettivo risulta inaspettatamente semplice, tanto che, trovati gli autovalori saremo - capaci di trovare ogni autovettore con costo $O(n)$ e quindi di ottenerli tutti con costo $O(n^2)$; - \item Il problema del calcolo degli autovettori non è in generale ben condizionato e non si riescono a - dare condizioni perchè lo sia. Dato che influenzerà anche il calcolo degli autovalori nei passaggi successivi, - non possiamo garantire l'accuratezza del risultato finale; -\end{enumerate} - -L'idea per trovare gli autovettori è cercare quelli di $\hat D + \beta_{\frac n 2}z\herm z$ e poi una -volta ottenuta la matrice $U$ con questi, moltiplicarla per la matrice a blocchi con $Q_1$ e $Q_2$ sulla -diagonale (che d'ora in poi chiameremo $\hat Q$) per trovare gli autovettori della matrice $T$. \\ -Osserviamo che se $v$ è autovettore per la matrice $D + \beta_{\frac n 2}z\herm z$ allora -\[ - (\hat D + \theta z \herm z - \lambda I)v = 0 -\] -e quindi -\[ - (\hat D - \lambda I)v = -\theta z \herm z v -\] -Se fosse $\herm z v = 0$ avrei che $(\hat D - \lambda I)v = 0$ ma questo non è possibile perché $v$ -è non nullo e $\hat D - \lambda I$ è invertibile (come assunto precedentemente). Quindi deve essere -$\herm z v \neq 0$ e quindi dato che $v$ è determinato a meno di uno scalare possiamo assumere -$\herm z v = 1$. In definitiva si ottiene -\[ - v = - \theta z (\hat D - \lambda I)^{-1} -\] -che si può scrivere anche più esplicitamente come -\begin{equation} \label{eqn:calcoloautovettdivetimp} - v_j = \frac{- \theta z}{d_j - \lambda} -\end{equation} -Riassumendo, vogliamo trovare la matrice $U$ con i $v_j$ sulla diagonale e questo si può fare con -la Formula~\ref{eqn:calcoloautovettdivetimp} con costo $O(n^2)$. Ottenuta la matrice $U$ avremo -la matrice per diagonalizzare $T$ calcolando $\hat Q U$, e potremmo quindi procedere con il metodo. - -Sorgono però dei problemi computazionali non banali, più precisamente -\begin{enumerate}[(i)] - \item La matrice $U$ deve essere ortogonale ma questo non è garantito dall'algoritmo. Se ad un passo - abbiamo perdita di ortogonalità questo poi causerà un accumulo di errore in tutti i passi successivi - portando ad una imprecisione del calcolo. Sembra che in una implementazione del 2006 si sia riusciti - a risolvere questo problema. %% TODO: inserire una citazione - \item Come già sottolineato prima il calcolo degli autovalori potrebbe essere mal condizionato dal principio - portando ad un accumulo di errore notevole ad ogni passo. - \item Apparentemente il costo computazionale del calcolo di $\hat Q U$ non è trascurabile in quanto - un prodotto matrice per matrice in generale costa $O(n^3)$. Fortunatamente $U$ non è una matrice qualsiasi: - matrici del tipo $u_{ij} = \frac{r_i s_j}{x_i - y_j}$ sono dette matrici \emph{Cauchy-like} ed esistono - algoritmi per calcolare il prodotto fra una Cauchy-like ed una matrice generica con costo $O(n^2\log{n})$ -\end{enumerate} - -Come ultima nota, ricordiamo che questo algoritmo è applicabile solo alle matrici tridiagonali hermitiante -(e, previa tridagonalizzazione, a qualsiasi matrice hermitiana) ma non alle matrici in forma di Hessenberg -che non presentano purtroppo alcuna proprietà di separazione\footnote{ovvero quella che ci permette di trovare -i limite su cui applicare la bisezione o qualsiasi altra iterazione funzionale}. \\ -Sono stati fatti molti tentativi a questo proposito, ma non esiste attualmente nessuna implementazione -robusta del metodo Divide et Impera sulle matrici di Hessenberg. - -\section{Il metodo delle potenze} \label{sec:metodopotenze} -Per ultimo analizzeremo il metodo delle potenze che ci permette di trovare gli autovettori di una matrice -conoscendo gli autovalori. In generale è particolarmente comodo per calcolare l'autovalore dominante. -Consideriamo dunque questo caso per primo - -\subsection{Il metodo diretto} -Supponiamo $A \in \mat{\C}{n}$ diagonalizzabile, per semplicità. Elimineremo questa ipotesi in seguito. -Consideriamo gli autovalori ordinati in modo che -\[ - |\lambda_1| \geq |\lambda_2| \geq \ldots \geq |\lambda_n| -\] -e aggiungiamo l'ipotesi che $\lambda_1$ sia semplice e che sia in modulo strettamente maggiore degli altri. -Il metodo si basa su questa semplice osservazione (la cui paternità viene, ancora una volta, attribuita a Gauss): -Se prendiamo un vettore $y_0 \in \C^n$ e la nostra scelta non è incredibilmente sfortunata\footnote{% -dove con incredibilmente sfortunata intendiamo che il prodotto scalare tra $y_0$ e l'autovettore relativo -a $\lambda_1$ è esattamente uguale a $0$} possiamo considerare la successione -\begin{equation} - \left\{ \begin{array}{ll} - y_0 & = y_0 \\ - y_k & = Ay_{k-1} - \end{array} \right. -\end{equation} -Se scriviamo $y_0$ nella base di autovettori per $A$ abbiamo -\begin{equation} - y_0 = \sum_{i=1}^{n} \alpha_i v_i -\end{equation} -e quindi osservando che $y_k = Ay_{k-1} = A^{k}y_0$ dopo $k$ iterazioni otteniamo -\begin{equation} \label{eqn:metpotite} - y_k = A^ky_0 = \sum_{i=1}^n \alpha_i \lambda_i^k v_i = - \lambda_i^k \cdot \Big( \alpha_1 v_1 + \underbrace{\sum_{i=2}^n \alpha_i (\frac{\lambda_i}{\lambda_1})^k v_i}_{% -\text{tende a}\ 0\ \text{se}\ k \to \infty} \Big) -\end{equation} -e ricordando l'ipotesi fatta precedentemente, ovvero che $|\lambda_1| > |\lambda_i|$ per ogni $i$ abbiamo -che la seconda parte dell'uguaglianza va a $0$ per $k \to \infty$ e quindi la successione di vettori -tende ad un multiplo di $v_1$, ovvero l'autovettore cercato. - -Purtroppo questa implementazione del metodo non è realistica, perché si incorrerebbe sicuramente nel caso di -overflow o underflow in poche iterazioni, e probabilmente prima di avere una buona approssimazione dell'autovettore. -Si ricorre quindi al semplice stratagemma di riscalare ad ogni iterazione il vettore ottenuto, ad esempio -dividendolo per la sua norma infinito. In questo modo otteniamo una successione di vettori unitari che convergeranno -all' autovettore unitario. \\ -Possiamo ora emprimere la successione in questo modo -\[ - \left\{ \begin{array}{ll} - y_0 & = y_0 \\ - y_k & = \displaystyle \frac{Ay_{k-1}}{||Ay_{k-1}||_\infty} - \end{array} \right. -\] -\begin{os} - Questo metodo mi permette anche di valutare e raffinare la stima dell'autovalore dominante. Se considero - infatti il rapporto fra le $j$-esime componenti di due vettori consecutivi, ovvero $\frac{y_k,j}{y_{k-1,j}}$ - non è difficile verificare tramite la (\ref{eqn:metpotite}) che - converge all'autovalore cercato. -\end{os} - -Esistono delle varianti del metodo delle potenze che sfruttano le idee qui esposte per risolvere problemi simili -e migliorare le condizioni di convergenza. - -\subsection{Il metodo inverso con shift} -Osserviamo come prima cosa che con pochi cambiamenti si potrebbe calcolare l'autovalore di modulo più piccolo -considerando, invece che la matrice $A$, la matrice $A^{-1}$. \\ -Potremmo riscrivere l'iterazione in questo modo -\begin{equation} - \left\{ \begin{array}{ll} - y_0 & = y_0 \\ - y_k & = \beta_{k} \cdot A^{-1}y_{k-1} - \end{array} \right. -\end{equation} -dove $\beta_{k} = ||y_{k}||_\infty$\footnote{adotteremo questa notazione per tutta la sezione, d'ora in poi}. -Questo procedimento ci imporrebbe però di calcolare l'inversa di $A$, un procedimento che in generale si tende ad -evitare per problemi di instabilità. Possiamo quindi rileggere l'espressione precedente come risoluzione di -un sistema lineare, ovvero -\begin{equation} - \left\{ \begin{array}{lll} - y_0 &=& y_0 \\ - Az_k &=& y_{k-1} \\ - y_k &=& \beta_k \cdot z_k - \end{array} \right. -\end{equation} -A questo punto possiamo scegliere varie tecniche per risolvere il sistema lineare; sottolineamo che un metodo diretto -che utilizza una fattorizzazione in questo caso è molto conveniente rispetto ad uno iterativo. Se calcoliamo -la fattorizzazione di $A$, infatti, possiamo poi usarla per risolvere tutti i sistemi lineari della successione con -un costo basso. - -In particolare, ricordiamo che per una tridiagonale hermitiana e per una matrice in forma di Hessenberg superiore -il costo di una fattorizzazione QR sono rispettivamente $O(n)$ e $O(n^2)$, e sono anche il costo della risoluzione -del sistema lineare. Si verifica sperimentalmente che, partendo da una buona approssimazione degli autovalori, -il metodo converge in genere in 3-4 passi, indipendemente dalla dimensione di $A$. Si conclude quindi che il calcolo -dell'autovettore dominante risulta essere $O(n)$ per le tridiagonali e $O(n^2)$ per le matrici in forma di -Hessenberg. - -Ci poniamo ora il problema di come calcolare gli autovettori che stanno nella parte centrale dello spettro, ed è qui -che interviene lo \emph{shifting}. Non è difficile osservare che gli autovalori della matrice $A - \gamma I$ sono gli -stessi di $A$ ``shiftati'' di $\gamma$, ovvero sono -\[ - \spe{A - \gamma I} = \{ \lambda - \gamma \ | \ \lambda \in \spe{A} \ \} -\] -Supponiamo ora di avere una buona approssimazione $\hat \lambda_j$ dell'autovalore $\lambda_j$, dove con ``buona -approssimazione'' intendiamo tale che -\[ - |\hat \lambda_j - \lambda_j| < |\hat \lambda_j - \lambda_k| \quad \forall k \in \spe{A}\setminus\{\lambda_j\} -\] -In questo caso $\hat \lambda_j - \lambda$ è l'autovalore di modulo più piccolo della matrice $A - \hat \lambda_j I$ -e il suo autovettore è quello relativo all'autovalore $\lambda_j$ della matrice $A$. Possiamo quindi applicare -il metodo delle potenze inverso a $A - \lambda_j I$ e ottenere l'autovettore cercato. Questa operazione prende -il nome di \emph{metodo delle potenze inverso con shift}. - -\begin{os} - In questo modo si può applicare un metodo qualsiasi per ottenere un'approssimazione degli autovalori (ad esempio - il metodo QR) e poi calcolare tutti gli autovettori della matrice con il metodo delle potenze inverso con shift. - Se la matrice è tridiagonale hermitiana si possono ottnere tutti con costo $O(n^2)$, mentre se è in forma di - Hessenberg superiore il costo diventa $O(n^3)$ per le considerazioni fatte in precedenza. -\end{os} - -\begin{os} - Un'altra cosa che si può notare è che il metodo fornisce anche un possibile raffinamente per l'autovalore - $\lambda_j$ tramite il rapporto fra le componenti di $y_k$ e di $y_{k-1}$. Si potrebbe essere tentati - di sostituire questo eventuale raffinamento al posto dello shifting ma si verifica che questa non è necessariamente - una buona pratica. Esistono alcuni casi in cui può inficiare la convergenza del metodo. -\end{os} - diff --git a/capitolo3.tex b/capitolo3.tex deleted file mode 100644 index b3da59c..0000000 --- a/capitolo3.tex +++ /dev/null @@ -1,412 +0,0 @@ -\chapter{Decomposizione in valori singolari} \label{ch:svd} - -In questa sezione ci occuperemo di un tipo di fattorizzazione basato sulle proprietà spettrali, e quindi differente -dalle fattorizzazioni viste fino ad ora (come la QR o la LU). Cominceremo esponendo un caso concreto in cui -ci si trova nella necessità di utilizzarla. - -\section{Problemi lineari ai minimi quadrati} -Consideriamo il seguente problema; sia $A$ una matrice $m \times n$ con $m \geq n$ e $b$ un vettore -di $\R^m$. Vogliamo trovare $x$ tale che $Ax = b$. In generale questo problema è risolubile solo se -$b \in \imm{A}$ vista come applicazione lineare, ma non è conveniente affrontare il problema risolvendo -effettivamente il sistema lineare. Possiamo quindi riformulare la nostra richiesta in questo modo: cerchiamo -$x$ tale che -\[ - x = \min_{x \in \R^n}( || Ax - b ||_2 ) -\] -Se $x$ è effettivamente soluzione del sistema lineare avremo $||Ax - b||_2 = 0$, ed in caso contrario -avremo un $x$ tale che $Ax$ sia una buona\footnote{dove buona significa che non si potrebbe trovare -un altro $x'$ tale ceh $Ax'$ sia più vicino (nel senso della norma 2) a $b$ di quanto lo sia già $Ax$} -approssimazione di $b$. - -Analizziamo alcune tecniche per la risoluzione di questo problema - -\subsection{Fattorizzazione QR} -Consideriamo la fattorizzazione QR di $A = QR$. Osserviamo che in questo caso $Q \in \matr{\R}{n}{n}$ e -$R \in \matr{\R}{m}{n}$. Osservando che minimizzare la norma 2 è la stessa cosa che minimizzarne il -quadrato si ottiene -\[ - ||Ax - b||_2^2 = ||QRx - b||_2^2 = ||Q(Rx - \trasp Qb)||_2^2 = ||Rx - \trasp Qb||_2^2 -\] -dove l'ultimo passaggio è giustificato dal fatto che $Q$ è unitaria. -Consideriamo che la matrice $R$ e il vettore $\trasp Qb$ avranno una struttura di questo tipo: -\[ - R = \left[ \begin{array}{c} - \hat R \\ - \trasp 0 - \end{array} \right] -\qquad \trasp Qb = \left[ \begin{array}{c} - w_1 \\ - w_2 - \end{array} \right] -\] -dove $\hat R$ è una matrice quadrata $n \times n$, $w_1$ un vettore con $n$ componenti e $w_2$ un vettore -di $\R^{m-n}$. Possiamo quindi riscrivere la relazione precedente in questo modo -\[ - ||Ax - b||_2^2 = ||\hat Rx - w_1||_2^2 + ||w_2||^2 -\] -Abbiamo ricondotto il problema a minimizzare la norma di $\hat Rx - w_1$. Se $\hat R$ è invertibile allora -la soluzione al problema è evidentemente unica ed è la soluzione del sistema lineare $\hat Rx = w_1$. -Osserviamo che $\hat R$ è invertibile se e solo se lo è $\rk{A} = n$; per ora assumeremo che -questo sia vero, riservandoci di analizzare il caso più generale in seguito. - -In conclusione la fattorizzazione QR ci ha permesso di ricondurre il problema alla risoluzione di un sistema -lineare quadrato di ordine $n$. Analizziamo ora un diverso approccio. - -\subsection{Sistema delle equazioni normali} -Questo sistema deriva dalla seguente osservazione. Supponiamo di avere $x$ soluzione del sistema $Ax = b$. Allora -$x$ deve essere anche soluzione del sistema quadrato $\trasp AAx = \trasp Ab$, che si ottiene semplicemente moltiplicando -a sinistra la precedente relazione per $\trasp A$. -Osserviamo ancora una volta che scrivendo la fattorizzazione QR di $A$ e supponendo che $A$ abbia rango massimo si -ottiene lo stesso risultato di prima: -\[ - A = QR \qquad \trasp AAx = b \iff \trasp RRx = \trasp R\trasp Qb \iff \trasp R\hat R = \trasp Rw_1 \iff - \hat Rx = w_1 -\] -e quindi si ha l'unicità della soluzione e la risolubilità del sistema lineare. In generale però, il calcolo -di $\trasp AA$ potrebbe essere oneroso e, soprattutto, nessuno ci garantisce in una situazione generale -che il rango di $A$ sia massimo. - -\subsection{Teorema di decomposizione in valori singolari} -Possiamo pensare di voler migliorare l'idea delle equazioni normali. In altre parole, vogliamo trovare il -modo di evitare il calcolo di $\trasp AA$. Consideriamo dunque il seguente -\begin{te}[Decomposizione in valori singolari] -Siano $m \geq n$ e $A \in \matr{\R}{m}{n}$. Esistono $U \in \matr{\R}{m}{n}$ e $V \in \mat{\R}{n}$ ortogonali e -$\Sigma \in \matr{\R}{m}{n}$ tali che -\[ - \Sigma = \left[ \begin{array}{cccc} - \sigma_1 & & & \\ - & \sigma_2 & & \\ - & & \ddots & \\ - & & & \sigma_n \\ \hline - \multicolumn{4}{c}{\trasp 0} \\ - \end{array} \right]; \qquad \textrm{dove} \: \sigma_i \geq \sigma_j \ \forall i < j \qquad \textrm{e} \qquad -A = U\Sigma\trasp V -\] -\end{te} - -\begin{os} - Osservando che $\Sigma$ è quasi diagonale si capisce che in un certo senso questa è una decomposizione spettrale. - In particolare si può scrivere $\trasp AA$ come - \[ - \trasp AA = \trasp V\Sigma\trasp U U \Sigma V = \trasp V \left[ \begin{array}{cccc} - \sigma_1^2 & & & \\ - & \sigma_2^2 & & \\ - & & \ddots & \\ - & & & \sigma_n^2 \\ \hline - \multicolumn{4}{c}{\trasp 0} \\ - \end{array} \right] V - \] -e quindi se prendiamo $\lambda_i$ gli autovalori di $\trasp AA$ (che sono reali perché la matrice $\trasp AA$ -è simmetrica) ordinati in modo decrescente abbiamo che $\sigma_i = \sqrt{\lambda_i}$ per ogni $i = 1 \ldots n$. -\end{os} -Inoltre questa fattorizzazione mette in luce altre proprietà della matrice $A$. In particolare: -\begin{os} - Se $A$ ha rango $k$, allora $\sigma_1 \ldots \sigma_k$ sono tutti diversi da $0$ mentre $\sigma_{k+1} \ldots -\sigma_n$ sono $0$. Questo si nota dal fatto che $\trasp AA$ ha lo stesso rango di $A$ ed il suo rango - è pari al numero\footnote{inteso come numero moltiplicato per la molteplicità algebrica} di autovalori diversi da $0$. - L'ordinamento che abbiamo richiesto sui $\sigma_i$ ci permette di concludere. -\end{os} - -Possiamo ora osservare come cambia il problema lineare ai minimi quadrati quando introduciamo questa -nuova fattorizzazione. -\[ - ||Ax - b||_2^2 = ||U\Sigma\trasp Vx - b||_2^2 = ||\Sigma\trasp Vx - \trasp Ub||_2^2 -\] -e ponendo $z = \trasp V x$ e $\trasp Ub = \left[ \begin{array}{c} w_1 \\ w_2 \end{array} \right] $ si ottiene -\[ - \Bigg|\Bigg|\Sigma z - \left[ \begin{array}{c} w_1 \\ w_2 \end{array} \right] \Bigg|\Bigg|_2^2 = - \Bigg|\Bigg|\left[ \begin{array}{ccc} \sigma_1 & & \\ & \ddots & \\ & & \sigma_n \end{array} \right] z - w_1\Bigg|\Bigg|_2^2 + ||w_2||_2^2 -\] -Se il rango di $A$ è $n$ allora la matrice $\diag{\sigma_1 \ldots \sigma_n}$ è invertibile e quindi per -minimizzare il primo fattore è sufficiente risolvere un sistema diagonale di ordine $n$. - -Se però $A$ è di ordine $k < n$ allora si può ripartizionare $\trasp Ub$ in una parte con $k$ componenti -e una parte con le restanti $n-k$. Riscrivendo l'espressione si ottiene che si può minimizzare il primo fattore -risolvendo un sistema di $k$ equazioni e scegliendo arbitrariamente le restanti $n-k$. -\begin{os} Come regola generale si preferisce scegliere queste ultime componenti tutte nulle in modo - da minimizzare la norma della soluzione. \`E infatti generalmente preferibile ottenere una soluzione di norma piccola. -\end{os} -Dalle relazioni sopra possiamo anche ottenere una espressione esplicita della soluzione $z$. In particolare -\[ - z_j = \frac{w_{1,j}}{\sigma_j} = \frac{\trasp U_j b }{\sigma_j} \quad \text{dove} \ U_j \ \text{è la $j$-esima -colonna di} \ U -\] -Ora possiamo ricordare che $x = Vz$ e quindi se $A$ è di rango massimo -\[ - x = Vz = \sum_{k=1}^{n} \frac{V_k\trasp U_kb}{\sigma_k} = \underbrace{\left( \sum_{k=1}^{n} \frac{V_k\trasp U_k}{\sigma_k} \right)}_{A^+} b -\] -e chiamiamo $A^+$ \emph{pseudo-inversa} di $A$. Più precisamente -\[ - A^+ = V \Sigma^{-1} \trasp U -\] -% TODO: Controllare che le uguaglianze scritte sull'inversa abbiano senso. Una è giusta di sicuro, -% ma quale? -Si verifica subito infatti che e $A^+A = I$. % \footnote{ma attenzione! Non è vero che $AA^+ = A^+A$ perchè -% queste sono addirittura due matrici di ordine diverso. Il loro prodotto dà sempre l'identità, ma non dello stesso -% spazio.}. -Questa pseudo-inversa di chiama anche \emph{inversa di Moore-Penrose}. - -Se $A$ non è di rango massimo possiamo ugualmente definire la pseudo-inversa ``fermando'' la somma -a $k$ dove $k$ è il rango di $A$. Abbiamo dunque -\[ - A^+ = \sum_{j=1}^{k} \frac{V_j\trasp U_j}{\sigma_j} -\] -e ancora una volta vale l'eguaglianza $x = A^+b$ dove $x$ è il vettore di rango minimo che risolve (nel senso -che minimizza il valore della norma) - il problema lineare ai minimi quadrati. - -\subsection{Interpolazione polinomiale} -Abbiamo visto nel corso di analisi numerica che dati $(x_i,y_i)$ con $i = 0 \ldots n$ è sempre possibile -trovare un polinomio di grado al più $n$ tale che $p(x_i) = y_i$ per tutti gli $i$. - -Nelle applicazioni concrete si ha però a che fare con grandi moli di dati sperimentali e raramente -il grado del polinomio che si vorrebbe usare per creare un modello matematico ha lo stesso ordine -di grandezza. Ci chiediamo: ``\`E allora possibile trovare il polinomio di grado $m \ll n$ che meglio -approssimi la distribuzione dei nostri dati sperimentali?''; la risposta è sì e si tratta di risolvere -un problema lineare ai minimi quadrati con una matrice $m \times n$. -Indagheremo in seguito questa tecnica per il calcolo del miglior polinomio approssimanete un insieme di dati -sperimentali, perché dovremo superare anche il problema del condizionamente della matrice di Van der Monde -che individua il problema\footnote{Questo era un problema anche nel caso standard con matrice quadrata, e rimarrà -complesso anche nel caso della matrice rettangolare}. - -\subsection{Principali proprietà della SVD} \label{subsec:svdprop} -Abbiamo introdotto la SVD parlando di sistemi lineari perché questo è il contesto in cui è stata originariamente -concepita. Possiamo però osservare che essa ha anche delle interessanti proprietà in molti altri ambiti. - -Consideriamo la matrice $A \in \matr{\R}{m}{n}$ che individua univocamente un'applicazione lineare -\[ -T_A : \R^n \longto \R^m -\] -La \svd\ ci permette di conoscere meglio questa applicazione. Sappiamo che se $A$ è di rango $k$ allora -$A = U\Sigma\trasp V$ e i $\sigma_i$ della matrice $\Sigma$ sono nulli a partire dal ($k+1$)-esimo. -\`E chiaro dunque che la scomposizione di permette di determinare il rango di $A$ e quindi di capire -che l'immagine di $T_A$ avrà dimensione $k$ e il kernel dell'applicazione $n-k$. Ricordando però che -\[ - Ax = U\Sigma\trasp Vx = \sum_{i=1}^{k} \sigma_i U_i\trasp V_i x -\] -possiamo estrarre altre informazioni. Dato che per ogni $x$ $V_i x$ è uno scalare l'immagine di $T_A$ -deve essere contenuta nello $\Span{U_1 \ldots U_k}$. Dato che quest'ultimo ha dimensione $k$, che è la -stessa di $\imm{T_A}$, devono coincidere e quindi le prime $k$ colonne di $U$ sono una base per l'immagine. -Analogamente dall'ortogonalità delle colonne di $V$ si ha che se $x = V_j$ con $j > k$ allora $Ax = 0$ -e quindi lo $\Span{V_{k+1} \ldots V_{n}}$ è contenuto nel kernel di $T_A$. Ancora una volta per motivi -dimensionali devono coincidere. - -In sintesi si ha che se $A = U\Sigma\trasp V$ è una matrice di rango $k$ allora -\begin{itemize} - \item $\Ker{A} = \Span{V_{k+1} \ldots V_n}$; - \item $\imm{A} = \Span{U_1 \ldots U_k}$; -\end{itemize} - -Introduciamo ora un'estensione del concetto di norma indotta visto nel corso di Analisi Numerica -\begin{de} - Sia $A$ una matrice $m \times n$. Si dice \emph{norma di $A$ indotta dalla norma vettoriale $||\cdot||$} - la seguente funzione - \[ - \begin{array}{rcl} -||\cdot|| : \matr{\R}{m}{n} &\longto& \R \\ - A & \longmapsto & \displaystyle \max_{||x|| = 1} ||Ax|| - \end{array} - \] -\end{de} -Questa è effettivamente una norma, ma la verifica viene qui omessa. -%TODO: Magari si potrebbe anche fare, suvvia! - -\begin{os} - Osserviamo la seguente catena di uguaglianze - \[ - ||Ax||_2 = ||U\Sigma \trasp V x||_2 = ||\Sigma \trasp V x||_2 = ||\Sigma z||_2 -\] -Queste ci dicono che, data l'invertibilità e l'ortogonalità di $V$, $||A||_2 = ||\Sigma||_2 = \sigma_1$. -\end{os} -Date queste considerazioni possiamo introdurre anche una generalizzazione del condizionamento -ridefinendole con la nuova norma e con la pseudo inversa. Nel caso della norma due si ottiene che -\[ - \cond{A} = ||A^+|| \cdot ||A||_2 = \frac{\sigma_1}{\sigma_k} -\] -dove $\sigma_k$ è il più piccolo $\sigma_i$ non nullo, ovvero, come al solito, $k$ è il rango di $A$. -Un'analisi dell'errore effettuata sul problema lineare ai minimi quadrati mostrerebbe come effettivamente -l'errore generato dal procedimento dipende proprio da questo coefficiente. - -\subsection{\tsvd, pulizia del rumore e compressione di immagini} -Le considerazioni fatte nella Sezione~\ref{subsec:svdprop} ci permettono di introdurre delle tecniche -per ridurre il condizionamento di alcuni problemi. - -Supponiamo di avere ad esempio un sistema lineare $Ax = b$ con $A$ una matrice con un condizionamento -molto alto. Siamo consci di non avere speranza di risolvere in maniera esatta il sistema senza aumentare -la precisione dei tipi che utilizziamo negli algoritmi. -Se ad esempio il condizionamento è nell'ordine di $10^{12}$ e la precisione di macchina di $10^{16}$ sappiamo -che probabilmente avremo circa $4$ cifre decimali corrette (nella migliore delle ipotesi). La soluzione di aumentare -la precisione di macchina (ad esempio portarla a $10^{-32}$) potrebbe essere una soluzione ma appesantirebbe -molto l'esecuzione dell'algoritmo. - -Consideriamo dunque la \svd\ di $A = U\Sigma\trasp V$. -Possiamo supporre che $\sigma_n$ sia molto piccolo e che -questo causi il cattivo condizionamento (ricordiamo che $\cond{A} = \frac{\sigma_1}{\sigma_n}$). Possiamo -pensare di troncare la matrice $\Sigma$ sostituendola con una matrice $\hat \Sigma$ identica ad eslusione del posto -$(n,n)$ dove rimpiazziamo $\sigma_n$ con $0$, e risolvere il problema $\hat Ax = U\hat \Sigma\trasp Vx = b$. -Questo \textbf{è un altro problema}, ma potrebbe essere molto meglio condizionato del precedente (ad esempio -se $\sigma_{n-1} \gg \sigma_n$) e talvolta è la scelta migliore. - -Questa pratica di ``troncamento'' viene chiamata \tsvd, ovvero \svd\ con troncamento. \`E tipicamente -utile nella ricostruzione di immagini (che vedremo più avanti) perché non ci interessa la soluzione esatta -del problema, ma la soluzione esatta di un problema ``semplice'' che si avvicini ai nostri dati. -Questo procedimento viene anche detto di soglia, o di filtro, perché è possbile decidere una soglia minima -sotto la quale i $\sigma_i$ non possono scendere, pena essere messi a $0$. In questo modo, fissata la -soglia $s$, avremo che il condizionamento sarà maggiorato da $\sigma_1s^{-1}$. - -In generale non è un problema banale scegliere il livello di soglia $s$. Nei casi più semplici si ha -un salto dei valori singolari, che passano da un ordine di grandezza ad uno (o a più) inferiori, dividendo -in due zone ben distinte quelli prossimi a $0$ e quelli $\gg 0$. - -Osservaiamo che in generale non abbiamo alcuna garanzia che i risultati ottenuti tramite -questa tecnica abbiano un riscontro con il problema che aveva generato i dati di partenza, e va quindi -usata con molta attenzione. - -Un altro esempio pratico di utilizzo della \tsvd\ è quello della compressione delle immagini. Supponiamo di avere -un'immagine rappresentata come una matrice di pixel $A$\footnote{non esiste un motivo per cui la matrice dovrebbe -essere quadrata, è solo per rendere più chiaro l'esempio} di dimensione $n \times n$. Possiamo scrivere -$A = U\Sigma\trasp V$ e pensare di limitarci ad una matrice di rango $k$ e quindi tronvare tutti i $\sigma_i$ -con $i > k$. In questo modo potremo rappresentare l'immagine considerando solo le prime $k$ colonne di $U$, le -prime $k$ righe di $V$ e i $\sigma_1 \ldots \sigma_k$. -Per fare un esempio pratico supponiamo $n = 1024$, ovvero un'immagine da 1 Megapixel. Questa occuperebbe in memoria -(supponendo che sia in bianco e nero a 256 colori) $1 MB$. Decidendo di comprimerla con una matrice di rango $15$ -avremmo invece una dimensione di $15 KB$! Ovviamente l'immagine risultante darebbe solamente un'idea di quella originale, -ma si potrebbe pensare di trovare un punto d'incontro fra dimensione e qualità\footnote{e magari di raffinare anche -il metodo di compressione, ma questo lo vedremo in seguito} (si veda ad esempio la Figura~\ref{fig:camosci}). - -\begin{figure}[ht!] -\begin{center} - \includegraphics[scale=0.2]{camosci/camoscio_100.png} - \includegraphics[scale=0.2]{camosci/camoscio_50.png} - \includegraphics[scale=0.2]{camosci/camoscio_25.png} - \includegraphics[scale=0.2]{camosci/camoscio_15.png} - \includegraphics[scale=0.2]{camosci/camoscio_8.png} - \caption{Una successione di camosci di 300 pixel di lato e di rango rispettivamente $100$, $50$, $25$, $15$ e $8$; le - immagini sono state ridimensionate per stare nella pagina, e sono state realizzate con un programma - identico a quello realizzato in laboratorio durante il corso.} \label{fig:camosci} -\end{center} -\end{figure} - - -\section{Calcolo della decomposizione in valori singolari} -In questa sezione introdurremo dei metodi per il calcolo della \svd\ e faremo qualche altra considerazione -sui suoi possibili utilizzi. - -\subsection{Approssimazione di rango fissato} -Supponiamo di avere una matrice $A \in \mat{\R}{n}$ e di volerne trovare una approssimazione efficiente. -Un'idea può essere quella di rappresentarla con una matrice di rango fissato $k < n$ che le assomigli il -più possibile. \\ -Consideriamo la procedura seguita anche alla fine della sezione precedente -\begin{enumerate} - \item Calcoliamo la fattorizzazione \svd\ di $A = U \Sigma V$; - \item Tronchiamo la $\Sigma$ ponendo $\sigma_{k+1} \ldots \sigma{n} = 0$ e chiamiamo $\tilde \Sigma$ - la nuova matrice; - \item Approssimiamo $A$ con $U \tilde \Sigma V = \sum_{i=1}^{k} \sigma_j U_j \trasp{V_j}$; -\end{enumerate} -\begin{os} - Questa approssimazione di $A$ è molto pratica nel caso non si abbia sufficiente spazio per - salvare $A$ nella memoria di un calcolatore. Suggerisce infatti un metodo immediato per ridurre - (circa) di un fattore $\frac{n}{k}$ lo spazio occupato. \`E infatti sufficiente salvare le prime $k$ - colonne di $U$, le prime $k$ righe di $A$ e i primi $k$ valori sulla diagonale di $\Sigma$. -\end{os} -Una domanda naturale a questo punto è: ``Quanto differiscono le due matrici?''. Osserviamo che -\[ - ||A - B||_2 = ||U\Sigma \trasp V - U \tilde \Sigma \trasp V||_2 = ||U[\Sigma - \tilde \Sigma] \trasp V||_2 - = \sigma_{k+1} -\] -Se $\sigma_{k+1}$ è sufficientemente piccolo abbiamo quindi un piccolo errore. Questo, di fatto, si -verifica in molte applicazioni pratiche dove i $\sigma_i$ piccoli possono rappresentare i disturbi -all'informazione che si intendeva analizzare (come nel caso della trasmissione di segnali). - -In realtà possiamo dire di più. Sia $B$ una matrice di rango $k$. Sappiamo che -\[ - \Dim{\Ker{B}} + \Dim{\imm{B}} = n \qquad \Dim{\Ker{B}} \geq n - k -\] -Considero il sottospazio $S = \Span{V_1,\ldots,V_{k+1}} \subseteq \R^n$. Per una questione di dimensioni -deve esistere un vettore non nullo $z \in S \cap \Ker{B}$, e possiamo supporre $||z||_2 = 1$. -Osserviamo che -\[ -|| (A - B)z ||_2 = ||Az||_2 = ||\sum_{i=0}^{k+1} \sigma_i U_i \trasp V_i z||_2 \geq - || \sigma_{k+1} U_i \trasp V_i z ||_2 = \sigma_{k+1} -\] -In particolare abbiamo mostrato che la nostra approssimazione era la migliore possibile, nel senso che -per ogni altra approssimazione ha una distanza maggiore o uguale da $A$ (secondo la norma 2). - -\subsection{Metodi di calcolo, errori e costo computazionale} -Abbiamo visto che la \svd\ è una sorta di decomposizione spettrale della matrice $A$. Più precisamente -i $\sigma_i$ che si trovano sulla diagonale di $\Sigma$ sono le radici degli autovalori di $\trasp AA$ -(che è semidefinita positiva). \\ -Un primo modo per affrontare il calcolo della fattorizzazione potrebbe quindi essere -\begin{enumerate}[(a)] - \item Calcolare $\trasp AA$; - \item Determinare la decomposizione spettrale di $\trasp AA = V D \trasp V$; - \item Calcolare la fattorizzazione $QR$ di $AV = UR$; -\end{enumerate} -Osserviamo ora che $\trasp R\trasp U U R = \trasp RR = \trasp V \trasp AA V = D$; $\trasp RR$ è quindi -la fattorizzazione di Cholesky di $D$. Si può mostrare che la diagonalità di $D$ implica che anche $R$ sia -diagonale e quindi $A = UR\trasp V$ è quasi la \svd\ di $A$. In effetti non abbiamo ancora considerato -il problema dell'ordine (vorremmo $\sigma_i \geq \sigma_j$ se $i \geq j$). -Questo problema sarebbe risolto nel momento in cui la colonna di $AV$ di norma maggiore fosse in prima posizione -(e conseguentemente le altre in ordine di norma discendente). -Possiamo quindi introdurre una opportuna matrice di permutazione $P$ e riscrivere la relazione -nel seguente modo -\[ - AVP = U\Sigma -\] -In questo modo la prima colonna di $AVP$ è quella di norma maggiore e quindi i $\sigma_i$ saranno -in ordine decrescente. - -\begin{os} - Per eseguire il procedimento sopra descritto abbiamo bisogno di conoscere la matrice $\trasp AA$, che tipicamente - può essere grande (ad esempio se $m \gg n$). Calcolare la sua decomposizione spettrale potrebbe introdurre - molti problemi di stabilità, e occupare molto spazio in memoria. Sarebbe quindi interessante trovare un - metodo per avere una decomposizione spettrale di $\trasp AA$ senza doverla effettivamente calcolare. -\end{os} - -Supponiamo ora di avere $U,V$ matrici ortogonali e $B$ matrice bidiagonale tali che -\[ - A = UB\trasp V -\] -allora si ha che -\[ - \trasp AA = \trasp V \trasp B B V -\] -e $\trasp B B$ è una matrice tridiagonale; avere la decomposizione spettrale di $\trasp B B$ è quindi equivalente -ad avere la decomposizione spettrale di $\trasp A A$! - -Sappiamo inoltre che calcolare la decomposizione spettrale di una matrice tridiagonale simmetrica è particolarmente -semplice. - -L'unico pezzo che manca è mostrare come è possibile calcolare le matrici $U$ e $V$ che bidiagonalizzano $A$. -Possiamo usare le matrici di Householder in questo modo: -\begin{enumerate}[(a)] - \item Calcoliamo $P_1$ tale che $P_1 Ae_1 = \alpha e_1$, e quindi $P_1A$ abbia la prima colonna - nulla ad eccezione dell'elemento in posizione $(1,1)$; - \item Calcoliamo $Q_1$ tale che $P_1 A Q_1$ abbia la prima riga nulla ad esclusione dei primi - due elementi (in posizione $(1,1)$ e $(1,2)$); - \item Iteriamo il procedimento sopra lavorando sulla seconda colonna e sulla seconda riga, e poi di seguito - per tutte le righe e colonne; -\end{enumerate} -Si verifica che il procedimento sopra porta effettivamente ad una matrice bidiagonale e che $\trasp BB$ -è tridiagonale simmetrica. - -Analizziamo ora il costo computazionale di questo procedimento. Il primo passo consiste nel calcolo delle -due matrici ortogonali che bidiagonalizzano $A$. Il costo di ogni passo del procedimento è il calcolo -di due matrici di Householder e quindi $O(n)$. Viene ripetuto $n$ volte fino ado ottenere un -costo complessivo di $O(n^2)$. Diventa poi $O(mn^2)$ perchè bisogna effettuare le moltiplicazioni. - -Analogamente il costo del calcolo degli autovalori con il metodo \qr\ è $O(n^2)$; il metodo richiederebbe -però di calcolare la matrice $\trasp BB$ che potrebbe essere piuttosto grande. In realtà esiste un metodo -(che qui non esponiamo) per applicare il metodo \qr\ a $\trasp BB$ senza calcolarla esplicitamente ma -conoscendo solamente $B$, lasciando il costo totale a $O(mn^2)$. - -Un problema da affrontare, infine, è quello dell'errore. Il teorema di Bauer-Fike (Teorema~\ref{te:BauerFike}) ci -assicura infatti che il problema del calcolo degli autovalori di una matrice simmetrica è ben condizionato, -ma assicurandoci solo una maggiorazione dell'errore assoluto, e non una dell'errore relativo. Sfortunatamente -nelle applicazioni si è spesso interessati a calcolare con precisione i valori singolari piccoli e questo -potrebbe essere un problema. Negli ultimi anni sono state sviluppate tecniche per il calcolo della \svd\ che -hanno tenuto conto di questo problema ma non sono ancora state implementate in programmi come \matlab\ o librerie -come \lapack. - - - diff --git a/capitolo4.tex b/capitolo4.tex deleted file mode 100644 index 6a68e56..0000000 --- a/capitolo4.tex +++ /dev/null @@ -1,346 +0,0 @@ -\chapter{Risoluzione di sistemi lineari} - -In questo capitolo affronteremo il tema della risoluzione dei sistemi lineari introducendo dei metodi -iterativi specifici per alcune classi di matrici particolarmente interessanti; queste individueranno -solitamente sistemi troppo grandi per essere risolti tramite metodi diretti e in cui la convergenza -dei metodo classici (Jacobi e Gauss Seidel) è quasi assente. - -\section{Sitemi lineari con matrici definite positive} - -\subsection{Metodo del gradiente} -Supponiamo di avere una matrice $A \in \mat{\R}{n}$ definita positiva ed un sistema lineare -\[ - Ax = b -\] -In molti casi pratici (come ad esempio nello studio delle Vibrazioni, vedi Sezione~\ref{sec:vibsistcont}) -ci si trova a risolvere sistemi lineari con matrici definite positive sparse o strutturate\footnote{in -cui in generale il costo del prodotto matrice vettore è basso} e in cui è conveniente usare un metodo -iterativo. - -Consideriamo la seguente funzione -\begin{equation} - \Phi(x) = \frac{1}{2} \trasp x A x - \trasp x b -\end{equation} -Osserviamo che il suo gradiente è dato dalla seguente espressione -\begin{equation} - \nabla \Phi(x) = Ax - b -\end{equation} -e quindi vale $0$ solo se $x$ è una soluzione del sistema lineare. Possiamo quindi riformulare la ricerca -della soluzione del sistema lineare come ricerca dei punti stazionari della funzione $\Phi$. -Possiamo osservare che se $\bar x$ è un punto stazionario per $\Phi$ allora calcolando la matrice -delle derivate seconde si ottiene esattamente $A$; ricordando che $A$ è definita positiva si può concludere -che $\bar x$ è un punto di minimo per $\Phi$ e quindi -\[ - A\bar x = b \iff \bar x = \min_{x \in \R^n} ( \Phi(x) ) -\] -In sintesi abbiamo ricondotto il problema della risoluzione del sistema lineare ad un problema di minimizzazione. -Ricordando che siamo alla ricerca di un metodo iterativo vorremmo affrontare il problema nel modo seguente -\begin{enumerate}[(a)] - \item Scegliamo un punto $x_0$ a caso; - \item Cerchiamo di determinare in che direzione si trova il minimo; - \item Ci spostiamo ponendo $x_1 = x_0 + \alpha_0v_0$ dove $v_0$ è la \emph{direzione di decrescita} - appena determinata e $\alpha_0$ un opportuno scalare; -\end{enumerate} - -I \emph{metodi del gradiente}, ovvero quei metodi basati sulle considerazioni appena fatte, assumono -nomi diversi a seconda della tecnica scelta per determinare la direzione di decrescita. - -\subsection{Il metodo del gradiente ottimo} -Una prima scelta piuttosto naturale per la direzione di decrescita nel punto $x_k$ potrebbe essere $-\nabla \Phi(x_k)$. -Ricordiamo infatti dall'analisi che il gradiente indica la direzione in cui la funzione ``cresce'' di più. -Questa scelta si dice del \emph{gradiente ottimo} ed è stata, storicamente, la prima ad essere implementata -e studiata. \\ -Una volta scelta la direzione dobbiamo determinare $\alpha_k$. Per fare questo studiamo la seguente funzione di -$\alpha$ che valuta $\Phi$ sulla retta\footnote{nel senso di retta affine} $x_k + \Span{v_k}$: -\[ - g(\alpha) = \Phi(x_k + \alpha v_k) -\] -Ricordando che vogliamo trovare il minimo di $\Phi$ e osservando che $g$ è convessa cerchiamo anche qui un punto -stazionario di $g$; questo sarà l'$\alpha_k$ che ci permette di ottenere il valore minimo di $\Phi$ sulla direzione -determinata da $v_k$. \\ -Otteniamo -\[ - g'(\alpha) = \alpha \trasp v_k A v_k + \trasp v_k (A x_k - b) = 0 -\] -e quindi ponendo $r_k = v - Av_k$ si ottiene -\[ - \alpha_k = \frac{\trasp v_k (-Ax_k + b)}{\trasp v_k A v_k} = \frac{\trasp v_k r_k}{\trasp v_k A v_k} -\] -Osserviamo in particolare che tenere traccia del valore di $r_k$ è utile per decidere quando -fermare il metodo. $||r_k|| = ||Ax_k - b||$ è indice di quanto siamo ``distanti'' dalla soluzione. - -Si è verificato che questo metodo è convergente per ogni scelta di $x_0$ però ci si è accorti che -non è la scelta migliore della direzione di decrescita. - -\subsection{Il metodo del gradiente coniugato} -Dopo l'introduzione del metodo del gradiente ottimo si è studiata un altro metodo di scelta, a cui -dobbiamo però premettere alcune definizioni. - -\begin{de} Data una matrice $A \in \mat{\R}{n}$ una $n$-upla di vettori $(p_1 \ldots p_n)$ di $\R^n$ - si dicono \emph{$A$-coniugati} se - \[ - \left[ \begin{array}{ccc} - \quad \trasp p_1 \quad \\ - \quad \vdots \quad \\ - \quad \trasp p_n \quad \\ - \end{array} \right] - A - \left[ \begin{array}{ccc} - \multirow{3}{*}{$p_1$} & \multirow{3}{*}{$\ldots$} & \multirow{3}{*}{$p_n$} \\ - & & \\ - & & - \end{array} \right] - = D - \] - dove $D$ è una matrice diagonale. -\end{de} - -\begin{os} \label{os:coniugli} - Se abbiamo una $n$-upla di vettore $A$-coniugati possiamo facilmente dire che sono linearmente -indipendenti. -\end{os} - -Vorremmo ora impostare l'iterazione in modo che i vettori $v_0, v_1, \ldots$ che definiscono le -direzioni di descrescita siano $A$-coniugati. Osserviamo in particolare che la condizione di -lineare indipendenza ci permette di dire che non possiamo fare più di $n$ iterazioni dove $n$ è -la dimensione della matrice $A$. Scopriremo, per fortuna, che questo è solo apparentemente un -problema. - -Dobbiamo ora trovare un metodo dati $v_1, \ldots, v_{k-1}$ vettori $A$-coniugati per determinare -$v_k$ tale che sia $A$-coniugato con tutti gli altri. Poniamo $v_k = r_k + \beta_k v_{k-1}$; -per avere la condizione di ortogonalità\footnote{secondo il prodotto scalare definito da $A$} -dovremo avere -\[ - (\trasp r_k + \beta_k\trasp v_{k-1}) A v_{k-1} = 0 -\] -e quindi -\[ - \beta_k = \frac{\trasp r_k A v_{k-1}}{\trasp v_{k-1} A v_{k-1}} -\] -Si può verificare che questa condizione non è solo necessaria ma anche sufficiente. Un successione di vettori -scelti in questo modo è infatti forzatamente $A$-coniugata\footnote{questo risultato non verrà dimostrato qui.} - -Avendo risolto il problema del trovare effettivamente la successione, ci chiediamo come affrontare -il limite al numero di iterazioni che ci è indicato Osservazione~\ref{os:coniugli}. Ci aiuta il -seguente -\begin{te} - Se ho $\{x_k\}_{k=1,\ldots,n}$ una successione di vettori che rispetti le condizioni osservate precedentemente con $x_0 = 0$ - allora per ogni $k$ si ha che - \[ - \Phi(x_k) = \min_{x \in \Span{v_0, \ldots, v_k-1}}(\Phi(x)) - \] - ed in particolare dopo $n$ iterazioni $\Phi(x_n)$ è il minimo assoluto di $\Phi(x)$. -\end{te} -Questo teorema ci dice, in particolare, che questo metodo iterativo è in realtà un metodo diretto, ovvero -è convergente in un numero finito di passi per ogni scelta di punto iniziale. - -Poniamo ora $e_k = x_k - x$ l'errore al passo $k-esimo$. Il teorema sopra ci dice che $e_n = 0$ ma ci chiediamo -come si comporta $e_k$ mentre $k$ si avvicina $n$. Non dobbiamo infatti dimenticare che questo è un metodo -iterativo e quindi in molti casi pratici saremo interessati a fermarci prima di avere la convergenza totale. -Esiste un altro teorema che ci dà un risultato piuttosto preciso sulla velocità di convergenza -\begin{te} - Sia $||\cdot||_A$ la norma indotta dalla matrice $A$\footnote{ricordiamo che questa è definita nel seguente modo - $||x||_A := \sqrt{\trasp x A x}$} - ; allora per ogni $k$ e per ogni scelta iniziale di $x_0$ si - ha - \[ - ||e_k||_A \leq \left( \frac{2\sqrt{\cond{A}}}{\sqrt{\cond{A}} - 1} \right)^{k} ||e_0||_A - \] -\end{te} -Ancora una volta la velocità di convergenza dipende dal condizionamento della matrice del problema. Per -matrici con un piccolo condizionamento questa è molto veloce, mentre per matrici con condizionamento -più grande potrebbe diventare lenta. - -\subsection{Precondizionamento} -Supponiamo di avere una matrice $A$ definita positiva che individua un problema mal condizionato, in cui la velocità -di convergenza del metodo del gradiente coniugato è molto lenta. - -Sappiamo dai risultati di Analisi Numerica che non possiamo riuscire a risolvere con precisione -un sistema mal condizionato; ci chiediamo però se sia possibile perlomeno risolverlo velocemente, -pur con la consapevolezza che i risultati saranno molto imprecisi. - -La risposta è sì e l'idea è usare un \emph{precondizionamento}, ovvero analizzare un altro problema -che si ottiene dal primo moltiplicandolo a destra e/o a sinistra per delle altre matrici rendendolo -ben condizionato. Ovviamente i risultati finali risentiranno del cattivo condizionamento del problema -iniziale, ma la velocità di convergenza sarà elevata. - -Dato il sistema $Ax = b$ consideriamo il seguente -\[ - LA\trasp L {\trasp L}^{-1} x = L b -\] -che è equivalente. Osserviamo poi che $LA\trasp L$ è simile a $L^{-1}( L A \trasp L) L$ e quindi -a $A\trasp L L$. Ricordiamo ora che il condizionamento della matrice è dato da $\frac{\lambda_{max}}{\lambda_{min}}$ -e cerchiamo quindi una matrice $M = \trasp L L $ tale che gli autovalori di $A \trasp LL $ siano molto vicini -\footnote{e quindi il loro rapporto sia molto vicino ad $1$, che è il valore minimo in cui possiamo sperare -per il condizionamento di una matrice}. - -Osserviamo che se fosse possibile, ad esempio, scegliere $M = A^{-1}$ allora avremmo la situazione migliore possibile. -Evidentemente però questa non è un opzione, perché se fossimo a conoscenza di $A^{-1}$ avremmo già -completamente risolto il nostro problema. In ogni caso, però, un buon precondizionamento si ottiene cercando -di approssimare un'inversa di $A$. - -Non ci occuperemo in questo corso di tecniche di precondizionamento che sono varie e a volte complesse. -Sottolineamo solo alcune problematiche che potrebbero nascere usando questo approccio -\begin{enumerate}[(a)] - \item Per come abbiamo definito le matrici in gioco, $M$ dovrebbe essere definita positiva; in realtà - esiste un modo per ovviare a questo problema, ma non verrà esposto qui; - \item Una volta trovata $M$ (che potrebbe essere un'operazione complicata) dovremmo trovare anche - $L$ e quindi fare una fattorizzazione; ancora una volta, esiste un modo per ignorare il fatto che esista - la matrice $L$ ed usare solo $M$; - \item Se $A$ è una matrice strutturata, saremo probabilmente interessati a mantenerne la struttura. Questo si può - fare accontentandosi di approssimazioni dell'inversa piuttosto vaghe, ma poco invasive (come ad esempio una matrice diagonale); -\end{enumerate} - -\section{Matrici strutturate} -Uno dei punti cardine nell'applicazione dei metodi per la soluzione dei sistemi lineari sarà riuscire a -sfruttare la struttura delle matrici con cui dovremo operare. - -\subsection{Le matrici di Toeplitz} \label{subsec:toeplitz} -Molte delle matrici con cui avremo a che fare risolvendo sistemi lineari in pratica sono matrici di Toeplitz. -\begin{de} - Sia $A$ una matrice $n \times n$; $A$ si dice di \emph{Toeplitz} se le sue diagonali sono costanti, ovvero se per - ogni $i,j$ e per ogni $k \in \Z$ per cui ha senso - \[ - a_{ij} = a_{i+k,j+k} - \] -\end{de} -Queste matrici hanno una struttura molto particolare, ed esiste un modo piuttosto comodo di effettuare il -prodotto matrice per vettore. Consideriamo il caso seguente con una matrice di Toeplitz triangolare inferiore -\[ - \left[ \begin{array}{cccc} - t_0 & & & \\ - t_1 & \ddots & & \\ - \vdots & \ddots & \ddots & \\ - t_n & \cdots & t_1 & t_0 \\ - \end{array} \right] - \left[ \begin{array}{c} - p_0 \\ - p_1 \\ - \vdots \\ - p_n - \end{array} \right] -= \left[ \begin{array}{l} - t_0p_0 \\ - t_1p_0 + t_0p_1 \\ - \vdots\\ - t_np_0 + t_{n-1}p_1 + \ldots + t_0p_n - \end{array} \right] -\] -Si osserva che il vettore che si ottiene ha i coefficienti che sono quelli del prodotto di questi due polinomi -\[ - \left\{ \begin{array}{lll} - t(x) &=& t_0 + t_1 z + \ldots + t_n z^n \\ - p(x) &=& p_0 + p_1 z + \ldots + p_n z^n - \end{array} \right. -\] -Possiamo quindi calcolare il prodotto matrice vettore nello stesso modo in cui calcoleremmo i coefficienti del -polinomio prodotto, ovvero con la trasformata discreta di Fourier. - -Avremo quindi un costo delle moltiplicazione $O(n\log(n))$\footnote{utilizzando la \fft.} e quindi -un costo complessivo del metodo del gradiente coniugato di $O(n^2\log(n))$. - -% TODO: Inserire gli esempi delle applicazioni del metodo del gradiente a qualche caso particolare -% di matrici, come ad esempio le matrici elementari e le matrici con nugoli di autovalori appiccicati. - - -\subsection{Matrici di Toeplitz tridiagonali simmetriche} -Vorremmo ora mostrare un'analisi di un caso paricolare, ovvero dei sistemi lineari con -una matrice di Toeplitz simmetrica tridiagonale. \\ -Questo è ad esempio il caso che discretizza il problema differenziale $\triangle u = f$ nel caso di -$u$ in una variabile reale. Le conclusione che otteremo su questo caso particolare ci permetteranno poi -di analizzare anche i casi in più variabili. - -Supponiamo ora di avere una qualsiasi matrice $T$ tridiagonale simmetrica di Toeplitz di dimensione $n$; chiamiamo $a$ gli -elementi sulla diagonale e $b$ quelli sulla sotto e sopradiagonale\footnote{in effetti queste due scelte -individuano completamente la matrice di cui stiamo parlando.}. \\ -Siamo interessati a studiare le proprietà spettrali di questa matrice per poter dare una stima -del suo condizionamento in norma 2, che come abbiamo visto influenza la convergenza del metodo del -gradiente coniugato. - -Osserviamo ceh se $\lambda$ è un autovalore per $T$ allora la matrice $T - \lambda I$ deve essere singolare -e in particolare deve esistere una soluzione non banale del sistema lineare -\[ - (T - \lambda I)x = 0 \iff \left[ \begin{array}{ccccc} - a - \lambda & b & & & \\ - b & a -\lambda & b & & \\ - & \ddots & \ddots & \ddots & \\ - & & b & a - \lambda & b \\ - & & & b & a - \end{array} \right] - \left[ \begin{array}{c} - x_1 \\ - x_2 \\ - \vdots \\ - x_{n-1} \\ - x_n - \end{array} \right] = -\left[ \begin{array}{c} - 0 \\ - 0 \\ - \vdots \\ - 0 \\ - 0 - \end{array} \right] -\] -Preso un qualsiasi $j$ compreso fra $2$ e $n-1$ possiamo scrivere la relazione sopra come -\[ - bx_{j-1} + (a- \lambda)x_j + bx_{j+1} = 0 -\] -Ponendo $x_0 = x_{n+1} = 0$ la relazione vale anche per $j = 1$ e $j=n$. Apparentemente non abbiamo -chiarito molto e trovare una soluzione esplicita sembra complicato. Possiamo però provare a porre -$x_j = x^{j}$, e vedere se riusciamo a trovare una soluzione particolare di questo tipo. Sostituendo -nelle relazioni sopra (per $j$ fra $2$ e $n-1$) si ottiene -\[ - bx^{j-1} + (a- \lambda)x^j + bx^{j+1} = 0 -\] -e ricordando che l'autovettore non può essere nullo e quindi $x^j \neq 0$ per ogni $j$, questa è soddisfatta -se e solo se -\[ - b + (a-\lambda)x + bx^2 = 0 \iff 1 + \frac{a - \lambda}{b} + x^2 = 0 -\] -Passiamo ora ad analizzare il caso che ci interessa, ovvero $a = 2$ e $b = 1$\footnote{ovvero la matrice che discretizza -il problema differenziale di Laplace.}; per il terzo teorema di Gerschgorin sappiamo che $|\lambda - 2| < 2$ e -quindi -\[ - \left| \frac{a - \lambda}{b} \right|< 2 -\] -Possiamo allora porre $\frac{a - \lambda}{b} = -2 \cos\theta$ per $\theta \in (0,\pi)$ e otteniamo l'equazione -\[ - 1 - 2x\cdot\cos \theta + x^2 = 0 -\] -Risolvendola otteniamo -\[ - x_{1,2} = \cos \theta \pm \sqrt{\cos^2\theta - 1} = \cos \theta \pm i \cdot \sin \theta = e^{\pm i \theta} -\] -Abbiamo quindi ottenuto due soluzioni che andrebbe bene per tutte le $j = 2, \ldots, n-1$ ma nessuna delle due -soddisfa le condizione per $j = 0$ e $j = n$. Osserviamo però che una qualsiasi combinazione lineare -$\alpha x_1 + \beta x_2$ soddisfa le condizione interne, e cerchiamo quindi di determinare $\alpha$ e $\beta$ -in modo che anche le condizioni al contorno siano soddisfatte. Si ottiene -\[ - x_0 = 0 = \alpha + \beta -\] -e quindi $\beta = -\alpha$; ponendo poi $j = n+1$ si ottiene -\[ - x_{n+1} = 0 = \alpha e^{i\cdot(n+1) \theta} - \alpha e^{-i \cdot (n+1) \theta} = \alpha( 2 i \sin ((n+1)\theta) ) -\] -e quindi $\theta_k = \frac{k\pi}{n+1}$ con $k = 1, \ldots, n$. Abbiamo trovato quindi $n$ autovettori distinti -e siamo in grado di calcolare i relativi autovalori ricordando che -\[ - \frac{a - \lambda_k}{b} = -2 \cos \theta_k = -2 \cos (\frac{k\pi}{n+1}) \Rightarrow \lambda_k = a + 2b\cos \theta_k -\] -Se costruiamo la matrice degli autovettori -\[ - U = \left[ \begin{array}{c|c|c|c} - \multirow{3}{*}{$x_1$} & \multirow{3}{*}{$x_2$} & \multirow{3}{*}{$\ldots$} & \multirow{3}{*}{$x_n$} \\ - & & & \\ - & & & - \end{array} \right] -\] -possiamo osservare che $\trasp UU = D$ con $D = \gamma I$. Abbiamo quindi che $U$ è quasi unitaria, in particolare -$\frac{1}{\gamma} U$ lo è. Inoltre possiamo osservare che gli elementi di $U$ non dipendono da $a$ e da $b$ e che -$u_{ij} = \sin(\frac{ij\pi}{n+1}) = u_{ji}$ e quindi $U$ è simmetrica. In altre parole abbiamo una decomposizione -spettrale $T = UDU$ dove tutta l'informazione sulla matrice è contenuta nella parte diagonale. - -Osserviamo infine che $D = \diag{a + 2b\cos(\theta_1) , \ldots, a + 2b \cos(\theta_n)}$ e quindi l'autovalore più -piccolo è $a + 2b\cos(\theta_1)$. - diff --git a/capitolo5.tex b/capitolo5.tex deleted file mode 100644 index 2f3a9ec..0000000 --- a/capitolo5.tex +++ /dev/null @@ -1,267 +0,0 @@ -\chapter{Calcolo degli autovalori di matrici strutturate} - -Abbiamo visto nell'analisi dei sistemi lineari vari metodi per utilizzare la struttura -delle matrici per ottimizzare il procedimento e diminuire il costo computazionale. \\ -Questo in generale è più difficile nel calcolo degli autovalori. L'unica struttura che siamo finora -riusciti a sfruttare per abbassare il costo è stata la tridiagonalità. - -\section{Strutture note} -In generale si parla di matrice strutturata quando una matrice è individuata da un numero di -parametri dell'ordine minore di $n^2$. \\ -Ricapitoliamo le strutture principali viste fino ad ora e i relativi vantaggi nella risoluzione -di sistemi lineari. -\begin{description} - \item[Matrici sparse] Parliamo di matrici sparse quando ci sono pochi elementi non nulli, ovvero un numero - con un ordine di grandezza strettamente inferiore a $n^2$. In questo caso riusciamo spesso ad ottimizzare - i metodi di moltiplicazione matrice per vettore e quindi possiamo trarre vantaggio dall'applicazione - di metodi iterativi; - - \item[Van der Monde] Non abbiamo analizzato in dettaglio\footnote{ad eccezione delle matrici di Fourier per il calcolo - della \dft, dove si riesce a scendere ad un costo $O(n\log n)$.} queste matrici ma esiste un metodo (tramite un'opportuna - rappresentazione dell'inversa) per risolvere un sistema lineare con un costo $O(n^2)$. - - \item[Toeplitz o H\"ankel] Abbiamo visto queste matrici nella Sezione~\ref{subsec:toeplitz} e tramite la - trasformata discreta di Fourier abbiamo mostrato che il costo del prodotto matrice vettore è molto basso. - Possiamo quindi ipotizzare di applicare dei metodi iterativi per risolvere il sistema. - - \item[Diagonali con correzione di rango 1] Queste martici sono piuttosto interessanti e sono le prime di - cui ci occuperemo. Sono appunto composte dalla somma di una matrice diagonale $D$ con una matrice di rango $1$ - $u\trasp u$; -\end{description} - -\section{Il metodo di Lanczos} -\subsection{Un'alternativa al metodo di Householder} -Introduciamo ora un metodo alternativo a quello di Householder per la tridiagonalizzazione di una -matrice simmetrica. \\ -Osserviamo che se $A$ è una matrice simmetrica in $\mat{\R}{n}$, allora esiste una matrice $T \in \mat{\R}{n}$ -tridiagonale simmetrica e una matrice unitaria $Q$ tali che -\[ - A = QT\trasp Q -\] -e quindi anche -\[ - AQ = QT -\] -Osserviamo ora solo la prima colonna di quest'uguaglianza, ovvero $AQe_1 = Aq_1 = QTe_1$. Se scriviamo -\[ - T = \left[ \begin{array}{cccc} - \alpha_1 & \beta_1 & & \\ - \beta_1 & \ddots & \ddots & \\ - & \ddots & \ddots & \beta_{n-1} \\ - & & \beta_{n-1} & \alpha_n \\ - \end{array} \right] -\] -Possiamo riscrivere la relazione come $Aq_1 = \alpha_1 q_1 + \beta_1 q_2$ e, una volta scelto $q_1$ vettore -di norma $1$, -si ha che $\trasp q_1 A q_1 = \alpha_1 \trasp q_1 q_1 + \beta_1 \trasp q_1 q_2 = \alpha_1$; possiamo quindi -calcolare $\alpha_1$ da cui possiamo poi ricavare $\beta_1$ considerando che $\beta q_2 = Aq_1 - \alpha_1 q_1$ -e quindi -\[ -\beta_1 = ||Aq_1 - \alpha_1 q_1||_2 \qquad \text{e} \qquad q_2 = \frac{Aq_1 - \alpha_1 q_1}{\beta_1} -\] -Ripetendo il procedimento con la seconda colonna (ora che conosciamo $q_2$) e poi continuando ancora si ottiene -la regola generale -\[ - \alpha_i = \trasp q_i A q_i \qquad \beta_i = ||Aq_i - \alpha_i q_i||_2 \qquad q_{i+1} = \frac{Aq_i - \alpha_i q_i}{\beta_i} -\] -e si può quindi ricostruire tutta la matrice $Q$ e la matrice $T$. - -Il costo computazionale dominante nello svolgimento di queste operazioni è dato dai prodotti matrice vettore -che costano generalmente $O(n^2)$ e portano quindi ad un costo complessivo del metodo di $O(n^3)$ (lo stesso -costo del metodo di Householder). \\ -Questo metodo non viene però generalemente utilizzato per calcolare la tridiagonalizzazione. Il motivo è che -non è numericamente stabile, ed in generale la matrice $Q$ ottenuta non è ortogonale. - -\begin{os} - A questo punto è naturale chiedersi che rapporto esiste fra la matrice calcolata con il metodo di Householder - e quella calcolata con il metodo di Lanczos, al variare del primo vettore $q_1$ scelto all'inizio. La risposta - che è possibile verificare è che scegliendo $q_1 = e_1$ le matrici differiscono per una matrice di fase. -\end{os} - -Nonostante in generale il metodo non venga usato per la sua poca precisione esiste un particolare caso in cui -risulta essere utile, ed è precisamente il seguente - -\subsection{Il quoziente di Rayleigh} -Cominciamo con una definizione -\begin{de} - Si dice \emph{quoziente di Rayleigh di $A$ e $x$} e si indica con $\ray{A}{x}$ lo scalare - \[ - \ray{A}{x} = \frac{\trasp x A x}{\trasp xx} - \] -\end{de} -Si può osservare che il minimo del quoziente di Rayleigh su tutto $\R^n$ corrisponde al modulo dell'autovalore minimo -e il massimo al modulo dell'autovalore massimo. \\ -Osserviamo poi che preso un generico sottospazio $k$-dimensionale $S \subseteq \R^n$ abbiamo che se -\[ - \lambda = \min_{x \in S} \ray{A}{x} -\] -allora $\lambda$ è l'autovalore di modulo minimo su un sottospazio di $\R^n$. Se $S$ è sufficientemente grande -possiamo pensare di usare $\lambda$ come approssimazione di $\lambda_{min}$. \\ -Consideriamo $\{ q_1 , \ldots, q_k \}$ base del sottospazio $S$ e la matrice $Q$ con i vettori $q_i$ come colonne. -Se prendiamo $x \in S$ allora -\[ -x = \sum_{i=1}^{k} \alpha_i q_i -\] -e quindi se $\alpha = (\alpha_1, \ldots, \alpha_k)$ si ha $x = Q\alpha$. -\[ -\frac{\trasp x A x}{\trasp xx} = \frac{\trasp \alpha \trasp Q A Q \alpha}{\trasp \alpha \trasp Q Q \alpha} = - \frac{\trasp \alpha \trasp Q A Q \alpha}{\trasp \alpha \alpha} -\] -In conclusione è sufficiente minimizzare $\ray{\trasp Q A Q}{x}$ su $\R^k$, ed essendo $\trasp Q A Q$ una matrice -$k \times k$ questo procedimento può risultare sensibilmente più economico rispetto all'idea originale. \\ -\begin{de} - Data una matrice $A$ a coefficienti reali\footnote{definiamo il procedimento sui numeri reali solo per non appesantire - la notazione, ma non c'è nessuna restrizione ad usarlo sui complessi.} e $x$ un vettore di $\R^n$. - Si dice \emph{sottospazio di Krylov} di $A$ e $v$ di ordine $j$ e si indica con $\kryl{A}{v}{j}$ il sottospazio - \[ - S = \Span{v, Av, \ldots, A^{j-1}v} - \] -\end{de} -Osserviamo che in generale $\dim{S} \leq j$. \\ -Siamo ora interessati ad utilizzare un sottospazio di Krylov come sottospazio $S$ con cui approssimare il nostro autovalore. -Per farlo però dobbiamo trovare una base ortonormale di $S$; possiamo procedere calcolando la scomposizione \qr\ della -matrice dei vettori che generano: -\[ - \left[ \begin{array}{c|c|c|c} - \multirow{4}{*}{$v$} & \multirow{4}{*}{$Av$} & \multirow{4}{*}{$\ldots$} & \multirow{4}{*}{$A^{j-1}v$} \\ - & & & \\ - & & & \\ - & & & \\ - \end{array} \right] = QR -\] -Si può mostrare che le prime $j$ colonne di $Q$ sono una base dello spazio $S$. Per farlo è sufficiente osservare -che essendo $R$ triangolare superiore e $n \times j$ con $j < n$ deve avere le ultime $n - j$ righe nulle. \\ -Calcolando ora $\trasp Q A Q = (b_{ij})$ si ottiene un matrice $k\times k$ simmetrica. Osserviamo in particolare -che se $i < j+1$ allora $b_{ij} = \trasp q_i A q_j$ e $Aq_j \in \Span{v, Av, \ldots , A^{j-1}v}$ per costruzione. -In particolare $Aq_j$ è ortogonale a $q_i$ e quindi $b_{ij} = 0$. La simmetria della matrice ci permette -di concludere che $B$ è tridiagonale, e si può verificare che è la matrice $k\times k$ generata dal metodo -di Lanczos dopo $k-1$ iterazioni. \\ -A questo punto si può supporre di avere una buona approssimazione dell'autovalore di modulo massimo (anche se -non c'è nessuna garanzia di averla davvero). Questa è di fatto l'unica applicazione del metodo di Lanczos, -data la sua instabilità numerica. - -\section{Matrici con struttura di rango}\label{sec:struttura_di_rango} -\subsection{Qualche esperimento con il metodo \qr} -Abbiamo spesso incontrato durante il corso matrici diagonali con correzioni di rango 1, -ovvero della forma $D + u\trasp u$. Queste -sono molto interessanti perché si ritrovano in molti problemi computazionali e perché sono inverse -di matrici tridiagonali. \\ -Ci domandiamo ora se esiste un metodo efficiente per applicare il Metodo~\qr\ a queste matrici. -Sappiamo di poterle tridiagonalizzare con matrici di Householder con un costo computazionale $O(n^2)$, ma -vogliamo provare ad applicare il \qr\ alla matrice piena senza dover necessariamente passare -per il procedimento di tridiagonalizzazione\footnote{Abbiamo fatto notare nella Sezione~\ref{subsec:qr_costo} che -in generale non è conveniente applicare il metodo ad una matrice piena; cercheremo però di trovare -qualche via più breve per questa particolare classe di matrici.}. \\ -Possiamo osservare sperimentalmente che facendo qualche passo del metodo \qr\ (anche utilizzando lo shift) -la struttura non viene completamente persa. - -Indichiamo con $\alpha_k$ il rango massimo delle sottomatrici quadrate strettamente contenute nella parte -inferiore della matrice della $k$-esima iterazione del \qr, e con $\beta_k$, analogamente, il rango massimo -di quelle superiori. - -\textbf{Esperimento 1}: Supponiamo di scegliere una matrice qualsiasi (complessa) e di applicare -il metodo. Osserveremo che $\alpha_0 = \alpha_1 = \ldots = \alpha_k = 1$ -mentre $\beta_k$ cresce. - -\textbf{Esperimento 2}: Supponiamo ora di restringere la scelta ad una matrice con $D$ reale, ovvero -$A = D + u\trasp u$ dove $D = \diag{\gamma_1, \ldots, \gamma_n}$ e i $\gamma_i$ sono tutti reali. Allora -otterremo sperimentalmente $\alpha_i = 1$ e $\beta_i = 3$ per ogni $i \geq 2$. - -\textbf{Esperimento 3}: Analogamente a prima scegliamo $D$ complessa ma con elementi di modulo $1$\footnote{ovvero -quella che abbiamo chiamato \emph{matrice di fase}.}. Otterremo ancora una volta $\alpha_i = 1$ e $\beta_i = 3 \: -\forall i \geq 2$. - -Come mai i $\beta_k$ in questi ultimi due casi non crescono più di $3$? Cerchiamo di rispondere analizzando separatamente -i vari casi. - -\subsection{Conservazione del rango nella parte triangolare inferiore} -Ricordiamo dall'Osservazione~\ref{os:qr_simili_ak} che le matrici $A_k$ generate dal metodo \qr\ sono -simili per trasformazione ortogonale. Se assumiamo che $R_k$ sia invertibile possiamo anche mostrare -qualcosa di più -\[ - A_{k+1} = R_k Q_k + \alpha_k I = R_k Q_k R_k R_k^{-1} + \alpha_k R_k R_k^{-1} = R_k A_k R_k^{-1} -\] -e quindi $A_{k+1}$ è simile ad $A_k$ tramite una trasformazione con una matrice triangolare superiore -$R_k$. Questo ci assicura che nella parte inferiore della matrice $A_{k+1}$ il rango venga conservato -(nel senso degli $\alpha_k = 1$). - -%% TODO: Spiegare perché il rango si conserva, da fare quando anche io lo avrò capito. - -\subsection{Limitazione del rango nella parte triangolare superiore} -Ci occuperemo ora di spiegare perché il rango di tutte le sottomatrici strettamente contenute nella -parte triangolare superiore è limitato superiormente da $3$, sia nel caso in cui $D$ sia una matrice -reale, sia in quello in cui sia una matrice di fase. Consideriamo il primo e osserviamo cosa succede -al primo passo del metodo. Poniamo $A_0 = D + u\trasp v$; si ha che: -\[ - A_1 = \herm{Q_1} A_0 Q_1 = \herm{Q_1}(D+ u\trasp v)Q_1 = \herm{Q_1} DQ_1 + u_1\trasp{v_1} -\] -Ricordando che $D$ è reale si può concludere che $\herm{Q_1}DQ_1$ è hermitiana e diagonale; -possiamo quindi scrivere il $k$-esimo passo del metodo in questo modo -\[ - A_{k+1} = H_{k+1} + u_{k+1}\trasp v_{k+1} -\] -dove $H_{k+1}$ è una matrice hermitiana. In particolare si ha $H_{k+1} = A_{k+1} - u_{k+1}\trasp v_{k+1}$. -Da quanto visto prima sappiamo che il rango nella parte inferiore di $H_{k}$ non può superare $2$. -Ricordando che $H_k$ è hermitiana si può concludere che il rango è al massimo $2$ nella parte superiore. -Osservando nuovamente che $A_k = H_k + u_k\trasp v_k$ si ottiene che il rango di $A_k$ nella parte superiore -non può superare $3$ e si ha quindi la tesi. - -La stessa cosa si può mostrare che quando la matrice diagonale $D$ è una matrice di fase. Ci sono due -procedure possibile per effettuare la dimostrazione; una è scrivere $D = QR$ ed osservare che data -l'hermitianità di $D$ si ottiene che $R$ deve forzatamente essere una matrice di fase. Questa via -richiede però tediosi passaggi molto contosi che quindi non svolgeremo. Un'alternativa più elegante -è utilizzare il \emph{Nullity theorem}, dimostrato attorno al 1960. Questo però non fa parte del -programma del corso e quindi non seguiremo neanche questa via. - -\subsection{Metodo \qr\ per il calcolo delle radici dei polinomi} -Il motivo principale (e storicamente il primo) per cui ci si è interessati a queste matrici -è stato la ricerca delle radici dei polinomi tramite l'uso delle matrici Companion. \\ -Le matrici Companion hanno una struttura come la seguente: -\[ -F = \left[ \begin{array}{cccc} - 0 & \cdots & \cdots & \times \\ - 1 & \ddots & & \vdots \\ - &\ddots & 0 & \times \\ - & & 1 & \times - \end{array} \right] -\] -La matrice $F$ si può scrivere come una matrice unitaria più una correzione di rango $1$ nel seguente modo -\[ -F = Q + u\trasp e_n = \left[ \begin{array}{cccc} - 0 & & & 1 \\ - 1 & \ddots & & \\ - & \ddots & \ddots & \\ - & & 1 & 0 \\ - \end{array} \right] -+ \left[ \begin{array}{cccc} - \: &\: &\: & v_1 \\ - & & & \vdots \\ - & & & \vdots \\ - & & & v_n \\ - \end{array} \right] -\] -e quindi sarebbe conveniente poter applicare delle ottimizzazioni al \qr\ sfruttando le osservazioni fatte -sul rango delle matrici contenute nella parte inferiore e superiore della matrice che viene iterata. - -Supponendo di voler determinare le radici del polinomio $p(x) = p_0 + p_1x + \ldots + p_nx^n$ si ottiene -la matrice -\[ -F = \left[ \begin{array}{cccc} - 0 & \cdots & \cdots & \frac{-p_0}{p_n}\\ - 1 & \ddots & & \vdots \\ - &\ddots & 0 & \vdots \\ - & & 1 & \frac{p_{n-1}}{p_n} - \end{array} \right] -\] -In generale, affrontando il problema della ricerca degli autovalori, usiamo il teorema di Bauer-Fike (Teorema~\ref{te:BauerFike}) -per assicurarci di ottenere il risultato con una buona approssimazione. Questo però non è sempre sufficiente -se $p_n$ è piccolo, perché la norma della matrice può crescere arbitrariamente. Come affrontare questo problema? - -Una soluzione può essere evitare di ricondursi ad un problema agli autovalori analizzando il seguente \emph{problema -generalizzato agli autovalori}\footnote{In generale si dice \emph{problema generalizzato agli autovalori} un problema -del tipo $\deter{A - \lambda B} = 0$. Se $B$ è invertibile questo può sempre essere ricondotto a trovare gli -autovalori di $B^{-1}A$, ma non sempre è conveniente. }: -\[ - \deter{F - \lambda I} = 0 \iff \deter{p_n F - \lambda( I + p_n e_n\trasp e_n)} = 0 -\] -Parleremo dei possibili metodi per analizzare questo problema nel Capitolo~\ref{cap:autovalori_generalizzato}. \ No newline at end of file diff --git a/capitolo6.tex b/capitolo6.tex deleted file mode 100644 index fa796d7..0000000 --- a/capitolo6.tex +++ /dev/null @@ -1,32 +0,0 @@ -\chapter{Problema generalizzato agli autovalori} \label{cap:autovalori_generalizzato} -Vorremmo in questo capitolo analizzare\footnote{in realtà ci accontenteremo di dare uno sguardo -al problema, perché non avremo tempo per approfondirlo veramente.} il problema generalizzato -agli autovalori. In altre parole, date due matrici $A$ e $B$ vogliamo trovare i possibili -$\lambda$ tali che -\[ - \deter{ A - \lambda B} = 0 -\] - -\section{Il caso delle matrici Companion} -Ispirati dal problema visto alla fine della Sezione~\ref{sec:struttura_di_rango} analizziamo -il problema nel caso con $A$ in forma di Hessenberg e $B$ triangolare superiore. \\ -Per cercare di non peggiorare il condizionamento del problema sarebbe preferibile lavorare -unicamente con trasformazioni unitarie. Cerchiamo di generare una sequenza di matrici -$A_k$ e $B_k$ tali che -\[ - \deter{A - \lambda B} = 0 \iff \deter{A_k - \lambda B_k} = 0 \quad \forall k \in \N -\] -Nel nostro caso vogliamo anche mantenere le proprietà di struttura della matrice, ovvero -vorremmo che $A_k$ sia sempre in forma di Hessenberg e che $B_k$ sia sempre in forma -triangolare superiore. Cerchiamo delle matrici unitarie $U_k$ e $Q_k$ in modo da definire -la seguente successione -\[ - \left\{\begin{array}{lcl} - A_{k+1} &=& U_kA_kQ_k \\ - B_{k+1} &=& U_kB_kQ_k - \end{array} \right. -\] -e scegliendo opportunamente le matrici in modo che $A_k$ e $B_k$ siano rispettivamente -Hessenberg e triangolare superiore. \\ -Se queste condizioni sono soddisfatte allora $A_k - \lambda B_k$ è singolare solo se -$a_{jj}^{(k)} - \lambda b_{jj}^{(k)} = 0$ per qualche $j$, ovvero solo se $\lambda = \frac{a_{jj}^{(k)}}{b_{jj}^{(k)}}$ diff --git a/introduzione.tex b/introduzione.tex deleted file mode 100644 index 5c40723..0000000 --- a/introduzione.tex +++ /dev/null @@ -1,64 +0,0 @@ -\chapter{Note per il lettore} - -\section{Introduzione} -Questi appunti sono stati scritti durante il primo semestre dell'Anno Accademico 2009-2010, -mentre seguivo le lezioni di \emph{Calcolo Scientifico} tenute dal prof.~Gemignani e le relative -esercitazione tenute dal prof.~Bini. \\ -Ho scritto gli appunti in \LaTeXe\ durante il corso in modo da poterlo fare con calma, ma con -una carenza (probabilmente) della visione ``globale'' che avrei avuto scrivendoli a posteriori. -In ogni caso spero che possano essere utili a chi nei prossimi anni seguirà lo stesso corso, e sono -disponibile ad integrare correzioni ed estensioni di chi avesse voglia di scriverle e spedirmele. -La versione più aggiornata di questi appunti si può trovare sul repository Git che mantengo su Poisson -(il server degli studenti presos l'Università di Pisa). Potete trovare le istruzioni per ottenere il -sorgente \LaTeX\ sulla mia pagina Web (\href{http://poisson.phc.unipi.it/~robol/}{http://poisson.phc.unipi.it/\textasciitilde robol/}) e siete -liberi di spedirmi qualsiasi patch e/o qualsiasi critica e commento all'indirizzo email -\verb-leo@robol.it- oppure \verb-robol@poisson.phc.unipi.it-. - -\section{Struttura del documento} -Questi appunti si dividono in due parti -\begin{description} - \item[Parte I -- Teoria] In questa parte sono riportate le lezioni del prof.~Gemignani che espongono - i concetti teorici principali del corso. Saranno generalmente (abbastanza) rigorose e precise; - \item[Parte II -- Esercitazione] In questa seconda parte sono riportate le lezioni del prof.~Bini, divise - per argomento. In queste lezioni abbiamo affrontato alcuni problemi che ci hanno portato ad implementare - algoritmi ottenuti nella parte di teoria. Per ogni problema affrontato sono stati proposti vari modelli - ed è stata fatta una trattazione sufficiementemente completa. Sono riportate in questa sezione sia - la considerazioni sui modelli, che qualche teorema, che le implementazioni effettive degli algoritmi. - Durante il corso del prof. Bini abbiamo usato il linguaggio Fortrano 95 e quindi gli esempi saranno - esposti con quel linguaggio. Sto comunque valutando l'opportunità di esporre anche qualche algoritmo in - qualche linguaggio diverso. - \item[Parte III -- Appendice] Tutte le cose che in realtà non fanno strettamente parte del corso ma - che potrebbero essere utili per comprendere meglio quello che si trova scritto in questi appunti. Ci - si trova ad esempio, una breve introduzione al linguaggio Fortran che è usato nella parte II per - implementare gli algoritmi. -\end{description} - -\section{Notazione} -Questa è una tabella riassuntiva dei simboli che sono dati per scontato nel testo, oppure che vengono -spiegati e poi usati in seguito. Per la maggior parte sono ovvi, ma \ldots giusto per fissare la notazione!\\ -\begin{tabular}[t]{|l|p{12cm}|} - \hline \hline - $\dom{f}$ & Dominio della funzione $f$ \\ - $\imm{f}$ & Immagine della funzione $f$ \\ - $A \in \matr{\C}{m}{n}$ & $A$ è una matrice a coefficienti complessi di dimensione $m \times n$; la stessa - notazione verrà usata al variare del campo \\ - $A = (a_{ii})$ & $A$ è una matrice i cui elementi valgono $a_{ii}$ al variare di $i$ da $1 \ldots n$ dove - $n$ è la dimensione della matrice\\ - $\rk{A}$ & Il rango della matrice $A$ \\ - $\diag{a_1 \ldots a_n}$ & La matrice diagonale con gli elementi $a_1 \ldots a_n$ sulla diagonale. \\ - $\spe{A}$ & Lo spettro di $A$, ovvero $\{ \lambda \in \C \ | \ det(A - \lambda I) = 0 \}$ \\ - $\trasp A$ & La matrice $A$ trasposta , ovvero $\trasp A = (a_{ji})$ \\ - $\herm U$ & La matrice $U$ trasposata e coniugata \\ - $A^{+}$ & La pseudo inversa di $A$. Verrà definita esplicitamente nel Capitolo~\ref{ch:svd} \\ - $\cond{A}$ & Il condizionamento di $A$, solitamente inteso in norma 2, ovvero se $A$ è invertibile - $||A||_2 \cdot ||A^{-1}||_2$. Dopo - il Capitolo~\ref{ch:svd} intenderemo il condizionamento generailzzato, ovvero $||A||_2 \cdot ||A^{+}||_2$ \\ - \hline \hline -\end{tabular} \\[15pt] -In generale chiameremo $D$ le matrici diagonali, $Q$ ed $U$\footnote{Anche se talvolta anche le matrici triangolari -superiori prenderanno il nome $U$.} le matrici unitarie, $R$ le matrici triangolari -superiori, $L$ quelle traiangolari inferiori, $H$ quelle in forma di Hessenberg superiore e $T$ le matrici -tridiagonali hermitiante. Questo varrà in generale, anche se non sono certo che riuscirò a mantenere sempre -questo impegno. \\ -Ci sono probabilmente altri simboli che ho usato, non sono ovvi, eppure mi sono dimenticato di elencare qui. -Potete segnalarmelo a \verb-robol@poisson.phc.unipi.it-. diff --git a/title.tex b/title.tex deleted file mode 100644 index 2770825..0000000 --- a/title.tex +++ /dev/null @@ -1,43 +0,0 @@ -\begin{titlepage} - -%% -%% Chi sono io, e qualche correzione di posizione -%% in modo da avere una prima pagina decente. In realtà -%% ancora non mi soddisfa, ora si vedrà che fare. -%% -\rule{0pt}{40pt} %% Un po' di spazio dalla cima del foglio - \flushright{\Large Appunti del corso di \\[3pt] \Huge \textbf{Calcolo Scientifico} } \\ - \raisebox{7pt}{\rule{\linewidth}{3pt}} %% E tiriamo un po' in su la linea in modo - -%% Un po' di spazio fa sempre bene -\vspace{1cm} - -%% Qui dovrei mettere chi sono -\begin{flushright} - \textsc{Leonardo Robol} \\ - \texttt{<robol@poisson.phc.unipi.it>} \\ - Pisa, \today -\end{flushright} - -\vspace{3cm} - -%\begin{figure}[hb] -%\begin{center}\includegraphics[]{julia.jpeg}\end{center} -%\caption{Un insieme di Julia} -%\end{figure} - - -\begin{figure}[b] -\begin{center} - \includegraphics[scale=0.2]{camosci/camoscio_100.png} - \includegraphics[scale=0.2]{camosci/camoscio_50.png} - \includegraphics[scale=0.2]{camosci/camoscio_25.png} - \includegraphics[scale=0.2]{camosci/camoscio_15.png} - \includegraphics[scale=0.2]{camosci/camoscio_8.png} - \caption{Una successione di camosci di 300 pixel di lato e di rango rispettivamente $100$, $50$, $25$, $15$ e $8$; le - immagini sono state ridimensionate per stare nella pagina, e sono state realizzate con un programma - identico a quello realizzato in laboratorio durante il corso.} -\end{center} -\end{figure} - -\end{titlepage} diff --git a/varie/Bibliografia.tex b/varie/Bibliografia.tex new file mode 100644 index 0000000..eca1a00 --- /dev/null +++ b/varie/Bibliografia.tex @@ -0,0 +1,32 @@ +\begin{thebibliography}{} + \bibitem{metnumalglin}{% + Dario Bini, Milvio Capovani, Ornella Menchi, + \emph{Metodi numerici per l'algebra lineare}, + Zanichelli} + + \bibitem{watkins}{% + David S. Watkins, + \emph{The Matrix Eigenvalue problem -- GR and Krylov Subspace Methods}, + SIAM} + + \bibitem{demmel}{% + James W. Demmel, + \emph{Applied Numeric Linear Algebra}, + SIAM + } + + \bibitem{lshort}{% + Tobias Oetiker, Hubert Partl, Irene Hyna and Elisabeth Schlegl, + \emph{The not so short introduction to \LaTeXe, or \LaTeXe in 139 minutes}, + Scaricabile gratuitamente da Internet. + } + + \bibitem{pgfmanual}{% + Till Tantau, + \emph{Tikz and PDF, Manual for version 1.10}, + Institut f\"ur Theoretische Informatik + Universit\"at zu L\"ubeck, + October 26, 2006, \verb-http://sourceforge.net/projects/pgf- + } +\end{thebibliography} + diff --git a/varie/introduzione.tex b/varie/introduzione.tex new file mode 100644 index 0000000..5c40723 --- /dev/null +++ b/varie/introduzione.tex @@ -0,0 +1,64 @@ +\chapter{Note per il lettore} + +\section{Introduzione} +Questi appunti sono stati scritti durante il primo semestre dell'Anno Accademico 2009-2010, +mentre seguivo le lezioni di \emph{Calcolo Scientifico} tenute dal prof.~Gemignani e le relative +esercitazione tenute dal prof.~Bini. \\ +Ho scritto gli appunti in \LaTeXe\ durante il corso in modo da poterlo fare con calma, ma con +una carenza (probabilmente) della visione ``globale'' che avrei avuto scrivendoli a posteriori. +In ogni caso spero che possano essere utili a chi nei prossimi anni seguirà lo stesso corso, e sono +disponibile ad integrare correzioni ed estensioni di chi avesse voglia di scriverle e spedirmele. +La versione più aggiornata di questi appunti si può trovare sul repository Git che mantengo su Poisson +(il server degli studenti presos l'Università di Pisa). Potete trovare le istruzioni per ottenere il +sorgente \LaTeX\ sulla mia pagina Web (\href{http://poisson.phc.unipi.it/~robol/}{http://poisson.phc.unipi.it/\textasciitilde robol/}) e siete +liberi di spedirmi qualsiasi patch e/o qualsiasi critica e commento all'indirizzo email +\verb-leo@robol.it- oppure \verb-robol@poisson.phc.unipi.it-. + +\section{Struttura del documento} +Questi appunti si dividono in due parti +\begin{description} + \item[Parte I -- Teoria] In questa parte sono riportate le lezioni del prof.~Gemignani che espongono + i concetti teorici principali del corso. Saranno generalmente (abbastanza) rigorose e precise; + \item[Parte II -- Esercitazione] In questa seconda parte sono riportate le lezioni del prof.~Bini, divise + per argomento. In queste lezioni abbiamo affrontato alcuni problemi che ci hanno portato ad implementare + algoritmi ottenuti nella parte di teoria. Per ogni problema affrontato sono stati proposti vari modelli + ed è stata fatta una trattazione sufficiementemente completa. Sono riportate in questa sezione sia + la considerazioni sui modelli, che qualche teorema, che le implementazioni effettive degli algoritmi. + Durante il corso del prof. Bini abbiamo usato il linguaggio Fortrano 95 e quindi gli esempi saranno + esposti con quel linguaggio. Sto comunque valutando l'opportunità di esporre anche qualche algoritmo in + qualche linguaggio diverso. + \item[Parte III -- Appendice] Tutte le cose che in realtà non fanno strettamente parte del corso ma + che potrebbero essere utili per comprendere meglio quello che si trova scritto in questi appunti. Ci + si trova ad esempio, una breve introduzione al linguaggio Fortran che è usato nella parte II per + implementare gli algoritmi. +\end{description} + +\section{Notazione} +Questa è una tabella riassuntiva dei simboli che sono dati per scontato nel testo, oppure che vengono +spiegati e poi usati in seguito. Per la maggior parte sono ovvi, ma \ldots giusto per fissare la notazione!\\ +\begin{tabular}[t]{|l|p{12cm}|} + \hline \hline + $\dom{f}$ & Dominio della funzione $f$ \\ + $\imm{f}$ & Immagine della funzione $f$ \\ + $A \in \matr{\C}{m}{n}$ & $A$ è una matrice a coefficienti complessi di dimensione $m \times n$; la stessa + notazione verrà usata al variare del campo \\ + $A = (a_{ii})$ & $A$ è una matrice i cui elementi valgono $a_{ii}$ al variare di $i$ da $1 \ldots n$ dove + $n$ è la dimensione della matrice\\ + $\rk{A}$ & Il rango della matrice $A$ \\ + $\diag{a_1 \ldots a_n}$ & La matrice diagonale con gli elementi $a_1 \ldots a_n$ sulla diagonale. \\ + $\spe{A}$ & Lo spettro di $A$, ovvero $\{ \lambda \in \C \ | \ det(A - \lambda I) = 0 \}$ \\ + $\trasp A$ & La matrice $A$ trasposta , ovvero $\trasp A = (a_{ji})$ \\ + $\herm U$ & La matrice $U$ trasposata e coniugata \\ + $A^{+}$ & La pseudo inversa di $A$. Verrà definita esplicitamente nel Capitolo~\ref{ch:svd} \\ + $\cond{A}$ & Il condizionamento di $A$, solitamente inteso in norma 2, ovvero se $A$ è invertibile + $||A||_2 \cdot ||A^{-1}||_2$. Dopo + il Capitolo~\ref{ch:svd} intenderemo il condizionamento generailzzato, ovvero $||A||_2 \cdot ||A^{+}||_2$ \\ + \hline \hline +\end{tabular} \\[15pt] +In generale chiameremo $D$ le matrici diagonali, $Q$ ed $U$\footnote{Anche se talvolta anche le matrici triangolari +superiori prenderanno il nome $U$.} le matrici unitarie, $R$ le matrici triangolari +superiori, $L$ quelle traiangolari inferiori, $H$ quelle in forma di Hessenberg superiore e $T$ le matrici +tridiagonali hermitiante. Questo varrà in generale, anche se non sono certo che riuscirò a mantenere sempre +questo impegno. \\ +Ci sono probabilmente altri simboli che ho usato, non sono ovvi, eppure mi sono dimenticato di elencare qui. +Potete segnalarmelo a \verb-robol@poisson.phc.unipi.it-. diff --git a/varie/title.tex b/varie/title.tex new file mode 100644 index 0000000..2770825 --- /dev/null +++ b/varie/title.tex @@ -0,0 +1,43 @@ +\begin{titlepage} + +%% +%% Chi sono io, e qualche correzione di posizione +%% in modo da avere una prima pagina decente. In realtà +%% ancora non mi soddisfa, ora si vedrà che fare. +%% +\rule{0pt}{40pt} %% Un po' di spazio dalla cima del foglio + \flushright{\Large Appunti del corso di \\[3pt] \Huge \textbf{Calcolo Scientifico} } \\ + \raisebox{7pt}{\rule{\linewidth}{3pt}} %% E tiriamo un po' in su la linea in modo + +%% Un po' di spazio fa sempre bene +\vspace{1cm} + +%% Qui dovrei mettere chi sono +\begin{flushright} + \textsc{Leonardo Robol} \\ + \texttt{<robol@poisson.phc.unipi.it>} \\ + Pisa, \today +\end{flushright} + +\vspace{3cm} + +%\begin{figure}[hb] +%\begin{center}\includegraphics[]{julia.jpeg}\end{center} +%\caption{Un insieme di Julia} +%\end{figure} + + +\begin{figure}[b] +\begin{center} + \includegraphics[scale=0.2]{camosci/camoscio_100.png} + \includegraphics[scale=0.2]{camosci/camoscio_50.png} + \includegraphics[scale=0.2]{camosci/camoscio_25.png} + \includegraphics[scale=0.2]{camosci/camoscio_15.png} + \includegraphics[scale=0.2]{camosci/camoscio_8.png} + \caption{Una successione di camosci di 300 pixel di lato e di rango rispettivamente $100$, $50$, $25$, $15$ e $8$; le + immagini sono state ridimensionate per stare nella pagina, e sono state realizzate con un programma + identico a quello realizzato in laboratorio durante il corso.} +\end{center} +\end{figure} + +\end{titlepage}