unina.stidue.netunina.stidue.net/calcolo numerico 2/materiale/altre... · web viewil metodo di...

33
Esame di Calcolo Numerico II A.A. 2008/2009 Elaborato 3 Celentano Sergio matr. 885/211

Upload: others

Post on 17-Jan-2020

1 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Esame di Calcolo Numerico IIA.A. 2008/2009

Elaborato 3

Celentano Sergiomatr. 885/211

Page 2: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Elaborato 3.1

Modello SIR di diffusione di un’epidemia

Descrizione del problema

Calcolare con la function matlab ode45 la soluzione del seguente problema:

S ’ (t )=−a∗S ( t )∗I ( t ) t є [0,20]I (t )=a∗S (t)∗I (t )−b∗I( t)

R(t )=b∗I (t)

con condizioni iniziali,

S(0)=199I (0)=1R(0)=0

Dove:S = suscettibili di infezioneI = infettiR = immuni(guariti)

L’epidemia si diffonde tramite l’incontro tra S ed I, il numero di persone che passa da S adI è proporzionale al numero di incontri secondo una costante a = costante di contagio , ilnumero di guariti aumenta quando sono curati secondo una costante b = costante diguarigione.Porre b = 0.1 e fare il grafico della soluzione, della percentuale di individui infetti, edeterminare dopo quanto tempo si verifica il picco dell’epidemia, per diversi valori di a(0.005, 0.01, 0.05, 0.1).

Soluzione proposta

Per risolvere il problema si è pensato ad uno script che chiamasse il solver ode45 tante volte quante sono le diverse condizioni iniziali in modo da osservare la reazione della popolazione in funzione della costante di contagio.

b = 0.1;tspan = [0, 20];y0 = [199 1 0]';a = [0.005 0.01 0.05 0.1]; Lo scriptfile prevede una chiamata al solver al quale vengono passati un handle della function definita nel file sir.m

for i=1:length(a) [t y] = ode45(@sir, tspan, y0, [], a(i), b);

Page 3: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

...Le equazioni descritte nel function file sono le stesse indicate nella specifica del problema.La funzione restituisce il risultato sotto forma di matrice che riporta in ciascuna colonna i valori relativi alle tre incognite del problema.

function der = sir(t, y, a, b) Sder = -a*y(1)*y(2); Ider = a*y(1)*y(2) -b*y(2); Rder = b*y(2); der = [Sder Ider Rder]';end

A questo punto visualizziamo i risultati e di seguito un grafico che descrive la percentuale di individui infetti con l’indicazione del picco e del tempo t corrispondente.

...figure(); plot(t, y(:,1),'-', t, y(:,2),'--', t, y(:,3), '*', 'LineWidth', 2); title(sprintf('Modello SIR, valore di a = %g', a(i))); legend('Suscettibili', 'Infetti', 'Immuni'); I = y(:, 2); picco_massimo = find(I == max(I)); I = (I./200).*100; picco_massimo_I = I(picco_massimo); picco_massimo_t = t(picco_massimo); figure(); plot(t,I,picco_massimo_t,picco_massimo_I,'d', 'LineWidth', 2); text(picco_massimo_t+0.5,picco_massimo_I+0.5,['Picco di infezione =(' ... num2str(picco_massimo_t) ' , ' num2str(floor(picco_massimo_I)) '%)']); title(sprintf('Percentuale individui infetti, a = %g', a(i))); legend('individui infetti') xlabel('tempo') ylabel('percentuale %') end

Page 4: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Caso 1. coeff. di contagio a = 0.005

numero massimo infetti: 134tempo picco epidemia: 9

0 2 4 6 8 10 12 14 16 18 200

20

40

60

80

100

120

140

160

180

200Modello SIR, valore di a = 0.005

SuscettibiliInfettiImmuni

Page 5: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 2 4 6 8 10 12 14 16 18 200

10

20

30

40

50

60

70Picco di infezione =(8.6424 , 67%)

Percentuale individui infetti, a = 0.005

tempo

perc

entu

ale

%

individui infetti

Caso 2. coeff. di contagio a = 0.01

numero massimo infetti: 160tempo picco epidemia: 4

