METODO DI EULERO PER LA RISOLUZIONE NUMERICA DI EDO DEL I◦ ORDINE Prof. Domenico RUGGIERO Da sempre l'uomo ha arontato la risoluzione di problemi che lo ponevano di fronte a calcoli matematici talvolta molto laboriosi o complessi. In suo aiuto è arrivata la tecnologia che, per mezzo di calcolatori elettronici, ha contribuito alla risoluzione di problemi anche articolati che sarebbero risultati improponibili o che avrebbero richiesto un notevole impiego di tempo. Lo sviluppo di algoritmi e programmi specializzati ha portato a realizzare software matematici che, sfruttando gli algoritmi di analisi numerica, hanno agevolato e velocizzato il calcolo numerico (approssimato) di problemi alquanto complessi da risolvere (calcolare) in modo esatto o, addirittura, di problemi la cui soluzioni esatta non è proprio determinabile sebbene ne sia stata dimostrata l'esistenza. Ad esempio, esistono equazioni dierenziali ordinarie del primo ordine che si possono risolvere soltanto con metodi numerici specici. Uno di questi algoritmi è fornito dal metodo di Eulero che è l'oggetto di questa trattazione. 1 Indice 1 Metodo di Eulero 3 2 Applicazioni del metodo di Eulero 4 3 Implemetazione dell'algoritmo 6 4 Esempi di implemetazioni dell'algoritmo 6 5 Estensione del metodo ad equazioni vettoriali 8 6 Esempi ed implementazione dell'algoritmo in due e tre dimensioni 10 6.1 6.2 Sistemi bidimensionali . . . . . . . . . . . . . . . . . . . . . . 11 Sistemi tridimensionali . . . . . . . . . . . . . . . . . . . . . . 14 2 1 Metodo di Eulero Il metodo di Eulero si basa sull'approssimazione della derivata prima mediante il rapporto incrementale. Sia dato il problema di Cauchy, di cui si suppongono esitenza ed unicità della soluzione, ½ y 0 = f (x, y) (1.1) y(x0 ) = y0 Consideriamo la derivata prima di y(x) calcolata in x0 approssimata mediante il rapporto incrementale: y0 = y(x) − y(x0 ) x − x0 (1.2) Posto h = x − x0 (incremento della variabile x che, nel metodo numerico, viene detto passo ) da cui x = x0 + h, la (1.2) si scrive come y0 = y(x0 + h) − y(x0 ) . h (1.3) Sostituendo la (1.3) al primo membro dell'equazione che compare in (1.1), si ha: y(x0 + h) − y(x0 ) = f (x0 , y(x0 )) h che può essere scritta come y(x1 ) − y(x0 ) = f (x0 , y(x0 )). h (1.4) avendo posto x1 = x0 + h. Usando la notazione yi = y(xi ), la (1.4) si scrive come y1 − y0 = f (x0 , y0 ) h da cui moltiplicato ambo i membri per h e trasportando y0 al secondo membro otteniamo , in denitiva, y1 = y0 + hf (x0 , y0 ). (1.5) Dunque, partendo dal dato iniziale abbiamo ottenuto un altro punto della soluzione (approssimata). Si noti che, evidentemente, esso giace sulle retta tangente il graco di y(x) nel punto P0 (x0 , y(x0 )). 3 Per determinare altri punti usiamo lo stesso procedimento con cui abbiamo determinato la (1.5) innescandolo dall'ultimo valore calcolato: x2 = x1 + h = x0 + 2h =⇒ y2 = y1 + hf (x1 , y1 ) x3 = x2 + h = x1 + 3h =⇒ y3 = y2 + hf (x2 , y2 ) e così via. Dunque, generalizzando il procedimento, si ha: yk = yk−1 + hf (xk−1 , yk−1 ) (1.6) dove xk = xk−1 + h = x0 + kh con k = 1, ....., N ; N ∈ N ssato. La formula generale permette, dunque, il calcolo approssimato di N punti della curva soluzione del problema di Cauchy dato. Essa fornisce un algoritmo per il calcolo di tali punti. Dal punto di vista informatico il problema può essere arontato come nella sez. 3. Osservazioni-Denizioni 1.1 La scelta del passo h > 0 condiziona la convergenza (avvicinarsi) della soluzione numerica a quella esatta. Con questo metodo conviene scegliere h<1 (ad esempio h(1/10, h(1/100, h(1/1000). Quanto osservato è parte di un risultato dimostrabile. Inoltre l'errore relativo, che si commette con tale metodo, approssimando la soluzione esatta y(x) in xk mediante il valore yk della soluzione approssimata è dato da ¯ ¯ ¯ y(xk ) − yk ¯ ¯. er = ¯¯ (1.7) y(xk ) ¯ 2 Applicazioni del metodo di Eulero Il metodo di Eulero risulta, utile in casi come quelli già descritti nell'introduzione, quando (i) si vogliono determinare N punti della soluzione esatta che poi possono essere gracati, interpolati, ecc.; (ii) si richiede il valore approssimato della soluzione in un punto x̄ in cui la soluzione esatta è prolungabile per continuità. 4 Nel primo caso, ssati il passo h ed il numero di iterazioni N , si innesca il metodo descritto dalla (1.6). Nel secondo caso, supposto x̄ > x0 , si divide l'intervallo in n parti uguali di ampiezza h = (x̄ − x0 )/n che riulta essere il passo del metodo. A questo punto, ancora mediante il prcedimento esposto e descritto dalla (1.6), si ottiene il risultato cercato che coincide con l'ultimo valore calcolato. Gli esempi seguenti chiariscono meglio i concetti esposti. Esempio 2.1 ½ 2 2 y 0 = ey −x . y(0) = 1 L'equazione che compare nel problema dato è a variabili separabili essendo 2 2 2 2 il campo vettoriale f (x, y) = ex −y = ey e−x . Tuttavia tale problema non possiede una soluzione esatta eplicita, cioè della forma y = y(x), per la presenza delle gaussiane non elementarmente integrabili. Infatti, l'unica soluzione esatta che si riesce a determinare è quella in forma integrale ottenibile separando le variabili ed integrando tenendo conto della condizione iniziale: Z x Z y 2 −t2 e−v dv. e dt = Consideriamo il seguente problema di Cauchy: 0 1 Iniziando dal dato iniziale, N punti della soluzione possono esser calcolati (in modo approssimato) col metodo di Eulero nel modo seguente: x0 = 0, y0 = 1; 2 2 xk = xk−1 + h, yk = yk−1 + hexk−1 −yk−1 , k = 1, 2, ...., N avendo ssato h ∈ (0, 1). Esempio 2.2 ½ y 0 = −2xy . y(0) = 1 Determiniamo, in modo approssimato, il valore y(2/5) che la soluzione y(x) assume per x = 2/5 = 0, 4. La soluzione esatta del problema di Cauchy è 2 y = e−x com'è immediato vericare per cui y(0, 4) = e−0,16 . Per procedere, applichiamo il Metodo di Eulero suddividendo l'intervallo [0,2/5] in N = 20 = 0, 02. Si ha, allora, parti uguali. Ne segue che il passo è h = 0,4 20 Consideriamo il seguente problema di Cauchy: x0 = 0, y0 = 1; 2 2 xk = xk−1 + h, yk = yk−1 + hexk−1 −yk−1 , 5 per k = 1, 2, ...., 20 il valore cercato è proprio y20 = y19 − 2hx19 y19 con un errore relativo, calcolato mediante la (1.7) er = e−0,16 − y20 . e−0,16 (2.1) 3 Implemetazione dell'algoritmo In questa sezione presentiamo un'implementazione, dell'algoritmo già trattato, in una pseudocodica che ben si presta ad essere codicata in un qualsiasi linguaggio di programmazione. Dichiarati gli array unidimensionali (vettori) x,y di elementi reali e scritta la funzione f(x,y) che restituisce in uscita il valore del campo vettoriale f (x, y) secondo membro dell'equazione dierenziale, dove x,y sono reali e non i vettori di prima e, dati da input x0 , y0 , h (passo), N (numero d'iterazioni), si può procedere con il seguente algoritmo dove le parentesi grae indicano apertura e chiusura di un blocco d'istruzioni: Algoritmo pseudocodicato 3.1 x[0] = x0; y[0] = y0; for k=1 to=N { x[k] = x[k-1] + h; y[k] = y[k-1] + h* f (x[k-1],y[k-1]); } Si noti che l'algoritmo appena presentato è implementabile anche con un foglio elettronico, ad esempio Excel. Questo è l'oggetto della prossima sezione in cui presentiamo i risultati, ottenuti con l'ausilio di un foglio elettronico, della risoluzione del problema di Cauchy esaminato nell'esempio 2.2. 4 Esempi di implemetazioni dell'algoritmo In questa sezione presentiamo un'implemetazione dell'algoritmo per risolvere il problema di Cauchy già introdotto nell'esempio 2.2. Procediamo a tale implementazione utilizzando il foglio elettronico Excel, costruendo una colonna 6 per le xk , una per per il calcolo dei valori yk della soluzione approssimata, una il calcolo di f (xk , yk ) necessaria per calcolare le yk ed una cella per il calcolo di er (calcolo eseguito ultilizzando la formula (2.1)). Si ottiene la situazione seguente. x0 = 0 ; y 0 = 1 ; h = indice k 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 xk 0,00 0,02 0,04 0,06 0,08 0,10 0,12 0,14 0,16 0,18 0,20 0,22 0,24 0,26 0,28 0,30 0,32 0,34 0,36 0,38 0,40 0,4 20 yk 1,0000 1,0000 0,9992 0,9976 0,9952 0,9920 0,9881 0,9833 0,9778 0,9715 0,9646 0,9568 0,9484 0,9393 0,9295 0,9191 0,9081 0,8965 0,8843 0,8716 0,8583 = 0, 02 f (xk , yk ) 0,0000 -0,0400 -0,0799 -0,1197 -0,1592 -0,1984 -0,2371 -0,2753 -0,3129 -0,3498 -0,3858 -0,4210 -0,4552 -0,4884 -0,5205 -0,5515 -0,5812 -0,6096 -0,6367 -0,6624 //// er = 0, 268601 er % = 26, 86 Pertanto, si ha: µ ¶ 2 y ' y20 = 0, 8583 5 7 con un errore relativo percentuale del 26,86 % circa che può essere ridotto se si diminuisce il passo. Consideriamo, adesso, lo stesso problema nell'intervallo [0, 4] con N = 20 (ovvero h = 0, 2). Applicando l'algoritmo di Eulero, si costruisce una tabella analoga alla precedente che qui non riportiamo procedendo, però, ad una rappresentazione graca dei punti trovati per interpolata lineare che fornisce il seguente andamento che, come si può osservare, corrisponde proprio ad un 2 ramo della gaussiana y = e−x nell'intervallo considerato. Figura 1: graco della soluzione approssimata per x ∈ [0, 4] 5 Estensione del metodo ad equazioni vettoriali In questa sezione estendiamo il metodo di Eulero ad equazioni dierenziali ordinarie del primo ordine vettoriali ovvero ad EDO del primo ordine ndimensionali (sistemi di EDO) con n > 1. 8 Per equazioni di questo tipo, l'analogo del problema di Cauchy (1.1), si scrive, in forma compatta, come ½ y0 = f (x, y) (5.1) y(x0 ) = y(0) dove y, y(0) ∈ Rn ed f è una funzione di n + 1 variabili con n componenti: y(x) = (y1 (x), y2 (x), ...., yn (x)); (0) (0) y(0) = (y1 , y2 , ...., yn(0) ); f (x, y) = f (x, y1 (x), y2 (x), ...., yn (x)) = (f1 (x, y(x), f2 (x, y(x), ...., fn (x, y(x)). Dunque, tenendo presente, al solito, che y = y(x) e ricordando che due vettori sono uguali se e solo se hanno uguali le componenti di stesso indice, il problema (5.1) può esprimersi, componente per componente, come y10 = f1 (x, y1 , y2 , ...., yn ) y20 = f2 (x, y1 , y2 , ...., yn ) .. . .. . 0 yn = fn (x, y1 , y2 , ...., yn ) (5.2) (0) y1 (x0 ) = y1 (0) y2 (x0 ) = y2 .. . .. . y (x ) = y (0) n 0 n che rappresenta la traduzione scalare del sistema (5.1). Il metodo di Eulero, descritto nella sez. 1 e riassunto nella (1.6), si generalizza, al caso in esame, nel seguente modo: y0 = y(x0 ) yk = yk−1 + hf (xk−1 , yk−1 ) (5.3) dove xk = xk−1 + h = x0 + kh con k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo mantenendo le notazioni compatte (vettoriali) come in (5.1). 9 Le (5.3), tradotte scalarmente analogamente alle (5.2), conducona a (0) (0) y1[0] = y1 (x0 ) = y1 y2[0] = y2 (x0 ) = y2 .. . (0) yn[0] = yn (x0 ) = yn y1[k] = y1[k−1] + hf1 (xk−1 , y1[k−1] , y2[k−1] , . . . , yn[k−1] ) y2[k] = y2[k−1] + hf2 (xk−1 , y1[k−1] , y2[k−1] , . . . , yn[k−1] ) .. . (5.4) yn[k] = yn[k−1] + hfn (xk−1 , y1[k−1] , y2[k−1] , . . . , yn[k−1] ) con evidente signicato dei simboli; dove xk = xk−1 + h = x0 + kh con k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo. Esempio 5.1 Consideriamo, per n = 4, il seguente problema di Cauchy: ½ y0 = ((y1 + y2 )ex , xy2 , y3 + y4 , x2 + y4 ) y(0) = (1, 0, 2, 0) (5.5) Risolviamo il problema (5.5) utilizzando il metodo di Eulero generalizzato nelle (5.4). Si ha: y1[0] = 1; y2[0] = 0; y3[0] = 2; y4[0] = 0 y1[k] = (y1[k−1] + y2[k−1] )exk−1 y2[k] = xk−1 y2[k−1] y3[k] = y3[k−1] + y4[k−1] y4[k] = x2k−1 + y4[k−1] dove xk = xk−1 + h = kh (essendo x0 = 0), k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo. Particolare interesse suscitano i casi n = 2 ed n = 3 in quanto molti sistemi sici sono modellizati da equazioni dierenziali ordinarie in due ed in tre dimensioni. Pertanto, nel seguito e con riferimento a tali casi, descriviamo gli algoritmi analogamente a quanto fatto nella sez. 3 riportando anche degli esempi. 6 Esempi ed implementazione dell'algoritmo in due e tre dimensioni In questa sezione implementiamo il metodo di Eulero per equazioni dierenziali ordinarie del primo ordine in due ed in tre dimensioni. 10 Utilizziamo le seguenti notazioni : indichiamo con x il vettore incognito di componenti x, y ed, eventualmente z , con t la variabile indipendente. 6.1 Sistemi bidimensionali L'analogo del problema (5.1), per sistemi bidimensionali (sistemi 2 × 2), si scrive come ½ x0 = f (t, x) (6.1) x(t0 ) = x0 dove x, x0 ∈ R2 ed f è una funzione di 3 variabili con 2 componenti: x = x(t) = (x(t), y(t)); x0 = (x0 , y0 ); f (t, x) = f (t, x, y) = (f1 (t, x, y), f2 (t, x, y)). La traduzione scalare di (6.1) è data da x0 = f1 (t, x, y) y 0 = f2 (t, x, y) x(t0 ) = x0 y(t0 ) = y0 (6.2) Il metodo di Eulero, in questo caso, conduce alle seguenti formule: x0 = x(x0 ) xk = xk−1 + hf (tk−1 , xk−1 ) (6.3) dove tk = tk−1 +h = t0 +kh con k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo. Operando la traduzione scalare delle (6.3), si ottiene: x0 = x(t0 ); y0 = y(t0 ) xk = xk−1 + hf1 (tk−1 , xk−1 , yk−1 ); yk = yk−1 + hf2 (tk−1 , xk−1 , yk−1 ) (6.4) dove tk = tk−1 +h = t0 +kh con k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo. Osservazione 6.1 Si noti che le (6.3) e le (6.4) sono ottenibili dalle (5.4) e (5.5), rispettivamente, per n = 2. 11 Procediamo ad una implementazione dell'algoritmo, come fatto nella sez. 3 per il caso unidimensionale, in una pseudocodica che ben si presta ad essere codicata in un qualsiasi linguaggio di programmazione. Dichiarati gli array unidimensionali (vettori) t,x,y di elementi reali e scritte le funzioni f1(t,x,y), f2(t,x,y) che restituiscono, in uscita, il valore delle componenti f1 (t, x, y), f2 (t, x, y) del campo vettoriale f (t, x, y), dove x,y sono reali e non i vettori di prima e, dati da input t0, x0 , y0 (dato iniziale) , h (passo), N (numero d'iterazioni), si può procedere con il seguente algoritmo dove le parentesi grae indicano apertura e chiusura di un blocco d'istruzioni: Algoritmo pseudocodicato 6.2 t[0] = t0; x[0] = x0; y[0] = y0; for k=1 to N { t[k] = t[k-1] + h; x[k] = x[k-1] + h*f1(t[k-1],x[k-1],y[k-1]); y[k] = y[k-1] + h*f2(t[k-1],x[k-1],y[k-1]); } Si noti che l'algoritmo appena presentato è implementabile anche con un foglio elettronico, ad esempio Excel. Esempio 6.3 Consideriamo il problema di Cauchy per l'oscillatore armonico semplice: 00 x + αx = 0 x(t0 ) = x0 (6.5) x0 (t0 ) = x̃0 dove α = k/m. 12 Posto y = x0 =⇒ y 0 = x00 , y(t0 ) = x̃0 , x0 = y0 = x(t0 ) = y(t0 ) = da cui, posto y0 = x̃0 , x0 = y0 = x(t0 ) = y(t0 ) = le (6.5) si scrivono come y −αx x0 x̃0 y −αx x0 y0 (6.6) che rappresenta un sistema di EDO del primo ordine lineare a coecienti costanti. Usando il formalismo delle matrici, il sistema (6.6) può essere scritto nella forma ½ x0 = Ax (6.7) x(t0 ) = x0 µ ¶ 0 1 dove A = , x0 , x, x0 sono i vettori (x0 , y 0 ), (x, y), (x0 , y0 ) trasposti. −α 0 La soluzione esatta di quest'ultimo ovvero del sistema (6.6) è data da x = x0 cos(t) + y0 sin(t) (legge od equazione oraria) y = y0 cos(t) − x0 sin(t) (equazione della velocità) (6.8) Consideriamo, per semplicità, il caso in cui m = 1 = k =⇒ α = 1 (oscillatore di massa e costante elastica unitarie), t0 = 0, x0 = 1, y0 = 2. Il sistema (6.7) si scrive come ½ x0 = Ax (6.9) x(0) = x0 ¶ µ 0 1 dove A = mentre la sua traduzione scalare ovvero l'analogo del −1 0 (6.6), come x0 = y y 0 = −x (6.10) x(0) = 1 y(0) = 1 la cui soluzione esatta, ottenibile sostituendo il dato iniziale nelle (6.8), è data da x = cos(t) + sin(t) (legge od equazione oraria) (6.11) y = cos(t) − sin(t) (equazione della velocità) 13 Determiniamo N valori delle componenti x = x(t), y = y(t) della soluzione del sistema (6.10) ovvero (6.9) utilizzando il metodo di Eulero. Applicando le (6.4), si ha: x0 = 1; y0 = 1 xk = xk−1 + hyk−1 ; yk = yk−1 − hxk−1 (6.12) dove tk = tk−1 + h = kh con k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo. 6.2 Sistemi tridimensionali Un sistema tridimensionale si ha per n = 3 in (5.1) e la sua trattazione è del tutto analoga a quella che si fa per n = 2 tenendo della terza componente z = z(t), f3 (t, x, y, z) . Ciò, ovviamente, è un altro caso particolare di quanto trattato, in generale, nella sez. 5. Pertanto, il problema di Cauchy ½ x0 = f (t, x) x(t0 ) = x0 tradotto scalarmente, conduce a x0 = f1 (t, x, y, x) y 0 = f2 (t, x, y, x) y 0 = f3 (t, x, y, x) x(t0 ) = x0 y(t0 ) = y0 z(t0 ) = z0 (6.13) Il metodo di Eulero per la risoluzione numerica del sistema (6.13), in forma compatta, si scrive in modo analogo alle (6.3); la sua traduzione scalare è data da x0 = x(t0 ); y0 = y(t0 ); z0 = z(t0 ) xk = xk−1 + hf1 (tk−1 , xk−1 , yk−1 , zk−1 ); yk = yk−1 + hf2 (tk−1 , xk−1 , yk−1 , zk−1 ); zk = zk−1 + hf3 (tk−1 , xk−1 , yk−1 , zk−1 ) (6.14) dove tk = tk−1 +h = t0 +kh con k = 1, ....., N ; N ∈ N è il numero d'iterazioni ed h il passo. Procediamo ad una implementazione dell'algoritmo analogamente a quanto fatto per ottenere la pseudocodica 6.2. Dichiarati gli array unidimensionali (vettori) t,x,y,z di elementi reali e scritte le funzioni f1(t,x,y,z), f2(t,x,y,z), 14 f3(t,x,y,z) che restituiscono, in uscita, il valore delle componenti f1 (t, x, y, z), f2 (t, x, y, z), f3 (t, x, y, z) del campo vettoriale f (t, x, y, z), dove x, y, z sono reali e non i vettori di prima e, dati da input t0, x0 , y0, z0 (dato iniziale), h (passo), N (numero d'iterazioni), si può procedere con il seguente algoritmo dove le parentesi grae indicano, al solito, apertura e chiusura di un blocco d'istruzioni: Algoritmo pseudocodicato 6.4 t[0] = t0; x[0] = x0; y[0] = y0; z[0] = z0; for k=1 to N { t[k] = t[k-1] + h; x[k] = x[k-1] + h*f1(t[k-1],x[k-1],y[k-1],z[k-1]); y[k] = y[k-1] + h*f2(t[k-1],x[k-1],y[k-1],z[k-1]); z[k] = z[k-1] + h*f3(t[k-1],x[k-1],y[k-1],z[k-1]); } Si noti che l'algoritmo appena presentato è implementabile anche con un foglio elettronico, ad esempio Excel. Esempio 6.5 Consideriamo il seguente problema di Cauchy tridimensionale ½ 2 x0 = (e−(t+x+y+z) , t + x + y + z, x2 − z 2 ) x(0) = (0, 0, 0) la cui traduzione scalare è data da 0 x = y0 = z0 = x(0) = y(0) = z(0) = 2 e−(t+x+y+z) t+x+y+z x2 − z 2 0 0 0 15 e determiniamo N valori approssimati della curva (x(t), y(t), z(t)) soluzione del sistema implementando l'algoritmo fornito dal metodo di Eulero. Fissato il passo h con, al solito, 0 < h < 1, le (6.14) conducono a x0 = 0; y0 = 0; z0 = 0 2 xk = xk−1 + he−(tk−1 +xk−1 +yk−1 +zk−1 ) ; yk = yk−1 + h(tk−1 + xk−1 + yk−1 + zk−1 ) 2 zk = zk−1 + h(x2k−1 − zk−1 ) (6.15) con k = 1, ....., N ; N ∈ N. Scelto h = 0, 1, eettuiamo N = 20 iterazioni, partendo dal dato iniziale, con l'ausilio del foglio elettronico Excel. Si ottengono i valori riportati nella seguente tabella. La gura seguente (gura 2) riporta i graci, delle singole componenti della curva soluzione, ottenuta numericamente, in un unico disegno. Il graco della soluzione è, evidentemente, una curva dello spazio tridimensionale. 16 Figura 2: sovrapposizione graca delle componenti della soluzione approssimata per t ∈ [0, 2] 17