Precedente Indice Successivo



Ode45



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:

  1. f è continua nella striscia S={(x,y) : xÎ [a, b], y ÎR}
  2. "y, y* $L > 0 : f(x, y) – f(x, y*) £ L y-y* " x Î[a, b].

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)
a - reale, estremo inferiore dell'intervallo
b - reale, estremo superiore dell'intervallo
y0 - reale, valore iniziale in a
m - intero, numero iniziale di intervalli
tol - reale, tolleranza richiesta
n - intero, numero massimo di valori da calcolare

output

x - vettore di reali, punti di griglia
y - vettore di reali, valori della soluzione in x
ifail - intero, indicatore d'errore

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