0 2 4 6 8 10 12 14 16 18 200

20

40

60

80

100

120

140

160

180

200Modello SIR, valore di a = 0.01

SuscettibiliInfettiImmuni

Page 6: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 2 4 6 8 10 12 14 16 18 200

10

20

30

40

50

60

70

80

90

Picco di infezione =(4.4155 , 80%)

Percentuale individui infetti, a = 0.01

tempo

perc

entu

ale

%

individui infetti

Caso 3. coeff. di contagio a = 0.05

numero massimo infetti: 188tempo picco epidemia: 1

Page 7: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 2 4 6 8 10 12 14 16 18 20-50

0

50

100

150

200Modello SIR, valore di a = 0.05

SuscettibiliInfettiImmuni

0 2 4 6 8 10 12 14 16 18 200

10

20

30

40

50

60

70

80

90

100Picco di infezione =(1.0095 , 94%)

Percentuale individui infetti, a = 0.05

tempo

perc

entu

ale

%

individui infetti

Caso 4. coefficiente di contagio a = 0.1

numero massimo infetti: 194tempo picco epidemia: 1

Page 8: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 2 4 6 8 10 12 14 16 18 20-50

0

50

100

150

200Modello SIR, valore di a = 0.1

SuscettibiliInfettiImmuni

0 2 4 6 8 10 12 14 16 18 200

10

20

30

40

50

60

70

80

90

100Picco di infezione =(0.53826 , 96%)

Percentuale individui infetti, a = 0.1

tempo

perc

entu

ale

%

individui infetti

Page 9: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Elaborato 3.2

Problema del paracadutista

Descrizione del problema

Calcolare con la function matlab ode45 la soluzione del seguente problema di Cauchy chedescrive il lancio di un paracadutista di massa m=80Kg da un aereo dall’altezza di 600m,con un paracadute che si apre dopo 5 secondi.

y ’’ (t)=−g+ a (t)mt є [0,60 ]

con condizioni iniziali,

y (0)=600y ’(0)=0

Dove:

g = 9.81; (accelerazione di gravità)a(t) è la resistenza dell’aria:

a (t)=K1∗y' (t )2t<5 (prima dell’apertura del paracadute)

a (t)=K2∗y' (t )2t ≥5 (dopo l’apertura del paracadute)

Testare con:

Caso1K 1=K 2=0 (cadutalibera)Caso2K 1=1/15 , K2=4 /15.

A quale altezza si apre il paracadute?(caso 2)Quando si verifica l’impatto al suolo e con che velocità ?(caso 1 e 2)Visualizzare in un grafico le traiettorie ed i punti precedentemente calcolati.

Page 10: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Soluzione proposta

Lo script file determina la sequenza di operazioni previste per l’analisi del problema.Dopo aver impostato le costanti del problema e le condizioni iniziali, chiamiamo il solver del matlab ode45 due volte, ciascuna per ogni caso di test.

k1 = 0;k2 = 0;tspan = [0, 60];y0 = [600 0]';options = odeset('Events', @eventstop, 'OutputSel', [1 2]);

Soffermiamoci sull’ultima riga.In questo caso comunichiamo al solver la nostra intenzione di arrestare il calcolo della traiettoria nel momento in cui il paracadutista tocca il suolo in modo da visualizzare dati congruenti con la natura del problema.Queste informazioni sono specificate nel function file eventstop.m

function [stop, isterminal, direction] = eventstop(t, y, k1, k2) stop = y(1); isterminal = 1; direction = [];end

Il primo caso prevede che la traiettoria venga calcolata in condizioni di caduta libera.@para è un riferimento alla function definita nel file para.m mentre tspan rappresenta l’intervallo di tempo in cui calcoliamo i valori della y, y0 indica le condizioni iniziali ed options i parametri di arresto cui abbiamo già parlato.

%Caso 1[t1, y1, t1e, y1e] = ode45(@para, tspan, y0, options, k1, k2);fprintf('tempo atterraggio (caso 1): ');disp(t1e);vel1=y1(:,2);fprintf('velocità atterraggio (caso 1): ');disp(abs(vel1(end)));

