Precedente | Indice | Successivo |
Scopo: | risoluzione di un'equazione differenziale ordinaria (O.D.E.) di primo ordine in un intervallo compatto. |
Specifiche: |
integer m, n, ifail real a, b, y0, tol, x(n), y(n) real f external f |
Descrizione: |
Backgroud del problema
Il problema matematico è quello di determinare una funzione y(x) che soddisfi un'equazione del tipo y¢ =f(x,y) "x Î [a, b] con la condizione y(a)=y0; la soluzione del problema esiste ed è unica nelle seguenti ipotesi:
Tale problema può essere risolto numericamente nel modo seguente: si discretizza l'intervallo d'integrazione considerando l'insieme di nodi xi+1 = xi + hi, i = 0,1,..., dove x0 è il punto in cui è assegnata la condizione iniziale e hi sono i passi di discretizzazione. In corrispondenza dell'insieme dei nodi xi un particolare metodo genera una sequenza di valori yi che definiscono la soluzione discreta e rappresentano le approssimazioni dei valori y(xi) della soluzione del problema continuo. I metodi in cui l'approssimazione al passo i+1 dipende solo da quella al passo i sono detti one-step, e si esprimono in generale nella forma: Descrizione dell'algoritmo L'algoritmo si basa sui metodi di Runge-Kutta di ordine 4 e 5. Essi esprimono la funzione F come combinazione lineare di valori della funzione f(x, y) in particolari punti, in modo che la soluzione numerica yi+1 coincida con lo sviluppo di Taylor di f(xi+1) fino al termine di ordine 4 e 5. La differenza tra le soluzioni ottenute con metodi di ordine diverso fornisce una stima dell'errore commesso. Il passo di discretizzazione h è variato in maniera adattativa in modo che l'errore sia ad ogni passo minore della tolleranza richiesta. Raccomandazioni sull'uso Gli estremi dell'intervallo di integrazione devono essere ordinati. Il numero iniziale di intervalli ed il numero di valori da calcolare devono essere positivi. La tolleranza assoluta deve essere non negativa. |
Bibliografia: | [1], [2], [5] |
Parametri di I/O: |
input
f - funzione reale, 2° membro dell'equazione y'=f(x,y) output
x - vettore di reali, punti di griglia |
Indicatori d'errore: |
Errori gestiti dalla subroutine: ifail = 0 nessun errore. ifail = 2 la tolleranza assoluta è negativa ifail = 11 il numero dei punti è non positivo ifail = 23 gli estremi non sono ordinati ifail = 24 il numero iniziale di intervalli è non positivo ifail = 25 l'estremo destro non è stato raggiunto per insufficienza del numero dei valori richiesti ifail = 26 l'estremo destro non è stato raggiunto per superamento del valore minimo consentito per il passo di discretizzazione. |
Routines ausiliarie: | tolm, funzione reale, tolleranza minima relativa. |
Tempo d'esecuzione: | dipende dalla complessità di valutazione di f (6 valutazioni per passo) e dal numero di passi, e questo a sua volta dai valori di tol e m. |
Memoria richiesta: | sono allocati due array di dimensione n. |
Accuratezza fornita: | dipende dalla tolleranza richiesta. |
Esempio di programma chiamante: |
Program ode45d c Programma dimostrativo della subroutine ode 45 external ode45 real f6 external f6 integer dim parameter (dim=100) real a,b,y0,tol,x(dim),y(dim) integer m,n,ifail character*12 fout print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE ODE45 ***' print* print*,'Risoluzione dell''equazione y''=-30*y' print* print*,'Estremi dell''intervallo= ' read(*,*)a,b print*,'Valore iniziale= ' read(*,*)y0 print*,'Numero iniziale di intervalli= ' read(*,*)m print*,'Tolleranza richiesta= ' read(*,*)tol write(*,10)'Numero massimo di valori da calcolare max(',dim,')= ' read(*,*)n call ode45(f6,a,b,y0,m,tol,n,x,y,ifail) if (ifail .eq. 2) stop 'Errore! tolleranza assoluta non valida' if (ifail .eq. 11) stop 'Errore! numero di punti non valido' if (ifail .eq. 23) stop 'Errore! estremi non ordinati' if (ifail .eq. 24) % stop 'Errore! numero iniziale di intervalli non valido' if (ifail .eq. 25) % print*,'Attenzione! estremo destro non raggiunto' if (ifail .eq. 26) % print*,'Attenzione! superamento del passo minimo' print* print*,'Nome del file di output= ' read(*,'(A)')fout open(12,FILE=fout) write(12,10)'Soluzione tabellata su ',n,' punti:' write(12,10)'x=' write(12,20)(x(i),i=1,n) write(12,*) write(12,10)'y=' write(12,20)(y(i),i=1,n) close(12) write(*,10)'Soluzione tabellata su ',n,' punti:' write(*,30)'x=','y=' write(*,40)(x(i),y(i),i=1,n) 10 format(1X,A,I3,A) 20 format(1X,E15.7) 30 format(1X,A2,14X,A2) 40 format(1X,E15.7,1X,E15.7) End |
Precedente | Indice | Successivo |