Lo scopo di questo progetto è la risoluzione numerica di un sistema lineare di ODE (ordinary differential equations) caratterizzato dall'avere un alto coefficiente
di stiffness ed essere pertanto soggetto a generare una forte instabilità numerica se approcciato con un metodo numerico non consono.
Il problema è stato risolto con vari algoritmi numerici e con vari tipi di mesh. Come mostrano i risultati, la A-stabilità ed, ancor più, la L-stabilità
sono due proprietà fortemente desiderabili in un algoritmo risolutore, infatti, in loro assenza si rende necessario utilizzare un numero esorbitante
di nodi per approssimare numericamente la soluzione. I metodi numerici che godono solo della zero-stabilità si sono rivelati assolutamente non
in grado di approssimare efficacemente la soluzione, coerentemente con le previsioni teoriche.
I codici sono stati implementati in linguaggio MATLAB, tuttavia, essendo tutti gli algoritmi stati scritti from scratch (da zero) utilizzando
unicamente la libreria standard di MATLAB, i codici risultano pienamente compatibili sia con le licenze base di MATLAB
(senza la necessità di specifici toolbox a pagamento), sia con il software open-source GNU Octave.
Inoltre, una relazione molto più dettagliata di questo file README è stata inserita nel repository in formato PDF.
Sia i codici che la relazione sono stati sviluppati come progetto individuale.
Si consideri il problema di Cauchy
dove M è definita come la matrice di dimensione
e dove
da risolvere per
Per calcolare numericamente la soluzione, l'intervallo temporale
chiamata mesh e su ogni nodo della mesh viene approssimato il valore della funzione (vettoriale).
La distanza
Tuttavia, la scrittura della soluzione come combinazione lineare di termini della forma
Come noto dall'analisi, i sistemi lineari di equazioni differenziali ordinarie ammettono come soluzione esatta
La funzione
Il coefficiente di stiffness del sistema vale:
Dal momento che il coefficiente di stiffness è così elevato si può catalogare questo sistema di ODE come problema stiff.
La soluzione esatta è la seguente:
Possiamo osservare che essa presenta un picco iniziale nei primissimi valori di 𝑡, dove raggiunge anche valori di
Dal momento che la funzione soluzione presenta valori così elevati, risulta significativo anche lo studio dell'errore relativo, oltre a quello dell'errore
assoluto.
Il metodo di Radau_IIA è un metodo numerico di Runge-Kutta basato sul metodo di collocazione Radau IIA a tre stadi,
si tratta di un metodo di ordine
La L-stabilità permette di smorzare efficacemente le componenti associate agli autovalori grandi in modulo. Il prezzo da pagare è che il metodo è anche costoso da un punto di vista computazionale: per ogni nodo della mesh il metodo richiede di risolvere un sistema
Seguono alcuni grafici per rappresentare la soluzione approssimata. I tre grafici seguenti mostrano la prima componente
t0 = 0, T = 50, h = 1 |
t0 = 0, T = 50, h = 0.1 |
t0 = 0, T = 50, h = 0.01 |
Seguono inoltre le tabelle degli errori commessi:
|
|
||||||||||||||||||||||||||||||
Come descritto sopra, i problemi stiff forzano ad utilizzare un passo molto più piccolo del necessario per approssimare la soluzione, tuttavia, un passo così
piccolo è necessario per descrivere efficacemente la soluzione unicamente in un intervallo molto ristretto di valori, altrove si può tranquillamente utilizzare un
passo molto più ampio. È qui che le mesh omogenee mostrano i loro limiti e si è di conseguenza deciso di implementare anche dei metodi su una mesh non omogenea.
L'idea implementativa è stata quella di discretizzare con un passo
L'idea è in questo caso vincente. Il prezzo da pagare è che essendo la mesh non omogenea non è più possibile utilizzare la fattorizzazione
Il metodo di Gauss-Legendre è anch'esso un metodo di Runge-Kutta basato su un metodo di collocazione, solo che ora viene utilizzata un'interpolazione di
Gauss-Legendre. Il metodo implementato è un metodo di Gauss-Legendre a 3 stadi, e dunque di ordine 6. A differenza del metodo di Radau IIA, il metodo di
Gauss-Legendre è solo A-stabile, e non L-stabile.
Le oscillazioni compaiono solo sulla
L’immagine seguente mette in luce come appare la soluzione su una mesh non omogenea:
Forniamo infine una tabella con gli errori fissati i parametri
| Num. nodi | Err. Ass. | Err. Rel. | Scelta dei passi: h1 in [t0, 20], h2 in [20, 100], h3 in [100, T] |
|---|---|---|---|
| 291 | 6.69894e+02 | 3.02915e-05 | h1 = 0.1, h2 = 1, h3 = 1000 |
| 2,900 | 1.66442e-02 | 7.51429e-10 | h1 = 0.01, h2 = 0.1, h3 = 100 |
| 20,180 | 5.34687e-07 | 2.41393e-14 | h1 = 0.001, h2 = 1, h3 = 100 |
| 21,791 | 1.08034e-07 | 4.87737e-15 | h1 = 0.001, h2 = 0.1, h3 = 10 |
| 100,000 | 6.69894e+02 | 3.02915e-05 | h = 0.1, mesh omogenea |
| 1,000,000 | 1.66442e-02 | 7.51429e-10 | h = 0.01, mesh omogenea |
È interessante osservare come, lavorare con
Se non si vuole utilizzare una mesh omogenea, si può optare anche per una mesh adattiva.
I metodi adattivi sono metodi numerici in cui la mesh non è fissata a priori ma i suoi nodi sono calcolati in fase di esecuzione del programma,
sulla base di una stima dell’errore. In ogni nodo si determina automaticamente quanto vale il passo di discretizzazione successivo. In questo
particolare problema i metodi adattivi risultano particolarmente efficaci.
Il metodo di Gauss-Legendre 2(6) è un metodo di Runge Kutta implicito adattivo embedded, ciò significa che
esistono due metodi di Gauss-Legendre,
uno di ordine 2 ed uno di ordine 6, che condividono lo stesso Tableau di Butcher, eccezion fatta per il vettore
Il vantaggio è considerevole: risolvendo gli stessi sistemi lineari e cambiando solo i pesi
Se lo scarto è inferiore ad una tolleranza fissata si accetta il valore trovato inserendolo nella mesh e poi si procede a calcolare il nuovo passo
Segue una tabella contenente i vari errori al variare della tolleranza, (
| Tolleranza | Numero nodi | Err. Ass. | Err. Rel. | hmin | hmax |
|---|---|---|---|---|---|
| 1e+5 | 38 | 1.32016e+02 | 5.97904e-06 | 0.001 | 7515.21744 |
| 1e+4 | 70 | 1.62036e+01 | 7.31537e-07 | 0.001 | 7552.67047 |
| 1e+3 | 138 | 3.22138e-01 | 1.45438e-08 | 0.001 | 7452.33204 |
| 1e+2 | 281 | 2.18029e-02 | 9.84334e-10 | 0.001 | 5030.59686 |
| 1e+1 | 589 | 7.42305e-04 | 3.35125e-11 | 0.001 | 8677.20076 |
| 1e+0 | 1,254 | 7.42405e-05 | 3.35171e-12 | 0.00096 | 8649.32396 |
| 1e-1 | 2,687 | 6.57684e-06 | 2.96922e-13 | 0.00045 | 7031.06471 |
| 1e-2 | 5,774 | 7.13678e-07 | 3.22201e-14 | 0.00021 | 4776.71363 |
| 1e-3 | 12,423 | 1.86265e-07 | 8.40921e-15 | 0.00010 | 7578.50364 |
| 1e-4 | 26,748 | 1.37839e-07 | 6.22294e-15 | 0.00004 | 7133.44752 |
È inoltre particolarmente interessante osservare come anche fissando una tolleranza enorme di
Il costo computazionale è assolutamente irrisorio, richiedendo al più qualche secondo per tolleranze inferiori a
Segue una progressione di immagini che descrive con diversi livelli di zoom l’approssimazione di
t ∈ [0, 20] |
t ∈ [0, 50] |
t ∈ [0, 220] |
t ∈ [0, 10,000] |
Il repository comprende inoltre i seguenti metodi numerici:
- BDF 2 e BDF 3 a passo costante;
- Crank-Nicolson su mesh non omogenea;
- Eulero implicito;
- Pareschi-Russo;
- Runge-Kutta classico di ordine 4;
- Runge-Kutta-Fehlberg 4(5) adattivo.
La trattazione, l'analisi ed i risultati relativi a questi metodi vengono discussi nella relazione completa.
-
Aprire la cartella del repository in MATLAB o GNU Octave.
-
Aprire main.m e impostare la variabile
metodo, per esempio:metodo = 'Radau_IIA_5'; % metodo = 'Gauss_Legendre_6_mesh_non_omogenea'; % metodo = 'Gauss_Legendre_2_6';
-
Modificare, se lo si desidera, i parametri
t_0,T, il passohuniforme, i tre passi della mesh non omogeneapasso_1,passo_2epasso_3, oppure la tolleranzatolldel metodo adattivo. -
Eseguire
main.m.
Lo script genererà i dati iniziali, calcolerà la soluzione numerica e quella esatta, stamperà gli errori e produrrà i grafici delle componenti
I solver numerici sono stati implementati ed ottimizzati per questo specifico esperimento: assumono un sistema autonomo lineare
Questa scelta permette di mettere in evidenza le proprietà numeriche dei metodi e di sfruttare direttamente la struttura lineare del problema per ottimizzare
il costo computazionale richiesto dai metodi numerici.