Il secondo caso modella la discesa con il paracadute chiuso nei primi 5 secondi e aperto per t ≥ 5.

% Caso 2k1 = 1/15;k2 = 4/15;[t2, y2, t2e, y2e] = ode45(@para, tspan, y0, options, k1, k2);alt=y2(:,1);vel2=y2(:,2);

Osservando il function file para.m chiariamo come questa variazione ha luogo.

function der = para (t, y, k1, k2) g = 9.81; m = 80; k = k2; if(t < 5) k = k1; end

Page 11: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

xder = y(2); yder = -g + (k*(y(2)^2))/m; der = [xder yder]';end

Una volta definite le costanti fornite dalla specifica semplicemente inizializziamo il coefficiente k col valore previsto nella discesa per t ≥ 5, salvo poi modificare questo valore con k1 quando t è inferiore a 5.

Per mettere in risalto le differenti traiettorie di discesa in relazione ai due casi distinti, le riportiamo sullo stesso sistema di assi.

%dato che l'asse dei tempi non riporta esattamente l'istante t = 5, in%corrispondenza del quale c'è l'apertura del paracadute, calcolo il valore%di t più vicino a 5.[mini ind]=min(abs(t2-5));

figure();plot(t1, y1(:,1),'-', t2, y2(:,1),'*'... ,[0 t1e], [600 0], 'o'... ,[0 t2e], [600 0], 'o', 'LineWidth', 2);title('Problema del paracadutista, traiettorie di discesa');legend('Caso 1', 'Caso 2');text(5, alt(ind(1)), [' \leftarrow apertura paracadute: ', num2str(alt(ind(1))), ' m']);text(t1e-3.5, -30, ['t final1: ', num2str(t1e), 's']);text(t1e-3.5, -60, ['vel final1: ', num2str(abs(vel1(end))), 'm/s']);text(t2e-1.5, -30, ['t final2: ', num2str(t2e), 's']);text(t2e-1.5, -60, ['vel final2: ', num2str(abs(vel2(end))), 'm/s']);

0 5 10 15-100

0

100

200

300

400

500

600Problema del paracadutista, traiettorie di discesa

apertura paracadute: 479.4997 m

t final1: 11.06svel final1: 108.4988m/s

t final2: 14.2739svel final2: 53.9514m/s

Caso 1Caso 2

Page 12: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Elaborato 3.3

Modello di combustione

Descrizione del problema

E’ il modello di combustione di un combustibile, ad esempio, quando si accende unfiammifero, la palla di fuoco cresce rapidamente fino a raggiungere un punto critico erimane di queste dimensioni fino a che non si consuma l’ossigeno. Il modello è:

y ’ ( t )= y2 (t )− y3 (t ) ,t є [0 ,2/d ]

con condizione iniziale,

y (0)=d

y(t) = raggio, d = raggio iniziale(piccolo).

Più è piccolo il raggio più il problema è stiff.

Risolvere con d=0.01, d=0.0001, d=0.00001, con ode45 e ode15s con RelTol=10-4. Fare il grafico della soluzione e determinare il numero di punti utilizzato. Cosa si osserva?

Soluzione proposta

Il problema della combustione del fiammifero è descritto nel seguente function file:

function x=modello_fiammifero(t,y)x=(y.^2)-(y.^3);end

In questo problema modifichiamo in via preliminare la tolleranza con la quale il solver del matlab valuta l’errore relativo, impostandone il valore a 10-4.Per fare ciò adoperiamo la struttura options e specifichiamo il nuovo valore della voce RelTol.

tol=10^-4;options=odeset('RelTol', tol);

A questo punto osserviamo il comportamento del solver del matlab ode45 in funzione delle differenti condizioni iniziali definite all’inizio del problema.

%caso 1 d=0.01 t=200d1=0.01;t1=2/d1;fprintf('tempo impiegato (raggio 0.001, solver ode45): ');tic

Page 13: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 20 40 60 80 100 120 140 160 180 2000

0.2

0.4

0.6

0.8

1

1.2

1.4

