![INDIETRO](prev1.gif) |
Laboratorio 9
|
|
precisione delle soluzioni delle ODE
Quanto sono buone le soluzioni trovate numericamente ?
Possiamo rispondere facendo una analisi numerica dei vari algoritmi, ovviamente.
Qui ricordiamo solamente che un problema ben condizionato in avanti generalmente è mal condizionato
all'indietro, e viceversa. Inoltre gli errori tendono ad accumularsi nel tempo, per cui anche
con un problema ben condizionato occorre stare attenti alla stabilità numerica dell'algoritmo,
per esempio scegliendo opportunamente il passo.
Ma quando ci si trova, come nel nostro caso, ad usare delle routines scritte da altri e di cui
non conosciamo le proprietà numeriche esatte, possiamo comunque fare qualche prova per
capire meglio il loro comportamento con il problema che ci interessa.
- possiamo prima provare il comportamento delle routines su un piccolo parco di equazioni a noi ben note e con
varie difficoltà numeriche note.
(esempio di testset usato comunemente)
- possiamo provare a variare di poco i dati iniziali e vedere di quanto variano i risultati
- possiamo integrare le equazioni partento da un tempo t0 con una condizione iniziale x0 fino
ad arrivare a un tempo t1 con un valore calcolato x1 e poi provare a ritornare indietro impostando
come dato iniziale t1, x1 e studiare cosi' il buon condizionamento del problema nelle due direzioni.
- possiamo confrontare diversi algoritmi e diversi programmi con la stessa equazione.
Ripetiamo i calcoli partendo da 1, 1,001 e 0.999:
f=@(x,t) (3-x).*x + sin(t)
t1=linspace(0,10,500);
x1=lsode(f,1,t1);
x2=lsode(f,1.1,t1);
x3=lsode(f,0.9,t1);
plot(t1,x1-x2,t1,x1-x3);
plot(t1,log(abs(x1-x2)),t1,log(abs(x1-x3)));
esercizio:
plottare le soluzioni per valori iniziali tra 1 e 2 a passi di 0.1 tutte su uno stesso grafico
Qui proviamo a tracciare la "andata" e "ritorno" delle risoluzioni delle equazioni già viste.
f=@(x,t) (3-x).*x + sin(t)
tr=linspace(0,10,500);
xr=lsode(f,1,tr);
tl=linspace(10,0,500);
xl=lsode(f,xr(end),tl);
plot(tl,xl,tr,xr);
Il risultato non sembra molto buono... Provare ad aumentare il numero di passi o la precisione dell'algoritmo !
Cosa sta succedendo ??
Proviamo ora l'altro algoritmo:
f=@(t,x) (3-x).*x + sin(t)
[tr,xr]=ode45(f,[0,5],1);
[tl,xl]=ode45(f,[5,0],xr(end));
plot(tl,xl,tr,xr);
Con l'intervallo [0.5] si vede già una certa differenza; cosa succede se si prende
l'intervallo [0,10] ??
esercizio:
trovare, se possibile, un sistema per risolvere il problema di Cauchy x'=(3-x)*x-sin(t) con condizione
iniziale x(0)=1 nell'intervallo [-10,0].
![INDIETRO](prev1.gif) |
Laboratorio Didattico di Matematica Computazionale - Sergio Steffè - AA 2017/2018 - PISA |
|