1  Metodo di eliminazione di Gauss

Autore/Autrice
Affiliazione

Enrico Bertolazzi

University of Trento, Department of Industrial Engineering

1.1 Introduzione

Il metodo di eliminazione di Gauss1 è una procedura sistematica per risolvere sistemi di equazioni lineari. Consiste nel trasformare il sistema iniziale in un sistema equivalente di struttura più semplice, detto in forma triangolare, nel quale ogni equazione contiene un numero non crescente di incognite.

L’obiettivo del metodo è annullare, passo dopo passo, i coefficienti al di sotto della diagonale principale della matrice associata al sistema, mediante operazioni elementari sulle righe (scambi, moltiplicazioni per uno scalare e somme di righe). Una volta ottenuta la forma triangolare, il sistema si risolve mediante sostituzioni all’indietro: si parte dall’ultima equazione e si procede a ritroso fino alla prima.

Il metodo di Gauss è alla base di numerose tecniche numeriche per la risoluzione dei sistemi lineari.

Applicato a un sistema lineare della forma:

\left\{\begin{aligned} A_{1,1}x_1 + A_{1,2}x_2 + \cdots + A_{1,n}x_n &= b_1 \\ A_{2,1}x_1 + A_{2,2}x_2 + \cdots + A_{2,n}x_n &= b_2 \\ &\vdots\\ A_{n,1}x_1 + A_{n,2}x_2 + \cdots + A_{n,n}x_n &= b_n \end{aligned}\right.

il metodo lo trasforma in un sistema equivalente, cioè con lo stesso insieme di soluzioni, della forma:

\left\{\begin{aligned} C_{1,1}x_1 + C_{1,2}x_2 + \cdots + C_{1,n}x_n &= d_1 \\ C_{2,2}x_2 + \cdots + C_{2,n}x_n &= d_2 \\ &\vdots\\ C_{n,n}x_n &= d_n \end{aligned}\right. \tag{1.1}

detta forma triangolare.

Un sistema in forma triangolare si risolve mediante sostituzioni all’indietro: si parte dall’ultima incognita, il cui valore è determinato dall’ultima equazione, e si procede risalendo il sistema. In formula:

\begin{aligned} x_n &= \dfrac{d_n}{C_{n,n}} \\ x_{n-1} &= \dfrac{d_{n-1} - C_{n-1,n}x_n}{C_{n-1,n-1}} \\ x_{n-2} &= \dfrac{d_{n-2} - C_{n-2,n}x_n - C_{n-2,n-1}x_{n-1}}{C_{n-2,n-2}} \\ &\vdots \\ x_1 &= \dfrac{d_1 - C_{1,n}x_n - C_{1,n-1}x_{n-1} - \cdots - C_{1,2}x_2}{C_{1,1}} \\ \end{aligned} \tag{1.2}

Esempio 1.1 (Esempio) La soluzione del sistema in forma triangolare:

\left\{\begin{aligned} x+y+z &= 1 \\ 4y+2z &= 0 \\ z &= 2 \end{aligned}\right.

(nel quale abbiamo posto x=x_1, y=x_2 e z=x_3), si ottiene immediatamente sostituendo all’indietro le variabili come mostrato in 1.2,

\begin{aligned} z &= \dfrac{2}{1} = 2, \\ y &= \dfrac{0-2z}{4} = \dfrac{0-2\cdot 2}{4}=-1,\\ x &= \dfrac{1-1z-1y}{1} = \dfrac{1-1(-1)-1\cdot 2}{1} = 0. \end{aligned}

L’algoritmo di eliminazione di Gauss elimina, a ogni passo, una variabile esprimendola come combinazione lineare di quelle non ancora eliminate. A questo scopo si sceglie un’equazione, che viene poi usata per sostituire la variabile nelle altre equazioni. In termini matriciali, il procedimento consiste nel costruire opportune combinazioni lineari delle equazioni, e quindi delle righe della matrice dei coefficienti.

Per fissare le idee, illustriamo il procedimento con un esempio dettagliato.

Esempio 1.2 (Esempio) Sia dato il seguente sistema lineare

\left\{\begin{aligned} x+y+z+w &= 1 \qquad\qquad & [1] \\ -x-y+4z &= 0 & [2]\\ x-z-w &= 2 & [3]\\ x+w &= 0 & [4] \end{aligned}\right.

Le equazioni sono numerate a destra tra parentesi quadre per facilitarne il riferimento. Trasformiamo il sistema in forma triangolare eliminando, un passo alla volta, le incognite x, y, z2 mediante combinazioni lineari delle equazioni.

Per eliminare l’incognita x dalle equazioni [2], [3] e [4], eseguiremo le seguenti operazioni:

  • Eliminare x da [2]: Sommiamo l’equazione [1] all’equazione [2] per ottenere la nuova equazione [2']: [2'] \gets [2] + [1]

  • Eliminare x da [3]: Sottraiamo l’equazione [1] dall’equazione [3] per ottenere la nuova equazione [3']: [3'] \gets [3] - [1]

  • Eliminare x da [4]: Sottraiamo l’equazione [1] dall’equazione [4] per ottenere la nuova equazione [4']: [4'] \gets [4] - [1]

Si ottiene:

\left\{\begin{aligned} x+y+z+w &= 1 \qquad\qquad & [1] \\ 5z+w &= 1 & [2'] \\ -y-2z-2w &= 1 & [3'] \\ -y-z &= -1 & [4'] \end{aligned}\right.

Osserviamo che l’equazione [2'] non contiene la variabile y, mentre l’equazione [3'] la contiene. Per semplificare il sistema, scambiamo l’equazione [2'] con la [3'] prima di procedere all’eliminazione successiva:

\left\{\begin{aligned} x+y+z+w &= 1 \qquad\qquad & [1] \\ -y-2z-2w &= 1 & [3']\\ 5z+w &= 1 & [2']\\ -y-z &= -1 & [4'] \end{aligned}\right.

Per eliminare l’incognita y dall’equazione [4'], eseguiremo la seguente operazione:

  • Eliminare y da [4']: Sommiamo l’equazione [3'] all’equazione [4'] per ottenere la nuova equazione [4'']: [4''] \gets [4'] - [3']

Si ottiene:

\left\{\begin{aligned} x+y+z+w &= 1 \qquad\qquad & [1] \\ -y-2z-2w &= 1 & [3']\\ 5z+w &= 1 & [2']\\ z+2w &= -2 & [4''] \end{aligned}\right.

Per eliminare l’incognita z dall’equazione [4''], eseguiremo la seguente operazione:

  • Eliminare z da [4'']: Sottraiamo \dfrac{1}{5} volte l’equazione [2'] dall’equazione [4''] per ottenere la nuova equazione [4''']: [4'''] \gets [4''] - \dfrac{1}{5}[2']

Si ottiene:

\left\{\begin{aligned} x+y+z+w &=1 \qquad\qquad & [1] \\ -y-2z-2w &=1 & [3']\\ 5z+w &=1 & [2']\\ \dfrac{9}{5}w &=-\dfrac{11}{5} & [4'''] \end{aligned}\right.

Il sistema è ora in forma triangolare e, tramite il procedimento di sostituzioni all’indietro 1.2, possiamo calcolare la soluzione:

\begin{aligned} w &= \dfrac{-\dfrac{11}{5}}{\dfrac{9}{5}} = -\dfrac{11}{9} \\ z &= \dfrac{1 - \left(-\dfrac{11}{9}\right)}{5} = \dfrac{4}{9} \\ y &= \dfrac{1 + 2\left(-\dfrac{11}{9}\right) + 2 \dfrac{4}{9}}{-1} = \dfrac{5}{9} \\ x &= \dfrac{1 - \left(-\dfrac{11}{9}\right) - \dfrac{4}{9} - \dfrac{5}{9}}{1} = \dfrac{11}{9} \end{aligned}

NotaOsservazione

Per trasformare un sistema lineare da una forma generica a una forma triangolare, sono sufficienti solo due tipi di operazioni:

  1. Somma di un’equazione con un’altra moltiplicata per un opportuno scalare: questa operazione consente di eliminare progressivamente le incognite da una o più equazioni e di portare il sistema in forma triangolare.

  2. Scambio di due equazioni: Questa operazione è utile per posizionare le equazioni in modo che il sistema possa essere facilmente risolto tramite sostituzioni all’indietro.

Si noti che la soluzione di un sistema non cambia se:

  • Si scambiano due equazioni tra loro.
  • Si sostituisce un’equazione con la somma di se stessa e di un’altra equazione moltiplicata per uno scalare opportuno.

Queste operazioni mantengono l’equivalenza del sistema, preservando le soluzioni originali e facilitando il processo di riduzione a forma triangolare.

L’algoritmo di Gauss si può quindi descrivere come segue:

ImportanteMetodo di Eliminazione di Gauss

Consideriamo un sistema lineare:

\bm{A}\bm{x} = \bm{b}

dove

\bm{A} = \begin{pmatrix} A_{1,1} & A_{1,2} & \cdots & A_{1,n} \\ A_{2,1} & A_{2,2} & \ddots & \vdots \\ \vdots & \ddots & \ddots & A_{n-1,n} \\ A_{n,1} & \cdots & A_{n,n-1} & A_{n,n} \end{pmatrix}, \quad \bm{x} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{pmatrix}, \qquad \bm{b} = \begin{pmatrix} b_1 \\ b_2 \\ \vdots \\ b_n \end{pmatrix}.

Figura 1.1: Il metodo di eliminazione di Gauss: l’eliminazione progressiva porta il sistema in forma triangolare superiore operando contemporaneamente su \bm{A} e su \bm{b}, la sostituzione all’indietro ricava poi le incognite a partire dall’ultima.

Alla fine dell’eliminazione progressiva la matrice \bm{A} e il termine noto \bm{b} hanno la forma

\bm{A} = \begin{pmatrix} A_{1,1} & A_{1,2} & \cdots & A_{1,n} \\ 0 & A_{2,2} & \cdots & A_{2,n} \\ 0 & 0 & \ddots & \vdots \\ \vdots & \vdots & & A_{n-1,n} \\ 0 & 0 & \cdots & A_{n,n} \end{pmatrix}, \qquad \bm{b} = \begin{pmatrix} b_1 \\ b_2 \\ \vdots \\ b_{n-1} \\ b_n \end{pmatrix},

e la sostituzione all’indietro può procedere dall’ultima equazione verso la prima.

NotaOsservazione

Nel metodo di eliminazione di Gauss, l’operazione di scambio di equazioni è fondamentale per garantire che la matrice venga trasformata correttamente in una forma triangolare superiore. L’algoritmo standard prevede di scambiare le righe per trovare un elemento diverso da zero nella colonna corrente, ma esiste un criterio alternativo chiamato pivoting che può migliorare la stabilità numerica del metodo.

Pivoting

Il criterio di pivoting consiste nel selezionare, tra tutte le righe dalla riga corrente in poi, quella con il valore assoluto massimo nella colonna corrente. Precisamente, si procede come segue:

  • Sia k l’indice tale che \left\lvert A^{(i)}_{k,i}\right\rvert \geq \left\lvert A^{(i)}_{j,i}\right\rvert, \quad \forall j \geq i. In altre parole, k è l’indice della riga con il valore assoluto più grande nella colonna i, a partire dalla riga i.

  • If k \neq i then

    • Scambia la i-esima riga con la k-esima riga nella matrice \bm{A}^{(i)}.
    • Scambia anche la componente i-esima con la componente k-esima del vettore \bm{b}^{(i)}.

Motivazione

Il pivoting ha lo scopo di migliorare l’accuratezza della soluzione calcolata. Questo è particolarmente importante quando si lavora con numeri molto piccoli. Infatti, se si divide per un numero molto vicino a zero, si rischia di ottenere risultati numerici imprecisi a causa dell’amplificazione degli errori di arrotondamento. Scegliendo l’elemento massimo nella colonna come pivot, si riduce il rischio di divisioni per numeri molto piccoli e si migliora la stabilità numerica dell’algoritmo.

In sintesi, il pivoting è una tecnica che aiuta a prevenire problemi numerici e a ottenere soluzioni più accurate per i sistemi di equazioni lineari.

1.2 Forma Matriciale del Metodo di Gauss

Il metodo di Gauss per la risoluzione di sistemi lineari può essere interpretato usando il formalismo delle matrici. Consideriamo un sistema lineare nella forma matriciale:

\bm{A} \bm{x} = \bm{b}

dove \bm{A} è una matrice quadrata n \times n, \bm{x} è un vettore colonna di incognite, e \bm{b} è un vettore colonna di termini noti.

Trasformazione in Forma Triangolare Superiore

L’obiettivo del metodo di Gauss è trasformare il sistema \bm{A} \bm{x} = \bm{b} in un sistema equivalente della forma:

\bm{U} \bm{x} = \bm{c}

dove \bm{U} è una matrice triangolare superiore e \bm{c} è un vettore modificato di termini noti. La matrice \bm{U} è ottenuta applicando una serie di operazioni elementari al sistema originale.

Passaggi per la Trasformazione

La trasformazione dal sistema originale \bm{A} \bm{x} = \bm{b} al sistema triangolare superiore \bm{U} \bm{x} = \bm{c} avviene attraverso i seguenti passaggi:

  1. Operazioni Elementari: Utilizziamo matrici elementari, chiamate matrici di Frobenius, per applicare operazioni elementari alle righe della matrice \bm{A}. Queste operazioni nel caso del metodo di Gauss si riducono a:

    • Addizione di un multiplo di una riga a un’altra riga.
  2. Matrici di Scambio: Se necessario, scambiamo due righe della matrice \bm{A} utilizzando matrici di permutazione, che sono matrici identità con due righe scambiate. Queste matrici assicurano che l’algoritmo non fallisca a causa di zeri nei pivots (elementi diagonali).

Matrici di Frobenius

Le matrici di Frobenius3 sono matrici elementari utilizzate per eseguire operazioni sui sistemi lineari. Ogni matrice di Frobenius rappresenta una trasformazione elementare specifica:

  1. Addizione di Multipli di Righe ad Altre Righe: Una matrice di Frobenius per aggiungere multipli \beta_{k+1}, \beta_{k+2}, \ldots, \beta_{n} della riga k-esima alle righe k+1, k+2 fino a n è una matrice identità con gli \beta_j posizionati nella k-esima colonna. Per scriverla esplicitamente consideriamo il vettore \bm{v}=\begin{pmatrix}0,\ldots,0,\beta_{k+1},\ldots,\beta_n\end{pmatrix}^{T} cioè tale che v_i = 0, \qquad i=1,2,\ldots,k in questo modo la matrice di Frobenius \bm{F} diventa \bm{F} = \bm{I}+ \bm{v}\bm{e}_k^T, o più esplicitamente: \bm{F} = \left( \begin{array}{ccc|c|ccc} 1 & & & 0 & 0 & \cdots & 0 \\ & \ddots & & \vdots & \vdots & & \vdots \\ & & 1 & 0 & 0 & \cdots & 0 \\ \hline 0 & \cdots & 0 & 1 & 0 & \cdots & 0 \\ \hline 0 & \cdots & 0 & \beta_{k+1} & 1 & & \\ \vdots & & \vdots & \vdots & & \ddots & \\ 0 & \cdots & 0 & \beta_n & & & 1 \end{array} \right)

  2. Scambio di Due Righe: Una matrice di permutazione per scambiare la i-esima e la j-esima riga (denotata con \bm{S}_{i,j}) è una matrice identità con le righe i e j scambiate. Esplicitamente prende la forma: \bm{S}_{i,j} = \left(\begin{array}{ccc|c|ccc|c|ccc} 1 & & & & & & & & & & \\ & \ddots & & & & & & & & & \\ & & 1 & & & & & & & & \\ \hline & & & 0 & & & & 1 & & & \\ \hline & & & & 1 & & & & & & \\ & & & & & \ddots & & & & & \\ & & & & & & 1 & & & & \\ & & & 1 & & & & 0 & & & \\ \hline & & & & & & & & 1 & & \\ \hline & & & & & & & & & \ddots & \\ & & & & & & & & & & 1 \end{array}\right) \tag{1.3}

    La stessa matrice ammette la seguente rappresentazione più compatta: \bm{S}_{i,j} = \bm{I} - (\bm{e}_i-\bm{e}_j)(\bm{e}_i-\bm{e}_j)^{T}

1.3 Proprietà delle matrici di Frobenius

Consideriamo la matrice di Frobenius \bm{F} definita in 1.3 e la matrice \bm{A},

\bm{A} = \begin{pmatrix} A_{1,1} & A_{1,2} & \cdots & A_{1,n} \\ \vdots & \vdots & & \vdots \\ A_{k,1} & A_{k,2} & \cdots & A_{k,n} \\ A_{k+1,1} & A_{k+1,2} & \cdots & A_{k+1,n} \\ \vdots & \vdots & & \vdots \\ A_{n,1} & A_{n,2} & \cdots & A_{n,n} \end{pmatrix},

il prodotto \bm{F}\bm{A} è

\bm{F}\bm{A} = \begin{pmatrix} A_{1,1} & A_{1,2} & \cdots & A_{1,n} \\ \vdots & \vdots & & \vdots \\ A_{k,1} & A_{k,2} & \cdots & A_{k,n} \\ A_{k+1,1}+\beta_{k+1}A_{k,1} & A_{k+1,2}+\beta_{k+1}A_{k,2} & \cdots & A_{k+1,n}+\beta_{k+1}A_{k,n} \\ \vdots & \vdots & & \vdots \\ A_{n,1}+\beta_n A_{k,1} & A_{n,2}+\beta_n A_{k,2} & \cdots & A_{n,n}+\beta_n A_{k,n} \end{pmatrix}.

L’effetto della moltiplicazione di \bm{F} sulla matrice \bm{A} può essere descritto come segue:

  • La riga i-esima della matrice \bm{A} viene sostituita dalla somma della riga i-esima originale con un multiplo della riga k-esima, dove il multiplo è dato dallo scalare v_i.

In altre parole, stiamo effettuando le seguenti modifiche alle righe della matrice \bm{A}:

  • Sostituiamo la riga (k+1)-esima con la riga

    A_{k+1,\bullet} \gets A_{k+1,\bullet} + \beta_{k+1} \cdot A_{k,\bullet}

  • Sostituiamo la riga (k+2)-esima con la riga

    A_{k+2,\bullet} \gets A_{k+2,\bullet} + \beta_{k+2} \cdot A_{k,\bullet}

  • E così via fino a:

    A_{n,\bullet} \gets A_{n,\bullet} + \beta_{n} \cdot A_{k,\bullet}

Lemma 1.1 (Prodotto di Matrici di Frobenius) Siano \bm{F}_i = \bm{I} + \bm{v}_i \bm{e}_i^T le matrici di Frobenius, dove \bm{v}_i è un vettore con zeri nelle prime i componenti, ossia della forma:

\bm{v}_i = \begin{pmatrix} 0 \\ \vdots \\ 0 \\ \beta_{i+1} \\ \beta_{i+2} \\ \vdots \\ \beta_n \end{pmatrix}

Allora, per ogni 2 \leq k \leq n-1, si ha che:

\bm{F}_1 \bm{F}_2 \cdots \bm{F}_k = \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \cdots + \bm{v}_k \bm{e}_k^T

Dimostrazione. La dimostrazione procede per induzione sull’indice k.

Base dell’Induzione (k=2):

Calcoliamo il prodotto delle due matrici:

\begin{aligned} \bm{F}_1 \bm{F}_2 &= (\bm{I} + \bm{v}_1 \bm{e}_1^T)(\bm{I} + \bm{v}_2 \bm{e}_2^T) \\ &= \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \bm{v}_1 (\bm{e}_1^T \bm{v}_2) \bm{e}_2^T \\ &= \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T, \end{aligned}

poiché \bm{e}_1^T \bm{v}_2 = (\bm{v}_2)_1 = 0.

Passo Induttivo:

Supponiamo che il lemma sia vero per un indice generico k-1, cioè:

\bm{F}_1 \bm{F}_2 \cdots \bm{F}_{k-1} = \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \cdots + \bm{v}_{k-1} \bm{e}_{k-1}^T.

Ora, calcoliamo:

\begin{aligned} \left(\bm{F}_1 \bm{F}_2 \cdots \bm{F}_{k-1}\right) \bm{F}_k &= \left(\bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \cdots + \bm{v}_{k-1} \bm{e}_{k-1}^T\right) \left(\bm{I} + \bm{v}_k \bm{e}_k^T\right) \\ &= \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \cdots + \bm{v}_{k-1} \bm{e}_{k-1}^T + \bm{v}_k \bm{e}_k^T \\ &\quad + \bm{v}_1 (\bm{e}_1^T \bm{v}_k) \bm{e}_k^T + \cdots + \bm{v}_{k-1} (\bm{e}_{k-1}^T \bm{v}_k) \bm{e}_k^T \\ &= \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \cdots + \bm{v}_{k-1} \bm{e}_{k-1}^T + \bm{v}_k \bm{e}_k^T, \end{aligned}

poiché tutti i termini misti sono nulli, essendo

\bm{e}_i^T \bm{v}_k = (\bm{v}_k)_i = 0, \qquad i = 1, 2, \ldots, k-1.

Lemma 1.2 (Inversa della Matrice di Frobenius) Consideriamo la matrice di Frobenius \bm{F} definita come:

\bm{F} = \bm{I} + \bm{v} \bm{e}_k^T

dove \bm{I} è la matrice identità, \bm{v} è un vettore colonna e \bm{e}_k^T è il vettore riga unitario con 1 nella k-esima posizione e zeri altrove.

Quando v_k = 0, l’inversa di \bm{F} è data dalla matrice:

\bm{F}^{-1} = \bm{I} - \bm{v} \bm{e}_k^T.

Dimostrazione. Per verificare che \bm{F}^{-1} = \bm{I} - \bm{v} \bm{e}_k^T sia effettivamente l’inversa di \bm{F}, dobbiamo mostrare che:

\bm{F} \cdot \bm{F}^{-1} = \bm{I}

Calcoliamo il prodotto:

\begin{aligned} \left(\bm{I} + \bm{v} \bm{e}_k^T\right) \left(\bm{I} - \bm{v} \bm{e}_k^T\right) &= \bm{I} \cdot \bm{I} - \bm{I} \cdot \bm{v} \bm{e}_k^T + \bm{v} \bm{e}_k^T \cdot \bm{I} - \bm{v} \bm{e}_k^T \cdot \bm{v} \bm{e}_k^T \\ &= \bm{I} - \bm{v} \bm{e}_k^T + \bm{v} \bm{e}_k^T - \bm{v} (\bm{e}_k^T \bm{v}) \bm{e}_k^T \\ &= \bm{I} - \bm{v} (\bm{e}_k^T \bm{v}) \bm{e}_k^T \end{aligned}

Notiamo che i termini \bm{v} \bm{e}_k^T si cancellano:

-\bm{v} \bm{e}_k^T + \bm{v} \bm{e}_k^T = 0

Pertanto, rimane:

\left(\bm{I} + \bm{v} \bm{e}_k^T\right) \left(\bm{I} - \bm{v} \bm{e}_k^T\right) = \bm{I} - \bm{v} (\bm{e}_k^T \bm{v}) \bm{e}_k^T

Per dimostrare che \bm{F}^{-1} = \bm{I} - \bm{v} \bm{e}_k^T è effettivamente l’inversa di \bm{F}, dobbiamo verificare che il termine \bm{v} (\bm{e}_k^T \bm{v}) \bm{e}_k^T sia nullo. Poiché \bm{e}_k^T \bm{v} è il k-esimo elemento del vettore \bm{v}, denotato come v_k, abbiamo:

\bm{e}_k^T \bm{v} = v_k

Se v_k = 0 (cioè l’k-esimo elemento di \bm{v} è zero), allora:

\left(\bm{I} + \bm{v} \bm{e}_k^T\right) \left(\bm{I} - \bm{v} \bm{e}_k^T\right) = \bm{I}

Poiché v_k = 0 allora \bm{F}^{-1} = \bm{I} - \bm{v} \bm{e}_k^T è l’inversa della matrice di Frobenius.

NotaOsservazione
  • Data la matrice \bm{A} dove \bm{A}_{i,\bullet} è la riga i-esima della matrice \bm{A}, l’effetto di \bm{S}_{i,j}\bm{A} è il seguente:

    \bm{A} = \begin{pmatrix} \vdots \\ \bm{A}_{i,\bullet} \\ \vdots \\ \bm{A}_{j,\bullet} \\ \vdots \end{pmatrix}, \qquad \bm{S}\bm{A} = \begin{pmatrix} \vdots \\ \bm{A}_{j,\bullet} \\ \vdots \\ \bm{A}_{i,\bullet} \\ \vdots \end{pmatrix},

    cioè scambia la riga i-esima con la riga j-esima.

  • Scambiando due volte le stesse righe di una matrice riotteniamo la matrice iniziale. Quindi, se \bm{S}_{i,j} è una matrice di scambio allora \bm{S}_{i,j}\bm{S}_{i,j}=\bm{I} cioè \bm{S}_{i,j} coincide con la sua inversa, cioè è una matrice ortogonale.

  • Il prodotto di due matrici di scambio è una matrice di permutazione, che modifica l’ordinamento delle righe di una matrice.

  • Le matrici di permutazione si possono scrivere come il prodotto di matrici di scambio. In generale il prodotto di matrici ortogonali è una matrice ortogonale4, e quindi l’inversa della matrice di permutazione coincide con la sua trasposta.

1.4 Primo passo del metodo di Gauss

Dato il sistema \bm{A}\bm{x}=\bm{b} poniamo \bm{A}^{(1)}=\bm{A} e \bm{b}^{(1)}=\bm{b},

\bm{A}^{(1)}=\begin{pmatrix} A^{(1)}_{1,1} & A^{(1)}_{1,2} & \cdots & A^{(1)}_{1,n} \\ A^{(1)}_{2,1} & A^{(1)}_{2,2} & \ddots & \vdots \\ \vdots & \ddots & \ddots & A^{(1)}_{n-1,n} \\ A^{(1)}_{n,1} & \cdots & A^{(1)}_{n,n-1} & A^{(1)}_{n,n} \end{pmatrix}.

Supponendo A^{(1)}_{1,1}\neq 0 definiamo

\begin{aligned} v^{(1)}_i &= \begin{cases} 0 & i=1 \\ \dfrac{A^{(1)}_{i,1}} {A^{(1)}_{1,1}} & i=2,3,\ldots,n \end{cases}, \\ %\bm{v}^{(1)} &= \MAT{ % 0 \\ v^{(1)}_2 \\ v^{(1)}_3 \\ \vdots \\ v^{(1)}_n %}, %\\ \bm{L}_1 &= \bm{I}-\bm{v}^{(1)}\bm{e}_1^T = \begin{pmatrix} 1 & 0 & \cdots & & 0 \\ -v^{(1)}_2 & 1 & & & \vdots \\ \vdots & & \ddots & & 0 \\ -v^{(1)}_{n-1} & & & 1 & 0 \\ -v^{(1)}_n & 0 & \cdots & 0 & 1 \end{pmatrix}. \end{aligned}

Moltiplicando il sistema \bm{A}^{(1)}\bm{x}=\bm{b}^{(1)} a sinistra per la matrice di Frobenius \bm{L}_1 otteniamo il sistema trasformato \bm{A}^{(2)}\bm{x} = \bm{b}^{(2)} dove,

\bm{A}^{(2)} = \bm{L}_1\bm{A}^{(1)} = \left(\begin{array}{c|cccc} A^{(1)}_{1,1} & A^{(1)}_{1,2} & A^{(1)}_{1,3} & \cdots & A^{(1)}_{1,n} \\ \hline 0 & A^{(2)}_{2,2} & A^{(2)}_{2,3} & \cdots & A^{(2)}_{2,n} \\ 0 & A^{(2)}_{3,2} & A^{(2)}_{3,3} & \cdots & A^{(2)}_{3,n} \\ \vdots & \vdots & & & \vdots \\ 0 & A^{(2)}_{n,2} & A^{(2)}_{n,3} & \cdots & A^{(2)}_{n,n} \end{array}\right), \quad \bm{b}^{(2)} = \bm{L}_1\bm{b}^{(1)} = \left(\begin{array}{c} b^{(1)}_1 \\ b^{(2)}_2 \\ b^{(2)}_3 \\ \vdots \\ b^{(2)}_n \end{array}\right).

ed inoltre si ha

\begin{aligned} A^{(2)}_{i,j} &= A^{(1)}_{i,j}-v^{(1)}_i A^{(1)}_{1,j}, \qquad & i,j &= 2,3,\ldots,n \\ b^{(2)}_i &= b^{(1)}_i-v^{(1)}_i b^{(1)}_1 & i &= 2,3,\ldots,n. \end{aligned}

1.5 k-esimo passo del metodo di Gauss

Supponiamo di aver effettuato k-1 passi dell’algoritmo di Gauss (senza permutazione di righe). Siamo quindi nella situazione

\bm{A}^{(k)}=\bm{L}_{k-1}\cdots\bm{L}_2\bm{L}_1\bm{A}^{(1)}

e

\bm{b}^{(k)}=\bm{L}_{k-1}\cdots\bm{L}_2\bm{L}_1\bm{b}^{(1)}

dove

\bm{A}^{(k)}= \left(\begin{array}{ccc|ccc} A^{(1)}_{1,1} & \cdots & A^{(1)}_{1,k-1} & ^{(1)}_{1,k} & \cdots & A^{(1)}_{1,n} \\ & \ddots & \vdots & \vdots & & \vdots \\ 0 & & A^{(k-1)}_{k-1,k-1} & A^{(k-1)}_{k-1,k} & \cdots & A^{(k-1)}_{k-1,n} \\ \hline 0 & \cdots & 0 & A^{(k)}_{k,k} & \cdots & A^{(k)}_{k,n} \\ \vdots & & \vdots & \vdots & & \vdots \\ 0 & \cdots & 0 & A^{(k)}_{n,k} & \cdots & A^{(k)}_{n,n} \end{array}\right), \quad \bm{b}^{(k)} = \left(\begin{array}{c} b^{(1)}_1 \\ \vdots \\ b^{(k-1)}_{k-1} \\ b^{(k)}_k \\ \vdots \\ b^{(k)}_n \end{array}\right).

Supponendo A^{(k)}_{k,k}\neq 0 e ponendo

\begin{aligned} v^{(k)}_i &= \begin{cases} 0 & i=1,2,\ldots,k \\ \dfrac{A^{(k)}_{i,k}} {A^{(k)}_{k,k}} & i=k+1,k+2,\ldots,n \end{cases}, \\ % \bm{v}^{(k)} = % \MAT{ 0 \\ \vdots \\ 0 \\ v^{(k)}_{k+1} \\ \vdots %\\ v^{(k)}_n }, \\ \bm{L}_k &= \bm{I}-\bm{v}_k\bm{e}_k^T = \left(\begin{array}{ccc|c|ccc} 1 & & & 0 & 0 & \cdots & 0 \\ & \ddots & & \vdots & \vdots & & \vdots \\ & & 1 & 0 & 0 & \cdots & 0 \\ \hline 0 & \cdots & 0 & 1 & 0 & \cdots & 0 \\ \hline 0 & \cdots & 0 & -v^{(k)}_{k+1} & 1 & & \\ \vdots & & \vdots & \vdots & & \ddots & \\ 0 & \cdots & 0 & -v^{(k)}_n & & & 1 \end{array}\right), \end{aligned}

otteniamo

\bm{L}_k\bm{A}^{(k)}= \left(\begin{array}{ccc|cccc} A^{(1)}_{1,1} & \cdots & A^{(1)}_{1,k-1} & A^{(1)}_{1,k} & A^{(1)}_{1,k+1} & \cdots & A^{(1)}_{1,n} \\ & \ddots & \vdots & \vdots & \vdots & & \vdots \\ 0 & & A^{(k-1)}_{k-1,k-1} & A^{(k-1)}_{k-1,k} & A^{(k-1)}_{k-1,k+1} & \cdots & A^{(k-1)}_{k-1,n} \\ \hline 0 & \cdots & 0 & A^{(k)}_{k,k} & A^{(k)}_{k,k+1} & \cdots & A^{(k)}_{k,n} \\ 0 & \cdots & 0 & 0 & A^{(k+1)}_{k+1,k+1} & \cdots & A^{(k+1)}_{k+1,n} \\ \vdots & & \vdots & \vdots & \vdots & & \vdots \\ 0 & \cdots & 0 & 0 & A^{(k+1)}_{n,k+1} & \cdots & A^{(k+1)}_{n,n} \end{array}\right), \quad \bm{L}_k\bm{b}^{(k)}=\left(\begin{array}{c} b^{(1)}_1 \\ \vdots \\ b^{(k-1)}_{k-1} \\ b^{(k)}_{k} \\ b^{(k+1)}_{k+1} \\ \vdots \\ b^{(k+1)}_n \end{array}\right),

dove

\begin{aligned} A^{(k+1)}_{i,j} &= A^{(k)}_{i,j}-v^{(k)}_i A^{(k)}_{k,j},\qquad &i,j&=k+1,k+2,\ldots,n \\ b^{(k+1)}_i &= b^{(k)}_i-v^{(k)}_i b^{(k)}_i & i&=k+1,k+2,\ldots,n. \end{aligned}

L’algoritmo di Gauss applica lo stesso processo iterativo su matrici sempre più piccole fino a ottenere la triangolarizzazione della matrice originale. Ad ogni passo, le operazioni elementari di riga riducono progressivamente la dimensione della matrice fino a raggiungere una forma triangolare superiore.

NotaOsservazione

Consideriamo una matrice quadrata \bm{A} di dimensione n \times n e supponiamo che ogni passo dell’algoritmo di Gauss sia applicabile, cioè A^{(k)}_{k,k} \neq 0 per ogni k. Dopo n-1 passi dell’algoritmo, otteniamo:

\bm{L}_{n-1} \bm{L}_{n-2} \cdots \bm{L}_1 \bm{A} = \bm{U},

ponendo

\bm{L} = \bm{L}_1^{-1} \bm{L}_2^{-1} \cdots \bm{L}_{n-1}^{-1}.

possiamo scrivere

\bm{A} = \bm{L} \bm{U}.

Inoltre:

  1. Le matrici \bm{L}_k = \bm{I} - \bm{v}_k \bm{e}_k^T sono matrici di Frobenius.

  2. Le matrici \bm{L}_k^{-1} = \bm{I} + \bm{v}_k \bm{e}_k^T sono ancora matrici di Frobenius.

  3. Applicando il lemma Lemma 1.1, abbiamo:

\begin{aligned} \bm{L} &= \bm{L}_1^{-1} \bm{L}_2^{-1} \cdots \bm{L}_{n-1}^{-1}, \\ &= (\bm{I} + \bm{v}_1 \bm{e}_1^T) (\bm{I} + \bm{v}_2 \bm{e}_2^T) \cdots (\bm{I} + \bm{v}_{n-1} \bm{e}_{n-1}^T), \\ &= \bm{I} + \bm{v}_1 \bm{e}_1^T + \bm{v}_2 \bm{e}_2^T + \cdots + \bm{v}_{n-1} \bm{e}_{n-1}^T. \end{aligned}

Quindi, \bm{L} è una matrice triangolare inferiore.

La matrice \bm{A} è stata quindi decomposta come il prodotto di una matrice triangolare inferiore \bm{L} e una matrice triangolare superiore \bm{U}. Questa decomposizione è nota come decomposizione LU o fattorizzazione LU.

NotaOsservazione

Dalla decomposizione LU della matrice \bm{A}, abbiamo:

\begin{aligned} \bm{L} &= \begin{pmatrix} 1 & 0 & 0 & \cdots & 0 \\ v^{(1)}_2 & 1 & 0 & \cdots & 0 \\ v^{(1)}_3 & v^{(2)}_3 & \ddots & \ddots & \vdots \\ \vdots & \vdots & & 1 & 0 \\ v^{(1)}_n & v^{(2)}_n & \cdots & v^{(n-1)}_n & 1 \end{pmatrix}, \quad \text{dove} \quad v^{(j)}_i = \dfrac{A^{(j)}_{i,j}}{A^{(j)}_{j,j}} \\ \bm{U} &= \begin{pmatrix} A^{(1)}_{1,1} & A^{(1)}_{1,2} & A^{(1)}_{1,3} & \cdots & A^{(1)}_{1,n} \\ 0 & A^{(2)}_{2,2} & A^{(1)}_{2,3} & \cdots & A^{(2)}_{2,n} \\ 0 & 0 & \ddots & \ddots & \vdots \\ \vdots & \vdots & & A^{(n-1)}_{n-1,n-1} & A^{(n-1)}_{n-1,n} \\ 0 & 0 & \cdots & 0 & A^{(n)}_{n,n} \end{pmatrix} \end{aligned}

Da quanto sopra, è evidente che le matrici \bm{L} e \bm{U} possono essere memorizzate all’interno della matrice originale \bm{A}, senza memorizzare esplicitamente la diagonale di \bm{L}. Questo approccio consente di implementare un algoritmo che calcola la decomposizione LU e salva direttamente il risultato nella stessa matrice \bm{A}.

L’algoritmo modifica la matrice \bm{A} in-place: i coefficienti di eliminazione prendono il posto degli zeri sotto la diagonale, formando \bm{L} (con 1 sottintesi sulla diagonale), mentre sopra la diagonale resta \bm{U}.

Figura 1.2: La decomposizione LU senza pivoting: è l’eliminazione di Gauss in cui il moltiplicatore, invece di essere buttato via, viene memorizzato al posto dell’elemento che ha appena annullato.

1.6 Algoritmo di Gauss in presenza di pivoting

Nel processo di eliminazione di Gauss di base, l’algoritmo esegue operazioni sulle righe per convertire una matrice in una forma triangolare superiore. Tuttavia, questo metodo può incontrare instabilità numerica, specialmente quando la matrice presenta elementi di pivot molto piccoli o è mal condizionata. Per migliorare la stabilità numerica e l’accuratezza, si utilizza il pivoting parziale.

Il pivoting parziale consiste nel selezionare l’elemento di valore assoluto massimo nella colonna corrente come pivot e scambiare le righe per portare questo elemento massimo nella posizione del pivot. Questa strategia aiuta a minimizzare gli errori di arrotondamento e migliora la robustezza dell’algoritmo.

Per analizzare l’algoritmo di eliminazione di Gauss con pivoting parziale, è necessario gestire anche le matrici di scambio che vengono introdotte. Queste matrici sono utilizzate per scambiare righe e devono essere propagate attraverso le operazioni di fattorizzazione. Introduciamo quindi il seguente lemma per capire questo processo:

Lemma 1.3 (Frobenius e Scambi) Sia \bm{F} = \bm{I} - \bm{v} \bm{e}_k^T una matrice di Frobenius e \bm{S}_{i,j} una matrice di scambio che scambia le righe i e j. Se i e j sono entrambi maggiori di k, allora la matrice risultante \bm{F} \bm{S}_{i,j} può essere scritta come \bm{S}_{i,j} \bm{F}', dove \bm{F}' è anch’essa una matrice di Frobenius. In particolare:

\bm{F}' = \bm{I} - \bm{w} \bm{e}_k^T, \quad \text{dove} \quad \bm{w} = \bm{S}_{i,j} \bm{v}.

Dimostrazione. Calcoliamo direttamente il prodotto \bm{F} \bm{S}_{i,j} e confrontiamolo con la forma \bm{S}_{i,j} \bm{F}'.

  1. Osservazione sui vettori unitari: Nota che \bm{e}_k^T \bm{S}_{i,j} \bm{x} = x_k=\bm{e}_k^T\bm{x} se i \neq k e j \neq k. Questo perché, quando i e j sono diversi da k, la matrice di scambio \bm{S}_{i,j} non sposta la k-esima componente. Quindi possiamo scrivere \bm{e}_k^T \bm{S}_{i,j} = \bm{e}_k^T.

  2. Calcolo di \bm{F} \bm{S}_{i,j}: Consideriamo il prodotto: \begin{aligned} \bm{F} \bm{S}_{i,j} &= (\bm{I} - \bm{v} \bm{e}_k^T) \bm{S}_{i,j} \\ &= \bm{S}_{i,j} - \bm{v} \bm{e}_k^T \bm{S}_{i,j} \\ &= \bm{S}_{i,j} - \bm{v} \bm{e}_k^T\qquad[\text{per il punto 1}] \end{aligned}

  3. Calcolo di \bm{S}_{i,j} \bm{F}': Sostituendo \bm{F}' = \bm{I} - \bm{w} \bm{e}_k^T, otteniamo:

    \begin{aligned} \bm{S}_{i,j} \bm{F}' &= \bm{S}_{i,j} (\bm{I} - \bm{w} \bm{e}_k^T) \\ &= \bm{S}_{i,j} - \bm{S}_{i,j} \bm{w} \bm{e}_k^T, \\ &= \bm{S}_{i,j} - \bm{S}_{i,j}\bm{S}_{i,j} \bm{v} \bm{e}_k^T .\\ &= \bm{S}_{i,j} - \bm{v} \bm{e}_k^T. \qquad[\text{per la proprietà $\bm{S}_{i,j}\bm{S}_{i,j}=\bm{I}$}] \end{aligned}

e quindi \bm{F} \bm{S}_{i,j}=\bm{S}_{i,j} \bm{F}'.

L’algoritmo di Gauss con pivoting può essere formulato come segue:

\bm{L}_{n-1}\bm{P}_{n-1}\bm{L}_{n-2}\bm{P}_{n-2}\cdots\bm{L}_2\bm{P}_2\bm{L}_1\bm{P}_1\bm{A} = \bm{U},

dove \bm{P}_k è una matrice di scambio, utilizzata se è necessario scambiare righe al k-esimo passo dell’algoritmo di Gauss. Quando non è necessario scambiare righe, \bm{P}_k è la matrice identità. Si osserva che \bm{P}_k = \bm{S}_{i,j} per i,j \geq k, e quindi, applicando il lemma Lemma 1.3, otteniamo che:

\bm{P}_k \bm{L}_{k-1} = \bm{L}_{k-1}' \bm{P}_k,

dove \bm{L}_{k-1}' = \bm{I} - \bm{w}_k \bm{e}_k^T e \bm{w}_k = \bm{P}_k \cdots \bm{P}_2 \bm{P}_1 \bm{v}_k. Spostando le matrici di scambio a destra nell’equazione precedente, otteniamo:

\left(\bm{L}_{n-1}' \bm{L}_{n-2}' \cdots \bm{L}_2' \bm{L}_1'\right) \left(\bm{P}_{n-1} \bm{P}_{n-2} \cdots \bm{P}_2 \bm{P}_1\right) \bm{A} = \bm{U},

dove la matrice \bm{U} è triangolare superiore e le matrici \bm{L}_k' sono matrici di Frobenius date da:

\bm{L}_k' = \bm{I} - \bm{w}_k \bm{e}_k^T, \qquad \bm{w}_k = \bm{P}_k \cdots \bm{P}_2 \bm{P}_1 \bm{v}_k.

Definiamo ora:

\bm{L} = (\bm{L}_1')^{-1} (\bm{L}_2')^{-1} \cdots (\bm{L}_{n-1}')^{-1}, \qquad \bm{P} = \bm{P}_{n-1} \bm{P}_{n-2} \cdots \bm{P}_2 \bm{P}_1,

e otteniamo:

\bm{P} \bm{A} = \bm{L} \bm{U}.

Quindi, l’algoritmo di eliminazione consente di decomporre la matrice \bm{P} \bm{A} in un prodotto \bm{L} \bm{U}, dove \bm{P} rappresenta la sequenza di scambi di righe applicati alla matrice \bm{A}, e \bm{L} e \bm{U} sono rispettivamente la matrice triangolare inferiore e superiore ottenute tramite la decomposizione LU.

NotaOsservazione

Si è illustrato il funzionamento dell’algoritmo di fattorizzazione con pivoting, noto come pivot parziale, che prevede solo lo scambio delle righe. Questo tipo di pivoting equivale a riordinare le equazioni del sistema lineare.

Esiste però un pivoting più generale, chiamato pivot totale, che consente sia scambi di righe che di colonne. In questo caso, lo scambio di colonne corrisponde a una diversa numerazione delle variabili nel sistema lineare.

Il metodo di fattorizzazione LU con pivot parziale si estende facilmente al pivot totale, e si ottiene la seguente decomposizione:

\bm{P} \bm{A} \bm{Q} = \bm{L} \bm{U},

dove \bm{P} è la matrice di permutazione delle righe, ottenuta come prodotto delle matrici elementari di scambio delle righe, e \bm{Q} è la matrice di permutazione delle colonne, ottenuta come prodotto delle matrici elementari di scambio delle colonne.

L’algoritmo di decomposizione LU con pivoting parziale: lo scambio di righe è realizzato permutando gli indici in \bm{p}, così la matrice non viene mai spostata in memoria, e i moltiplicatori \beta prendono il posto degli zeri sotto la diagonale.

NotaOsservazione: Pivot Numerico

Idealmente, se l’elemento pivotale è non nullo, non sarebbe necessario eseguire uno scambio di righe. Tuttavia, se l’elemento pivotale è molto piccolo in valore assoluto, l’algoritmo di fattorizzazione può produrre complementi di Schur5 molto grandi, il che potrebbe compromettere la stabilità numerica dell’algoritmo.

Per affrontare questo problema, nella pratica si adotta una strategia di controllo: si sceglie l’elemento pivotale con il valore assoluto maggiore nella colonna — noto come pivot parziale — o nella sottomatrice — noto come pivot totale — composta dagli elementi che devono ancora essere fattorizzati, quando l’elemento pivotale corrente è al di sotto di una soglia prestabilita.

Questa tecnica, chiamata pivot numerico, è progettata per garantire la stabilità numerica dell’algoritmo di fattorizzazione, prevenendo problemi che potrebbero derivare da piccoli valori degli elementi pivotali.

NotaOsservazione: Pivot Simbolico

Oltre alla stabilità numerica, c’è un’altra considerazione importante nella scelta del pivot: la preservazione della sparsità della matrice.

Nella pratica, spesso si lavora con matrici sparse, cioè matrici in cui solo un numero limitato di elementi è diverso da zero, tipicamente dell’ordine della dimensione della matrice piuttosto che del suo quadrato. È cruciale mantenere questa sparsità durante il processo di fattorizzazione.

Il meccanismo del complemento di Schur tende infatti a generare molti elementi non nulli, il che può portare a una crescita esponenziale nel numero di elementi non nulli e, conseguentemente, a un eccessivo consumo di memoria per memorizzare le matrici \bm{L} e \bm{U} risultanti.

Per controllare la crescita di elementi non nulli e preservare la sparsità, è utile eseguire scambi di righe, che corrispondono a scambi delle equazioni nel sistema. Questo approccio può aiutare a mantenere la matrice più sparsa possibile.

Mostriamo questo effetto con il seguente esempio:

Esempio

Consideriamo la fattorizzazione LU della matrice \bm{A}\in\mathbb{R}^{10\times 10}

\bm{A} = \begin{pmatrix} \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} \\ \bm{1} & \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ \bm{1} & 0 & \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ \bm{1} & 0 & 0 & \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 \\ \bm{1} & 0 & 0 & 0 & \bm{1} & 0 & 0 & 0 & 0 & 0 \\ \bm{1} & 0 & 0 & 0 & 0 & \bm{1} & 0 & 0 & 0 & 0 \\ \bm{1} & 0 & 0 & 0 & 0 & 0 & \bm{1} & 0 & 0 & 0 \\ \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} & 0 & 0 \\ \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} & 0 \\ \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} \end{pmatrix}

e della matrice che si ottiene prendendo righe e colonne nell’ordine inverso, cioè

\bm{P}\bm{A}\bm{P} = \begin{pmatrix} \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} \\ 0 & \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} \\ 0 & 0 & \bm{1} & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} \\ 0 & 0 & 0 & \bm{1} & 0 & 0 & 0 & 0 & 0 & \bm{1} \\ 0 & 0 & 0 & 0 & \bm{1} & 0 & 0 & 0 & 0 & \bm{1} \\ 0 & 0 & 0 & 0 & 0 & \bm{1} & 0 & 0 & 0 & \bm{1} \\ 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} & 0 & 0 & \bm{1} \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} & 0 & \bm{1} \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \bm{1} & \bm{1} \\ \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} & \bm{1} \end{pmatrix} Abbiamo considerato gli elementi non nulli di \bm{A} come aventi valore 1, ma l’argomento che desideriamo illustrare riguarda esclusivamente il processo di formazione di nuovi elementi non nulli durante la fattorizzazione, noto con il termine inglese fill-in. Questo è distinto dal valore che tali elementi assumono nei fattori di Gauss \bm{L} e \bm{U}.

In seguito, analizzeremo la struttura degli elementi non nulli nella matrice \bm{A}, nella matrice permutata simmetricamente \bm{P}\bm{A}\bm{P}, e nei rispettivi fattori triangolari superiori e inferiori ottenuti dall’algoritmo di Gauss, assumendo che non sia necessario eseguire pivoting numerico.

È importante notare che nella forma originale della matrice \bm{A}, i fattori risultanti dall’algoritmo di Gauss sono pieni, il che implica un riempimento totale.

Invece, nella forma permutata, non si generano nuovi elementi non nulli. Inoltre, poiché la diagonale di \bm{L} è composta esclusivamente da 1, non è necessario memorizzarla. Di conseguenza, non viene richiesta ulteriore memoria rispetto a quella necessaria per memorizzare gli elementi non nulli della matrice.

Figura 1.3: In alto mostriamo la struttura dei non zeri di \bm{A} e di \bm{P}\bm{A}\bm{P}, in mezzo quella dei fattori di \bm{A} ed in basso quella dei fattori di \bm{P}\bm{A}\bm{P}.

In sintesi

  • L’eliminazione di Gauss trasforma \bm{A}\bm{x}=\bm{b} in un sistema triangolare con \sim 2n^3/3 flop; la risoluzione all’indietro costa poi solo \mathcal{O}(n^2).
  • In forma matriciale ogni passo è la moltiplicazione per una matrice di Frobenius \bm{F}_k, la cui inversa si ottiene cambiando di segno i moltiplicatori: da qui \bm{A}=\bm{L}\bm{U} a costo nullo.
  • La fattorizzazione LU va calcolata una volta sola: sistemi con la stessa matrice e termini noti diversi costano \mathcal{O}(n^2) ciascuno.
  • Il pivoting parziale serve alla stabilità, non all’esistenza: scambia le righe per massimizzare il pivot e dà \bm{P}\bm{A}=\bm{L}\bm{U}.
  • Pivot simbolicamente nullo e pivot numericamente piccolo sono problemi diversi: il primo riguarda la singolarità, il secondo l’amplificazione degli errori di arrotondamento.

  1. Johann Carl Friedrich Gauss (1777-1855)↩︎

  2. Perché non si elimina l’incognita w?↩︎

  3. Ferdinand Georg Frobenius (1849-1917)↩︎

  4. Se \bm{A} e \bm{B} sono matrici ortogonali, allora (\bm{A}\bm{B})^T (\bm{A}\bm{B}) = \bm{B}^T (\bm{A}^T \bm{A}) \bm{B} = \bm{B}^T \bm{I} \bm{B} = \bm{B}^T \bm{B} = \bm{I} e quindi il prodotto è una matrice ortogonale.↩︎

  5. Issai Schur (1875-1941)↩︎