[t y]=ode45(@modello_fiammifero, [0, t1], d1, options);tocfprintf('numero punti impiegato (raggio 0.001, solver ode45): ');disp(length(t));figure(1);plot(t, y(:,1)); %caso 2 d=0.0001 t=20000d2=0.0001;t2=2/d2;fprintf('tempo impiegato (raggio 0.0001, solver ode45): ');tic[t y]=ode45(@modello_fiammifero, [0, t2], d2, options);tocfprintf('numero punti impiegato (raggio 0.0001, solver ode45): ');disp(length(t));figure(2);plot(t, y(:,1)); %caso 3 d=0.00001 t=200000d3=0.00001;t3=2/d3;fprintf('tempo impiegato (raggio 0.00001, solver ode45): ');tic[t y]=ode45(@modello_fiammifero, [0, t3], d3, options);tocfprintf('numero punti impiegato (raggio 0.00001, solver ode45): ');disp(length(t));figure(3);plot(t, y(:,1));

Caso 1.

tempo impiegato (raggio 0.001, solver ode45): Elapsed time is 2.079213 seconds.

Page 14: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2

x 104

0

0.2

0.4

0.6

0.8

1

1.2

1.4

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2

x 105

0

0.2

0.4

0.6

0.8

1

1.2

1.4

numero punti impiegato (raggio 0.001, solver ode45): 185Caso 2.

tempo impiegato (raggio 0.0001, solver ode45): Elapsed time is 2.038289 seconds.numero punti impiegato (raggio 0.0001, solver ode45): 12161

Caso 3.

Page 15: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

tempo impiegato (raggio 0.00001, solver ode45): Elapsed time is 21.393855 seconds.numero punti impiegato (raggio 0.00001, solver ode45): 120701

Quello che notiamo è l’incremento del tempo necessario al calcolo della soluzione, particolarmente evidente nell’ultimo caso a cui corrisponde un analogo aumento dei punti in cui questa soluzione viene valutata.Questo comportamento è tipico delle funzioni stiff in cui il termine transitorio determina la richiesta di un passo di discretizzazione h sempre più piccolo.

Effettuiamo ora le medesime valutazioni adoperando il solver matlab espressamente pensato per i problemi stiff, ode15s.

%caso 4 d=0.01 t=200fprintf('tempo impiegato (raggio 0.001, solver ode15s): ');tic[t y]=ode15s(@modello_fiammifero, [0, t1], d1, options);tocfprintf('numero punti impiegato (raggio 0.001, solver ode15s): ');disp(length(t));figure(4);plot(t ,y(:,1)); %caso 5 d=0.0001 t=20000fprintf('tempo impiegato (raggio 0.0001, solver ode15s): ');tic[t y]=ode15s(@modello_fiammifero,[0, t2], d2, options);tocfprintf('numero punti impiegato (raggio 0.0001, solver ode15s): ');disp(length(t));figure(5);plot(t, y(:,1)); %caso 6 d=0.00001 t=200000fprintf('tempo impiegato (raggio 0.00001, solver ode15s): ');tic[t y]=ode15s(@modello_fiammifero, [0, t3], d3, options);tocfprintf('numero punti impiegato (raggio 0.00001, solver ode15s): ');disp(length(t));figure(6);plot(t, y(:,1));

Page 16: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 20 40 60 80 100 120 140 160 180 2000

0.2

0.4

0.6

0.8

1

1.2

1.4

Caso 1.

tempo impiegato (raggio 0.001, solver ode15s): Elapsed time is 1.876219 seconds.numero punti impiegato (raggio 0.001, solver ode15s): 86

Caso 2.

Page 17: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2

x 104

0

0.2

0.4

0.6

0.8

1

1.2

1.4

0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2

x 105

0

0.2

0.4

0.6

0.8

1

1.2

1.4

tempo impiegato (raggio 0.0001, solver ode15s): Elapsed time is 0.185945 seconds.numero punti impiegato (raggio 0.0001, solver ode15s): 141

Caso 3.

tempo impiegato (raggio 0.00001, solver ode15s): Elapsed time is 0.166961 seconds.

Page 18: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

numero punti impiegato (raggio 0.00001, solver ode15s): 140

Il solver ode15s risolve il problema in modo più efficiente, al diminuire del raggio iniziale il tempo di calcolo, come il numero di punti impiegato per la soluzione, sono molto simili.Questo comportamento è indice della stiffness del problema.

