Metodo delle potenze inverse
Nell'[[analisi numerica]], il '''metodo delle potenze inverse''' è un algoritmo [[metodo iterativo|iterativo]] per il calcolo degli [[autovettori]] di una matrice. L'algoritmo permette di stimare un autovettore quando è già conosciuta una approssimazione dell'autovalore corrispondente. Questo metodo è concettualmente simile al [[metodo delle potenze]] e nacque per calcolare le frequenze di risonanza nel campo della meccanica strutturale.
<ref name=Pohlhausen>Ernst Pohlhausen, ''Berechnung der Eigenschwingungen statisch-bestimmter Fachwerke'', ZAMM - Zeitschrift f&uuml;r Angewandte
Mathematik und Mechanik 1, 28-42 (1921).</ref>

Il metodo delle potenze inverse inizia con una approssimazione <math>\mu</math> per l'autovalore corrispondente all'autovettore desiderato e un vettore <math>b_0</math>, scelto sia casualmente oppure da un'approssimazione dell'autovettore. L'algoritmo è descritto dall'iterazione

:<math> b_{k+1} = \frac{(A - \mu I)^{-1}b_k}{C_k}, </math>

dove <math>C_k</math> sono qualche costanti di solito scelte come <math>C_k= \|(A - \mu I)^{-1}b_k \|</math>. Poiché gli autovettori sono definiti a meno di uno scalare moltiplicativo, la scelta di <math>C_k</math> può essere arbitraria nella teoria; aspetti pratici della scelta di <math>C_k</math> sono discussi sotto.

Ad ogni iterazione, il vettore <math>b_k</math> è moltiplicato per l'inversa della matrice <math>(A - \mu I)^{-1}</math> e normalizzata.
È esattamente la stessa formula del [[metodo delle potenze]], eccetto la sostituzione di <math>A</math> con <math>(A - \mu I)^{-1}</math>.
Più l'approssimazione <math>\mu</math> è scelta vicino all'autovalore, più velocemente l'algoritmo converge; tuttavia, scelte sbagliate di <math>\mu</math> possono portare a una convergenza lenta oppure a un altro autovettore rispetto a quello desiderato. Nella pratica, questo metodo è utilizzato quando si conosce una buona approssimazione dell'autovalore, e quindi servono solo poche (molto spesso anche solo una) iterazioni.

== Teoria e convergenza del metodo ==

L'idea base del metodo delle potenze è scegliere un vettore iniziale <math>b</math> (l'[[autovettore]] approssimato o un vettore casuale) e iterativamente calcolare <math>Ab, A^{2}b, A^{3}b,...</math>.  eccetto per un insieme di [[Misura (matematica)|misura]] nulla, per ogni vettore iniziale, il risultato convergerà a un autovettore corrispondente all'[[autovalore]] dominante.

Il metodo delle potenze inverse fa lo stesso con la matrice <math>(A - \mu I)^{-1}</math>, perciò converge all'autovettore corrispondente all'autovalore dominante della matrice <math>(A - \mu I)^{-1}</math>. 
Gli autovalori di questa matrice sono <math>(\lambda_1 - \mu)^{-1}</math>,<math>\ldots</math>,<math>(\lambda_n - \mu)^{-1}</math>, dove <math> \lambda_i </math> sono gli autovalori di <math>A</math>.
Il più grande di questi valori corrisponde al più piccolo di <math>(\lambda_1 - \mu)</math>,<math>\ldots</math>,<math>(\lambda_n - \mu)</math>. Gli autovettori di <math>A</math> e di <math>(A - \mu I)^{-1}</math> sono i soliti, poiché
:<math>
Av=\lambda v \, \Leftrightarrow \,
(A-\mu I)v = \lambda v - \mu v \, \Leftrightarrow \,
(\lambda - \mu)^{-1} v = (A-\mu I)^{-1} v
</math>

'''Conclusione''': Il metodo converge all'autovettore della matrice <math>A</math> corrispondente all'autovalore più vicino a <math>\mu</math>.

In particolare, prendendo <math>\mu=0</math> si osserva che <math>(A)^{-k} b</math> converge all'autovettore corrispondente all'autovalore di <math>A</math> con il valore assoluto più piccolo.

=== Velocità di convergenza ===

Si analizzi la velocità di convergenza del metodo.

Il metodo delle potenze converge linearmente al limite, più precisamente:

<math> \mathrm{Distanza}( b^\mathrm{ideale},  b^{k}_\mathrm{Metodo~Potenze})=O \left(   \left| \frac{\lambda_\mathrm{sottodominante} }{\lambda_\mathrm{dominante} } \right|^k \right), </math>

quindi per il metodo delle potenze inverse si hanno risultati simili:

<math> \mathrm{Distanza}( b^\mathrm{ideale},  b^{k}_\mathrm{Potenze~Inverse})=O \left(   \left| \frac{\mu -\lambda_{\mathrm{piu'~ vicino~ a~ }\mu}   }{\mu - \lambda_{\mathrm{secondo~ piu'~ vicino~ a~ } \mu} } \right|^k \right). </math>

Questa è la formula chiave per comprendere la convergenza dell'algoritmo. Si osserva che se <math>\mu</math> è scelto abbastanza vicino a un qualche autovalore <math>\lambda </math>, per esempio <math> \mu- \lambda = \epsilon </math>, ogni iterazione migliorerà la precisione di <math> |\epsilon| /|\lambda +\epsilon - \lambda_{\mathrm{piu'~ vicino~ a~ } \lambda} |  </math> volte. (Si è usato che per <math>\epsilon</math> abbastanza piccoli, "''più vicino a <math>\mu</math>''" e "''più vicino a <math>\lambda </math>''" sono la stessa cosa.) Per <math> |\epsilon|</math> abbastanza piccoli, è approssimativamente uguale a  <math> |\epsilon| /|\lambda  - \lambda_{\mathrm{piu'~ vicino~ a~} \lambda}| </math>. Dunque se si è in grado di trovare <math>\mu </math> tale che <math>\epsilon </math> sarà abbastanza piccolo, allora saranno sufficienti poche interazioni.

=== Complessità ===

L'algoritmo richiede di risolvere un [[sistema lineare]] o di calcolare l'inversa di una matrice.
Per matrici non strutturate (non sparse, di Toeplitz,...) questo richiede <math>O(n^{3})</math> operazioni.

== Opzioni per l'implementazione ==

Il metodo è definito dalla formula:

:<math> b_{k+1} = \frac{(A - \mu I)^{-1}b_k}{C_k}, </math>

Ci sono, tuttavia, multiple opzioni per la sua implementazione.

=== Calcolare l'inversa della matrice o risolvere un sistema lineare ===

Si può riscrivere la formula nella seguente maniera:

:<math> (A - \mu I) b_{k+1} = \frac{b_k}{C_k}, </math>

sottolineando che per trovare la successiva approssimazione <math> b_{k+1} </math> si può risolvere un sistema di equazioni lineari. 
Ci sono due opzioni: si può scegliere un algoritmo che risolve un sistema lineare, oppure si può calcolare l'inversa <math>(A - \mu I)^{-1}</math> e dopo applicarla al vettore.
Entrambe le soluzioni hanno complessità <math>O(n^{3})</math>, il numero esatto dipende dal metodo scelto.

La scelta dipende anche dal numero di iterazioni. Ingenuamente, se a ogni iterazione si risolve un sistema lineare, la complessità sarà <math>K\cdot O(n^{3})</math>, dove <math>K</math> è il numero di iterazioni; similmente, calcolare la matrice inversa e applicarla ad ogni iterazione ha complessità <math>K\cdot O(n^{3})</math>.
Si osserva, tuttavia, che se la stima dell'autovalore <math>\mu</math> rimane costante, per entrambi i metodi si può ridurre la complessità a <math>O(n^{3})+K\cdot O(n^{2})</math>.
Calcolare l'inversa una volta memorizzandola per applicarla ad ogni iterazione è di complessità <math>O(n^{3})+K\cdot O(n^{2})</math>.
Immagazzinare una [[decomposizione LU|decomposizione]] di <math>(A - \mu I)</math> e usare il metodo di sostituzione per risolvere il sistema di equazioni è ancora di complessità <math>O(n^{3})+K\cdot O(n^{2})</math>.

Invertire la matrice ha tipicamente un maggiore costo iniziale, ma minore ad ogni iterazione. Al contrario, risolvere il sistema di equazioni lineari ha un costo iniziale minore, ma richiede più operazioni a ogni iterazione.

=== Tridiagonalizzazione, Forma di Hessenberg ===

Se è necessario effettuare molte iterazioni (opoche, ma per molti autovettori), allora può essere saggio portare la matrice prima nella [[Matrice di Hessenberg|forma di Hessenberg]] superiore (per matrice simmetriche è la [[Matrice tridiagonale|forma tridiagonale]]), che costa <math>\begin{matrix}\frac{10}{3}\end{matrix} n^3 + O(n^2)</math> operazioni aritmetiche usando una tecnica basata sulla [[trasformazione di Householder]], con una sequenza finita di similitudini ortogonali, come fosse una [[decomposizione QR]] da entrambi i lati.<ref name=Demmel>{{Cita pubblicazione|cognome= Demmel |nome= James W. 
 | mr = 1463942
 | isbn = 0-89871-389-7
 |città= Philadelphia, PA
 |editore= Society for Industrial and Applied Mathematics
 |titolo= Applied Numerical Linear Algebra
 |anno= 1997}}</ref><ref name=Trefethen>Lloyd N. Trefethen and David Bau, ''Numerical Linear Algebra'' (SIAM, 1997).</ref>  (Per decomposizioni QR, le rotazioni di Householder sono moltiplicate solo a sinistra, ma nel caso della forma di Hessenberg si moltiplica sia a destra che a sinistra). Usando sempre questa tecnica, per le [[matrice simmetrica|matrici simmetriche]] questa procedura costa <math>\begin{matrix}\frac{4}{3}\end{matrix} n^3 + O(n^2)</math> operazioni.<ref name=Demmel/><ref name=Trefethen/>

Per le matrici tridiagonali, La soluzione al sistema lineare per le matrici costa <math>O(n)</math> operazioni, quindi la complessità cresce come <math>O(n^{3})+K\cdot O(n)</math>, dove <math>K</math> è il numero di applicazioni, che è migliore dell'inversione diretta. Tuttavia, per poche iterazioni una tale trasformazione è poco pratica.

Inoltre trasformazioni nella forma di Hessenberg coinvolge radici quadrate e divisioni, che non sono universalmente supportate dall'hardware.

=== Scelta della costante di normalizzazione''C<sub>k</sub>'' ===

Nei processori ''General purpose'' (per esempio prodotti da Intel), il tempo di esecuzione di addizione, moltiplicazione e divisione è circa lo stesso. Tuttavia su hardware integrati e/o a basso consumo ([[DSP]], [[Field Programmable Gate Array|FPGA]], [[Application-specific integrated circuit|ASIC]]), la divisione può non essere supportata così dovrebbe essere evitata. 
La scelta <math>C_k=2^{n_k}</math>,permette divisioni veloci senza supporti hardware espliciti, dal momento che la divisione per una potenza di due può essere implementata sia come uno spostamento bit a bit (per l'aritmetica in virgola fissa) sia con sottrazione di <math>k</math> dall'esponente (per [[numero in virgola mobile|l'aritmetica in virgola mobile]]).

Quando viene implementato l'algoritmo con la rappresentazione in virgola fissa, la scelta della costate <math>C_k</math> è particolarmente importante. Piccoli valori porteranno ad una crescita veloce della norma di <math>b_k</math> e quindi all'[[overflow aritmetico|overflow]]; grandi valori di <math>C_k</math> causerà l'avvicinarsi di <math>b_k</math> a zero.

== Applicazioni  ==

La principale applicazione del metodo è la situazione in cui si possiede un'approssimazione di un autovalore e si deve trovare la stima del corrispondente autovettore. In tale situazione il metodo delle potenze inverse è il principale algoritmo da usare.

=== Metodi per trovare autovalori approssimati ===

Tipicamente questo metodo è usato in combinazione con altri per approssimare autovalori: l'esempio standard è ''l'algoritmo di bisezione per gli autovalori''; un altro esempio è il ''metodo del quoziete di Rayleigh'', che è in realtà è il metodo delle potenze inverse con l'utilizzo del [[quoziente di Rayleigh]] del vettore precedente come approssimazione dell'autovalore.

Ci sono alcune situazioni in cui si possono usare solo determinati metodi, tuttavia sono alquanto marginali.

=== Norma della matrice come approssimazione dell'autovalore ''dominante'' ===

Si può stimare facilmente l'autovalore dominante per ogni matrice. 
Per ogni [[norma matriciale|norma indotta]], è vero che <math>\left \| A \right \| \ge |\lambda| , </math> per ogni autovalore <math>\lambda</math>. 
Perciò prendendo la norma della matrice come approssimazione dell'autovalore, si può vedere che il metodo converge all'autovettore dominante.

=== Stime statistiche ===

In alcune applicazioni in tempo reale, si ha bisogno di trovare autovettori con una velocità di milioni di matrici al secondo. In tali applicazioni, tipicamente la statistica delle matrici è conosciuta a priori e si può prendere come autovalore approssimato il valore medio di quest'ultimo per qualche grande matrice campione. 
Ancora meglio, si può calcolare la media dei rapporti tra gli autovalori e la traccia o la norma della matrice e stimare l'autovalore medio grazie al valore medio di questo rapporto. Chiaramente questo metodo può essere usato solo con discrezione e solo quando non è cruciale una altissima precisione. 
Questo approccio di determinare un autovalore medio può essere combinato con uno degli altri metodi per evitare errori eccessivamente grandi.

==Note==
<references />

== Voci correlate ==
*[[Metodo delle potenze]]
*[[Quoziente di Rayleigh]]
*[[Decomposizione QR]]

==Collegamenti esterni==
*[https://web.archive.org/web/20090816172745/http://www.physics.arizona.edu/~restrepo/475A/Notes/sourcea/node81.html Metodo delle potenze inverse per trovare autovettori], physics.arizona.edu

{{portale|matematica}}

[[Categoria:Algebra lineare numerica]]
[[Categoria:Matrici]]