# Metodo di MacCormack

Il metodo di MacCormack è un metodo numerico alle differenze finite e viene impiegato per la soluzione di equazioni o sistemi di equazioni differenziali alle derivate parziali iperboliche. Lo schema numerico è utilizzato in fluidodinamica computazionale per la risolvere le leggi di conservazione, ha una precisione del secondo ordine sia nel tempo che nello spazio. Il suo stencil spaziale è di tipo simmetrico, mentre l'avanzamento temporale è di tipo esplicito, essendo la soluzione al tempo nuovo dipendente soltanto dalle proprietà spaziali al tempo vecchio. Il metodo prende il nome dal suo ideatore Robert W. MacCormack, che lo pubblicò per la prima volta nel 1969. Si tratta di un metodo semplice, computazionalmente veloce, ma che introduce non trascurabili errori di dispersione nelle regioni caratterizzate da gradienti elevati (fenomeno di Gibbs).

## Formulazione

Partendo dall'equazione differenziale alle derivate parziali:
${\frac {\partial u\left(x,t\right)}{\partial t}}+{\frac {\partial f\left(x,t\right)}{\partial x}}=0$,
con $f=f(u(x,t))$, ovvero che $f$ è una funzione di $u(x,t)$, il metodo numerico di MacCormack ricerca la soluzione in due passi distinti, chiamati dall'inglese predictor step e corrector step per mezzo dell'alternanza di differenze finite in avanti e all'indietro (o viceversa) la cui successione porta alla soluzione esplicita al tempo nuovo. A seconda che si parta con una differenza in avanti e poi all'indietro, o prima all'indietro e poi in avanti il metodo verrà definito forward predictor-backward corrector o backward predictor-forward corrector.

### Primo Passo (predictor step)

Partendo dai valori di $u$ e $f$al tempo $t^{n}$nei nodi $j$ e $j+1$, è possibile calcolare una prima approssimazione del vettore $u^{n+1}$, nel punto $j$ al tempo nuovo $t^{n+1}$, chiamata ${\tilde {u}}$, secondo l’equazione:
${\tilde {u}}_{j}=u_{j}^{n}-{\frac {\Delta t}{\Delta x}}(f_{j+1}^{n}-f_{j}^{n})$.
La soluzione ${\tilde {u}}_{j}$così ottenuta risulta funzione dei soli nodi $j$ e $j+1$, e pertanto rappresenta una differenza in avanti nello spazio (forward predictor).
Noto il vettore ${\tilde {u}}_{j}$, si possono determinare le approssimazioni ${\tilde {f}}_{j}=f({\tilde {u}}_{j})$ della grandezza $f$ al nodo $j$ allo stesso tempo successivo $t^{n+1}$.

### Secondo Passo (corrector step)

Nel secondo passo, si valuta la soluzione ${\tilde {u}}$ al tempo $t^{n+1}$ nel nodo $j-1$ introducendo una differenza finita all'indietro nello spazio (backwad corrector):
${\tilde {u}}_{j-1}=u_{j-1}^{n}-{\frac {\Delta t}{\Delta x}}(f_{j}^{n}-f_{j-1}^{n})$,
da cui si ricava il corrispondente ${\tilde {f}}_{j-1}=f({\tilde {u}}_{j-1})$.
Infine, eseguendo una semi-differenza in avanti nel tempo:
$u_{j}^{n+1}=u_{j}^{n+1/2}-{\frac {\Delta t}{2\Delta x}}({\tilde {f}}_{j}-{\tilde {f}}_{j-1})$,
e approssimando $u_{j}^{n+1/2}$ con la media dei valori al tempo $t^{n}$e $t^{n+1}$ della soluzione, calcolati in prima approssimazione durante il predictor step:
$u_{j}^{n+1/2}={\frac {1}{2}}(u_{j}^{n}-{\tilde {u}}_{j}^{n})$
la sostituzione permette di giungere all'espressione finale:
$u_{j}^{n+1}={\frac {1}{2}}[u_{j}^{n}-{\tilde {u}}_{j}^{n}-{\frac {\Delta t}{\Delta x}}({\tilde {f}}_{j}-{\tilde {f}}_{j-1})]$
Si dimostra che i migliori risultati si ottengono se si inverte l’ordine delle differenze (forward predictor-backward corrector ad un passo, quindi backward predictor-forward corrector al passo successivo) ad ogni passo temporale $\Delta t$.

## Stabilità

La discretizzazione spaziale in avanti impiegata nel primo passo è instabile quando tutti gli autovalori della matrice Jacobiana associata al problema hanno segno positivo. La discretizzazione all'indietro, al contrario, è instabile se gli autovalori sono tutti negativi. Se per esempio lo schema viene applicato in fluidodinamica la prima condizione si verifica per un regime supersonico, mentre la seconda per regime subsonico. Tuttavia si può dimostrare che la combinazione delle due condizioni rende lo schema completo stabile, purché sia verificato il criterio di stabilità di Courant-Fredrichs-Lewy:
$CFL=\lambda {\frac {\Delta \,t}{\Delta \,x}}<1$,
il quale mette in relazione la discretizzazione spaziale $\Delta x$ con il massimo avanzamento nel tempo $\Delta t$, tramite la massima velocità dell'informazione trasportata dall'onda fluida $\lambda$. Questa condizione garantisce che durante l'avanzamento temporale l'informazione non sia uscita dal dominio spaziale, e ne preserva la stabilità.
L'alternanza di un passo in avanti ed uno all'indietro consente al metodo di ottenere un'accuratezza del secondo ordine $O(\Delta x^{2},\Delta t^{2})$, in quanto gli errori di troncamento dei due semi-step si elidono a vicenda.
Quando applicato in fluidodinamica la stabilità dello schema viene influenzata dalla presenza di discontinuità (come un'onda d'urto). Risulta infatti che la variante forward predictor-backwards corrector sia più adatta a rappresentare le discontinuità che viaggiano da sinistra verso destra, e viceversa la variante backwards predictor-forward corrector. Per questo motivo nei problemi caratterizzati da flussi non stazionari, ed in generale dove non è nota a priori la direzione delle discontinuità, risulta conveniente alternare ad ogni step temporale le due varianti.