Page 19: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Elaborato 3.4Algoritmo RKF45 a passo variabile con parametro TOL opzionale

Scopo

Si tratta di un'implementazione del metodo di Runge-Kutta RKF45 per la risoluzione di equazioni differenziali ordinarie (ODE).

Sintassi e lista dei parametri

Sintassi

[t, y] = rkf45(f,t0,T,y0,TOL)

Parametri di ingresso

f: stringa contenente il nome del m-file che definisce il secondo membro dell’equazione differenziale. Nel m-file andranno definiti i valori iniziali della variabile indipendente e di quella(e) dipendente(i). t0 : valore iniziale della variabile indipendente.T: valore finale della variabile indipendente. Insieme con il valore precedente definisce l'intervallo di integrazione del problema.y0: valore iniziale della(e) variabile(i) indipendente(i). Se l'algoritmo viene utilizzato per la risoluzione di sistemi di equazioni tale parametro deve essere un vettore, preferibilmente colonna.TOL: tolleranza richiesta dall’utente. È un parametro opzionale; se non immessa viene assunta per default pari a 10-6.

Parametri di uscita

t: vettore contenente i valori della variabile indipendente sui quali è stata calcolata la soluzione approssimata. y: vettore/matrice contenente i valori approssimati della soluzione determinati dall'algoritmo.

Descrizione sintetica

Il metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente determinare le soluzioni discrete del problema mediante un metodo iterativo; il valore della funzione nel passo (k+1)-esimo viene determinato a partire dal valore della stessa nel passo k-esimo tramite un troncamento della serie di Taylor. Tuttavia per evitare di dover determinare le derivate della funzione che descrive il problema l'algoritmo approssima tali derivate con una combinazione lineare di valori della funzione in opportuni punti, secondo coefficienti scelti

Page 20: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

in modo tale da garantire la bontà dell'approssimazione utilizzata.

In particolare nell'algoritmo RKF45 esegue 6 valutazioni di funzione per ricavare una formula di ordine 5, ossia un'approssimazione della funzione da valutare nella quale l'errore commesso ad ogni passo è un O(h6), dove h è il passo di discretizzazione. Successivamente 4 di queste valutazioni vengono utilizzate per determinare una formula di ordine 4 – e dunque a precisione minore – in modo da poter ricavare una stima dell'errore commesso come differenza fra i due valori così ottenuti.

Il passo di discretizzazione h non è costante ma variabile; esso viene ricalcolato ad ogni passo mediante un algoritmo adattativo, che ci assicura ad ogni passo la precisione richiesta evitando al tempo stesso che l'algoritmo “esploda” a causa di valori di h che sconfinano nella regione di instabilità del problema.

Indicatori di errori

La funzione segnala la presenza di un errore se il numero di parametri di ingresso non è corretto o se i parametri inseriti non sono validi. In particolare l'algoritmo verifica che l’ intervallo di integrazione sia valido, che il vettore dei valori iniziali y0 sia effettivamente un vettore colonna e non una matrice ed infine che l'eventuale tolleranza inserita sia accettabile.

Complessità ed accuratezza

La complessità computazionale si misura in base al numero di valutazioni di funzione ed è data dal costo di ogni singolo passo per il numero di passi effettuati. Il numero di passi, inoltre, dipende da come viene effettuata la discretizzazione dell’intervallo [t0 T] e dunque dipende da h e conseguentemente anche dal valore di tolleranza scelto. Nel caso del metodo rkf45 ad ogni passo vengono effettuate sei valutazioni di funzione per calcolare i Ki. L’accuratezza della soluzione individuata mediante il processo iterativo dipende dal numero di valutazioni effettuate; dalla tolleranza impostata la quale incide sul passo adattativo h e sulle valutazioni dei Ki; dai valori di soglia hmin e hmax. In definitiva, avendo fissato il numero di valutazioni di funzione ad ogni passo ed i valori di soglia, l’accuratezza dipenderà dalla sola tolleranza scelta.

Page 21: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Codice della function e documentazione interna

%Funzione per la risoluzione numerica di equazioni differenziali%ordinarie di ordine p:%% y^p(t) = f( t, y, y',...,y^(p-1) ),% y(t0) = y0,% y'(t0) = y1,% .......% y^(p-1) = yp-1;%%usando il metodo di Runge-Kutta-Fehlberg del quarto e del quinto ordine%%SINTASSI:% [t, y] = rkf45 ( f, t0, T, y0, TOL )%%Parametri di ingresso:%% f: stringa contenente il nome del m-file che definisce il secondo membro % dell'equazione differenziale. Nel m-file andranno definiti i valori % iniziali della variabile indipendente e di quella(e) dipendente(i). % t0: valore iniziale della variabile indipendente.% T : valore finale della variabile indipendente; insieme a t0 definisce% l'intervallo di integrazione% y0: valore iniziale della(e) variabile(i) dipendente(i). Se l'algoritmo % viene utilizzato per la risoluzione di sistemi di equazioni tale % parametro deve essere un vettore, preferibilmente colonna.% TOL:tolleranza richiesta dall'utente. E' un parametro opzionale; se non % immessa viene assunta per default pari a 10^-6.%%Parametri di uscita:%% t: vettore contenente i valori della variabile indipendente sui quali% e' stata ricavata la soluzione approssimata% y: vettore/matrice contenente i valori della soluzione approssimata% dell'equazione differenziale.%%function [t, y] = rkf45(f, t0, T, y0, TOL)%%Controllo che vi siano almeno 4 parametri di ingresso; se la tolleranza%non e' stata specificata le assegno il valore di default.if (nargin<4) error('La funzione prevede in ingresso almeno 4 parametri: vedi help rkf45');elseif (nargin<5) disp('Tolleranza non immessa. Viene utilizzato il valore di default: TOL=10^-6'); TOL=10^(-6);end%Verifico che l'eventuale Tolleranza inserita sia correttaif (nargin>4) if (TOL < eps || TOL >= 1) disp('!WARNING: La tolleranza inserita non e'' valida. Verra'' utilizzato il valore di default: TOL=10^-6'); TOL=10^(-6); endend%Verifico che il nome della funzione inserito sia effettivamente una

Page 22: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

%stringaif ischar(f) == 0 error('Il primo argomento deve essere di tipo array di caratteri');end%Verifico la correttezza degli estremi di integrazioneif (t0 > T) error('L''intervallo di calcolo della soluzione non e'' corretto');end%Verifico la correttezza delle dimensioni di y0if(isvector(y0)==0) error('Devi inserire un vettore di soluzioni iniziali, preferibilmente colonna, non una matrice.');elseif (size(y0,1)<size(y0,2)) y0=y0';end %Inizializzazione delle variabili dell' algoritmo%a e b determinano una stima iniziale rispettivamente di hmax e hmin,%mentre c definisce il valore iniziale di h.a = 5;b = 20000;c = 100;hmax = (T-t0)/a;hmin = (T-t0)/b;h = (T-t0)/c; %Determino il numero di equazioni che compongono il sisteman_eq = length(y0); %k e' una matrice di dimensione (n_eq * 6) le cui colonne rappresentano i%termini ki da calcolare a ogni passo dell'algoritmo.k = zeros(n_eq,6); %Tali termini sono ottenuti come combinazione lineare dei valori assunti%da f(t,y) in opportuni punti dell'intervallo [tk , tk+1]:%k1 = h*f(tk + 0 , yk + 0 )%k2 = h*f(tk + h/4 , yk + k1/4 )%k3 = h*f(tk + 3h/8 , yk + (3k1+9k2)/32) )%k4 = h*f(tk + 12h/13 , yk + (1932k1-7200k2+7296k3)/2197 )%k5 = h*f(tk + h , yk + (439k1/216-8k2+3680k3/513-845k4/4104) )%k6 = h*f(tk + h/2 , yk - (8k1/27+2k2-3544k3/2565+1859k4/4104-11k5/40)) %Memorizzo nella matrice A i coefficienti della combinazione lineare dei kiA=[ 0 1/4 3/32 1932/2197 439/216 -8/27; 0 0 9/32 -7200/2197 -8 2; 0 0 0 7296/2197 3680/513 -3544/2565; 0 0 0 0 -845/4104 1859/4104; 0 0 0 0 0 -11/40]; %Definisco il vettore dei coefficienti per il calcolo della formula di%ordine 5vetty1=[16/135; 0; 6656/12825; 28561/56430; -9/50; 2/55]; %Definisco il vettore dei coefficienti per il calcolo dell'errore localevettR=[1/360; 0; -128/4275; -2197/75240; 1/50; 2/55]; %Definisco il vettore dei coefficienti moltiplicativi di h necessari alla%individuazione dei valori della variabilie indipendente per i quali %andremo ad effettuare le stime delle variabili dipendentivettk=[0 1/4 3/8 12/13 1 1/2];

Page 23: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

%Inizializziamo i parametri di uscitat(1,:) = t0;y(1,1:n_eq) = y0;i = 2;t1=t0;y1=y0; %Ciclo principale dell'algoritmowhile (t1 < T && h >= hmin)%Verifico che il passo di incremento h non faccia sforare il limite %superiore dell'intervallo di integrazione if (t1+h > T) h = T-t1; end %Costruisco la matrice k for j = 1:6%Calcolo yk + x, dove x varia a seconda di ki ys = y1 + k(:,1:j-1)*A(1:j-1,j);% Valuto f(tk , ys) dove tk dipende dal vettore vettk, moltiplico% per h e assegno il risultato alla posizione corrente di k k(:,j) = h*feval(f,t+vettk(j)*h,ys); end%Stimo l'errore di troncamento locale come%ek+1 = |(1/360)k1-(128/4275)k3-(2197/75240)k4+(1/50)k5+(2/55)k6|%Dato che in generale posso avere un sistema di equazioni assumo come%errore il massimo fra quelli stimati per ciascuna di esse. R = max(abs(k * vettR));%Se la stima dell'errore e' minore o ugale al prodotto h*TOL si procede%ad incrementare il valore di t1 di una quantita' pari al passo h determinato e%si valuta la nuova approssimazione della soluzione per tale punto if (R <= TOL * h) t1 = t1 + h;% Valuto y1 mediante una formula di ordine 5:% yk+1 = yk + [(25/216)k1 + (1408/2565)k3 + (2197/4104)k4 - (1/5)k5] y1 = y1 + k*vetty1; t(i,:) = t1; y(i,1:n_eq) = y1; i = i + 1; end%Calcolo il nuovo passo adattativo q = 0.84*((TOL * h)/(R+eps))^0.25; h = min(hmax, q*h);end%Se sono uscito dal ciclo prima di aver coperto tutto l'intervallo di%integrazione richiesto significa che h e' sceso sotto il valore limite e%dunque ho probabilmente a che fare con un problema stiff o una%singolarita'if (t1 < T) disp('!WARNING: Probabile singolarita'' o problema stiff');endend

Page 24: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 2 4 6 8 10 12 14 16 18 20-0.5

0

0.5

1

1.5

2

rkf45

Casi di test per la verifica del funzionamento

Qui di seguito verranno indicati alcuni casi test per verificare il corretto funzionamento della function.

Caso 1. Equazione differenziale di primo grado a coefficienti costanti

Valutiamo la soluzione della seguente equazione differenziale del primo ordine:

y ' (t )=−2∗y ( t ) , t∈[0 ,20]

Con condizione iniziale, y (0 )=2

Una volta descritta l’equazione nel function file eqdiff.m,

function yd = eqdiff(t, y)yd = -2*y;end

ne calcoliamo la soluzione prima con il solver rkf45 realizzato da noi e poi ne confrontiamo la curva con il risultato prodotto dal solver del matlab ode45.

>> [t, y] = rkf45('eqdiff', 0, 20, [2], 10^-6);>> plot(t, y, '*')>> legend('rkf45')

Page 25: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

0 2 4 6 8 10 12 14 16 18 20-0.5

0

0.5

1

1.5

2

ode45

>> [t, y] = ode45(@eqdiff, [0 20], 2);>> plot(t, y, '*')>> legend('ode45')

Le curve sono praticamente identiche a testimonianza del fatto che le soluzioni individuate sono pressoché le stesse.

Caso 2. Equazione non lineare del II ordine di Van Der Pool con smorzamento debole Consideriamo l’equazione non lineare del II ordine di Van Der Pool, che rappresenta un circuito RLC in cui la resistenza è sostituita da un elemento attivo (tubo vuoto o semiconduttore):

y ’’ (t )−c (1− y2 ) y ’+ y=0

con condizioni iniziali,

y (0)=2y ’(0)=0

dove c rappresenta lo smorzamento del sistema. La soluzione è un ciclo limite stabile.L’equazione sopra riportata definisce il sistema :

x ’ (t)= y (t)y ’( t)=c (1−x ²) y−x

con x(0)=2 e y(0)=0.

Page 26: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Fissiamo c=1, smorzamento debole.La function vdpol è definita come segue:

function f = vdpol(t,y) f = [y(2) ; (1-y(1)^2)*y(2)-y(1)]; end

con condizioni iniziali: >> y0 = [2;0];

nell'intervallo di integrazione temporale [0,20].

La chiamata alla funzione rkf45 sarà pertanto eseguita nel seguente modo, dove in particolare si è specificato una tolleranza pari a 10-6:

>> y0 = [2;0]; >> [t,y] = rkf45('vdpol',0,20,y0,10^-6)

Visualizziamo il grafico della soluzione così ottenuta:

>> plot(t,y)>> title('Equazione di Van Der Pool')>> xlabel('t=tempo');>> ylabel('y=soluzione');

0 2 4 6 8 10 12 14 16 18 20-3

-2

-1

0

1

2

3Equazione di Van Der Pool

t=tempo

y=so

luzion

e

Ora confrontiamo la soluzione ottenuta dalla nostra funzione con quella restituita dalla funzione Matlab ode45 e sovrapponiamone i grafici:

>> hold on >> [t1,y1]=ode45(@vdpol,[0 20],y0);

Page 27: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

>> plot(t1,y1)

Come si può notare i due grafici combaciano quasi perfettamente, il che ci garantisce che la soluzione da noi determinata sia corretta.

Generazione dei casi di errore

Per prima cosa testiamo i casi di errore in cui i parametri di ingresso non sono sufficienti.

>> [t,y]=rkf45();??? Error using ==> rkf45 at 42La funzione prevede in ingresso almeno 4 parametri: vedi help rkf45

Verifichiamo che l'algoritmo utilizzi la tolleranza di default nel caso l'utente non provveda ad inserirla.

>> [t,y] = rkf45('vdpol',0,20,y0);Tolleranza non immessa. Verra' utilizzato il valore di default: TOL=10^-6

Se infine vengono inseriti troppi parametri di ingresso ci viene restituito un messaggio d'errore.

>> [t,y]=rkf45(1,2,3,4,5,6,7);??? Error using ==> rkf45Too many input arguments.

Inseriamo ora una tolleranza non corretta. Si noti che il programma provvede a sostituirla con quella di default.

>> [t,y]=rkf45('vdpol',0,20,[2;0],10^18); !WARNING: La tolleranza inserita non e' valida. Verra' utilizzato il

valore di default: TOL=10^-6

Page 28: unina.stidue.netunina.stidue.net/Calcolo Numerico 2/Materiale/Altre... · Web viewIl metodo di Range-Kutta consiste nel discretizzare il problema continuo descritto dalle ODE e successivamente

Inseriamo un nome di funzione non corretto:

>> [t,y]=rkf45(144,0,20,[2;0],10^-6);??? Error using ==> rkf45 at 57Il primo argomento deve essere di tipo array di caratteri

Inseriamo un intervallo di calcolo della soluzione non corretto (t0>T):

>> [t,x]=rkf45('vdpol',20,0,[2;0],10^-6); ??? Error using ==> rkf45 at 61L'intervallo di calcolo della soluzione non e' corretto

Inseriamo una matrice al posto del vettore y0:

>> [t,x]=rkf45('vdpol',0,20,[2,3;0,5],10^-6);??? Error using ==> rkf45 at 67Devi inserire un vettore di soluzioni iniziali, preferibilmente colonna, non una matrice.