Calcolo numerico |
|
Programmazione in Fortran 77.
Metodi di convergenza non lineare.
In questa rubrica presento una completa serie di algoritmi implementati in Digital Visual Fortran ( totalmente compatibile con il FORTRAN 77 ).
Nel 2005 questi programmi sono serviti agli studenti dei corsi serali per studenti lavoratori per superare l'esame universitario "Calcolo numerico e programmazione" presso la facoltą di ingegneria di Padova ( corso della professoressa Michela Redivo Zaglia per allievi aereospaziali).
I programmi sono testati e funzionanti ma essi non assicurano il superamento della prova d'esame senza un approfondito studio teorico nel testo "Calcolo numerico" dell'autrice Redivo Zaglia.
Attenzione: Nell'anno in cui questi programmi sono stati creati sono stati prodotti in sede d'esame (quindi vanno ben memorizzati nella loro essenza e non solo a memoria) usando il compilatore in linea del sistema operativo Linux installato in aula Taliercio della facoltą di ingegneria in via Belzoni 7 (PD). E' indispensabile al fine di superare la prova d'esame, sapere compilare in ambiente Linux ed effettuare la visualizzazione degli eventuali grafici con i tools di default presenti in quel sistema operativo.
I programmi name.f posso essere tagliati ed incollati nell'editor di programmazione per un corretto funzionamento. Ove sia necessario bisognerą far trovare nel direttorio di compilazione i file di testo contenenti l'insieme di input "formattato" ovvero con righe e colonne al posto in cui l'algoritmo le aspetta. Nella stessa directory troveremo il file testuale di output.
Marco Gottardo.
bisez.for |
C==================================================================== C Programma per il Metodo di Bisezione C Versione con controlli in ingresso C==================================================================== program bis implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 a,b,toll real*8 amp,fa,fx integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim) integer n, i character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi gli estremi a e b dell''intervallo iniziale' read*, a, b do while (funz(a)*funz(b).gt.0.0d0 .or. a .ge. b) print *, 'f(a)*f(b)>0 OPPURE a>=b! Reinserisci a e b' read*, a, b end do print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Estremi dell''intervallo iniziale a = ',a,' b = ',b write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di bisezione C CALL bisezione (funz, a, b, toll, nmax, x, n) C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,f20.15)') i, x(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di bisezione C==================================================================== SUBROUTINE bisezione (f, a, b, toll, nmax, x, n) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C a, b estremi dell'intervallo che contiene la radice C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 a,b,toll real*8 amp,fa,fx integer nmax real*8 x(0:*) integer n C==================== C Parte esecutiva C==================== n=0 amp=toll+1 fa=f(a) do while (amp.ge.toll.and.n.lt.nmax) amp=abs(b-a) x(n)=a+amp*0.5d0 fx=f(x(n)) if(fa*fx.lt.0.0d0) then b=x(n) else if (fa*fx.gt.0.0d0) then a=x(n) fa=fx else amp=0.0d0 endif n=n+1 enddo n=n-1 if (amp.ne.0) then n=n+1 x(n)=a+amp*0.25d0 endif return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x funz=x-2.0d0 return end |
Metodo di bisezione con stima.
bisezioneStima.f |
C==================================================================== C Programma per il Metodo di Bisezione C Versione con controlli in ingresso e con stima dell'ordine C==================================================================== program bis implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 a,b,toll real*8 amp,fa,fx integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim), p(3:maxdim) integer n, i character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi gli estremi a e b dell''intervallo iniziale' read*, a, b do while (funz(a)*funz(b).gt.0.0d0 .or. a .ge. b) print *, 'f(a)*f(b)>0 OPPURE a>=b! Reinserisci a e b' read*, a, b end do print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Estremi dell''intervallo iniziale a = ',a,' b = ',b write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di bisezione C CALL bisezione (funz, a, b, toll, nmax, x, n) C C Calcolo del vettore stime dell'ordine C CALL stimao (x,p,n) C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,2f20.15)') i, x(i), p(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di bisezione C==================================================================== SUBROUTINE bisezione (f, a, b, toll, nmax, x, n) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C a, b estremi dell'intervallo che contiene la radice C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 a,b,toll real*8 amp,fa,fx integer nmax real*8 x(0:*) integer n C==================== C Parte esecutiva C==================== n=0 amp=toll+1 fa=f(a) do while (amp.ge.toll.and.n.lt.nmax) amp=abs(b-a) x(n)=a+amp*0.5d0 fx=f(x(n)) if(fa*fx.lt.0.0d0) then b=x(n) else if (fa*fx.gt.0.0d0) then a=x(n) fa=fx else amp=0.0d0 endif n=n+1 enddo n=n-1 if (amp.ne.0) then n=n+1 x(n)=a+amp*0.25d0 endif return end C==================================================================== C Subroutine per il calcolo della stima dell'ordine C==================================================================== SUBROUTINE stimao(x,p,n) implicit none C C Variabili INGRESSO: C x vettore contenente le iterate - dimensione (0:n) C n indice dell'ultima iterata calcolata C C Variabili USCITA: C C p vettore contenente le stime - dimensione (3:n) C C==================== C Parte dichiarativa C==================== real*8 x(0:*), p(3:*) integer i, n C==================== C Parte esecutiva C==================== do i = 3,n p(i) = dlog(dabs(x(i)-x(i-1))/dabs(x(i-1)-x(i-2))) / * dlog(dabs(x(i-1)-x(i-2))/dabs(x(i-2)-x(i-3))) end do return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x !funz=x-2.0d0 !funz=(x-1)*log(x) funz=x**2-x-2 return end |
Metodo di Newton.
newtonC.f |
C==================================================================== C Programma per il Metodo di Newton con stima C Versione con controlli in ingresso C==================================================================== program bis implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 dfun external dfun real*8 toll,vi real*8 diff integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim) integer n, i character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print*,'Dammi il valore di vi ' read*,vi print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di Newton C CALL pippo(funz,dfun,vi,toll,nmax,x,n) C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,f20.15)') i, x(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di bisezione C==================================================================== SUBROUTINE pippo(f,df,vi,toll,nmax,x,n) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C df derivata della funzione C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 df external df real*8 toll,diff real*8 vi integer n,nmax real*8 x(0:*) C==================== C Parte esecutiva C==================== n=0 x(n)=vi diff=toll+1 do while (diff.ge.toll.and.n.lt.nmax) diff=-(f(x(n))/df(x(n))) x(n+1)=x(n)+diff diff=abs(diff) n=n+1 enddo return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x funz=(x-1.0d0)*dlog10(x) return end c===================================================================== c funzione derivata assegnata c===================================================================== real*8 function dfun(x) implicit none real*8 x dfun=dlog10(x)+(x-1.0d0)*(1.0d0/x) return end c----------------------------------------- c----------------------------------------- |
Programma per il Metodo di Newton con stima.Versione con controlli in ingresso, con stima dell'ordine e molteplicitą
newtonstima_r.f |
C============================================================================ C Programma per il Metodo di Newton con stima C Versione con controlli in ingresso, con stima dell'ordine e molteplicitą C============================================================================ program bis implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 dfun external dfun real*8 toll,vi real*8 diff integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim), p(3:maxdim) integer n, i, r character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print*,'Dammi il valore di vi ' read*,vi print*,'Dammi il valore dela molteplicita r' read*,r print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di Newton C CALL pippo(funz,dfun,vi,toll,nmax,x,n,r) C C Calcolo del vettore stime dell'ordine C CALL stimao (x,p,n) C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,2f20.15)') i, x(i), p(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n print*, ' Molteplicita r=',r write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n write(10,*) ' Molteplicita r= ', r write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di NEWTON STIMA CON MOLTEPLICITA' C==================================================================== SUBROUTINE pippo(f,df,vi,toll,nmax,x,n,r) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C df derivata della funzione C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 df external df real*8 toll,diff real*8 vi integer n,nmax,r real*8 x(0:*) C==================== C Parte esecutiva C==================== n=0 x(n)=vi diff=toll+1 do while (diff.ge.toll.and.n.lt.nmax) diff=-(f(x(n))/df(x(n))) x(n+1)=x(n)+r*diff diff=abs(diff) n=n+1 enddo return end C==================================================================== C Subroutine per il calcolo della stima dell'ordine C==================================================================== SUBROUTINE stimao(x,p,n) implicit none C C Variabili INGRESSO: C x vettore contenente le iterate - dimensione (0:n) C n indice dell'ultima iterata calcolata C C Variabili USCITA: C C p vettore contenente le stime - dimensione (3:n) C C==================== C Parte dichiarativa C==================== real*8 x(0:*), p(3:*) integer i, n C==================== C Parte esecutiva C==================== do i = 3,n p(i) = dlog(dabs(x(i)-x(i-1))/dabs(x(i-1)-x(i-2))) / * dlog(dabs(x(i-1)-x(i-2))/dabs(x(i-2)-x(i-3))) end do return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x funz=(x-1.0d0)*dlog10(x) return end c===================================================================== c funzione derivata assegnata c===================================================================== real*8 function dfun(x) implicit none real*8 x dfun=dlog10(x)+(x-1.0d0)*(1.0d0/x) return end c----------------------------------------- c----------------------------------------- |
Metodo di Newton con stima dell'ordine della molteplicitą.
newtonstima.f |
C==================================================================== C Programma per il Metodo di Newton con stima C Versione con controlli in ingresso e con stima dell'ordine C==================================================================== program Newton implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 dfun external dfun real*8 toll,vi real*8 diff integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim), p(3:maxdim) integer n, i character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print*,'Dammi il valore di vi ' read*,vi print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di Newton C CALL pippo(funz,dfun,vi,toll,nmax,x,n) C C Calcolo del vettore stime dell'ordine C CALL stimao (x,p,n) C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,2f20.15)') i, x(i), p(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di bisezione C==================================================================== SUBROUTINE pippo(f,df,vi,toll,nmax,x,n) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C df derivata della funzione C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 df external df real*8 toll,diff real*8 vi integer n,nmax real*8 x(0:*) C==================== C Parte esecutiva C==================== n=0 x(n)=vi diff=toll+1 do while (diff.ge.toll.and.n.lt.nmax) diff=-(f(x(n))/df(x(n))) x(n+1)=x(n)+diff diff=abs(diff) n=n+1 enddo return end C==================================================================== C Subroutine per il calcolo della stima dell'ordine C==================================================================== SUBROUTINE stimao(x,p,n) implicit none C C Variabili INGRESSO: C x vettore contenente le iterate - dimensione (0:n) C n indice dell'ultima iterata calcolata C C Variabili USCITA: C C p vettore contenente le stime - dimensione (3:n) C C==================== C Parte dichiarativa C==================== real*8 x(0:*), p(3:*) integer i, n C==================== C Parte esecutiva C==================== do i = 3,n p(i) = dlog(dabs(x(i)-x(i-1))/dabs(x(i-1)-x(i-2))) / * dlog(dabs(x(i-1)-x(i-2))/dabs(x(i-2)-x(i-3))) end do return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x !funz=x+1.0d0 funz=(x-1)*dlog(x) return end c===================================================================== c funzione derivata assegnata c===================================================================== real*8 function dfun(x) implicit none real*8 x !dfun=1.0d0 dfun=dlog(x)+((x+1)*(1/x)) return end c----------------------------------------- c----------------------------------------- |
Programma per il Metodo di Punto fisso con stima. Versione con controlli in ingresso.
puntofisso.f |
C==================================================================== C Programma per il Metodo di Punto fisso con stima C Versione con controlli in ingresso C==================================================================== program bis implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 toll,vi real*8 diff integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim) integer n, i character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print*,'Dammi il valore di vi ' read*,vi print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di Newton C CALL pfisso(funz,vi,toll,nmax,x,n) C C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,f20.15)') i, x(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di Punto fisso C==================================================================== SUBROUTINE pfisso(f,vi,toll,nmax,x,n) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 toll,diff real*8 vi integer n,nmax real*8 x(0:*) C==================== C Parte esecutiva C==================== n=0 x(n)=vi diff=toll+1 do while (diff.ge.toll.and.n.lt.nmax) n=n+1 x(n)=f(x(n-1)) x(n+1)=f(x(n)) diff=abs(x(n+1)-x(n)) enddo return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x funz=((2.0d0*x**3+4.0d0*x**2+10)/(3.0d0*x**2+8.0d0*x)) return end c==================================================================== |
Programma per il Metodo di Punto fisso con stima Versione con controlli in ingresso e con stima dell'ordine
C==================================================================== C Programma per il Metodo di Punto fisso con stima C Versione con controlli in ingresso e con stima dell'ordine C==================================================================== program puntofisso implicit none C==================== C Parte dichiarativa C==================== real*8 funz external funz real*8 toll,vi real*8 diff integer nmax, maxdim parameter (maxdim=100) real*8 x(0:maxdim), p(3:maxdim) integer n, i character*20 nomefile C==================== C Parte esecutiva C==================== C Ingresso ed uscita dati C print *, 'Dammi il numero massimo di iterazioni nmax' read*, nmax do while (nmax .gt. 100) print *, * 'Numero massimo di iterazioni >', maxdim, ' Reinserisci nmax' read*, nmax end do print *, 'Dammi la tolleranza toll' read*, toll print*,'Dammi il valore di vi ' read*,vi print *, 'Dammi il nome del file in uscita' read*, nomefile c open(unit=10,file=nomefile) write(10,*)'Numero massimo iterazioni = ',nmax write(10,*)'Tolleranza = ',toll write(10,*) C C Esecuzione metodo di Newton C CALL pfisso(funz,vi,toll,nmax,x,n) C C Calcolo del vettore stime dell'ordine C CALL stimao (x,p,n) C C Uscita finale risultati C do i = 0, 2 write(10,'(i5,f20.15)') i, x(i) end do do i = 3, n write(10,'(i5,2f20.15)') i, x(i), p(i) end do write(10,*) write(10,*) ' Numero iterazioni effettuate ', n write(10,'(a,f20.15)') ' Soluzione approssimata ', x(n) print *, ' Numero iterazioni effettuate ', n print *, ' Valore iniziale ', vi write(10,*) ' Valore iniziale ', vi write(*,'(a,f20.15)') ' Soluzione approssimata ', x(n) close(10) stop end C==================================================================== C Subroutine per metodo di Punto fisso C==================================================================== SUBROUTINE pfisso(f,vi,toll,nmax,x,n) implicit none C C Variabili INGRESSO: C f funzione di cui si cerca la soluzione C toll tolleranza sull'ampiezza dell'intervallo C nmax numero massimo di iterazioni da eseguire C C Variabili USCITA: C x vettore contenente le iterate di lunghezza (0:n) C n indice dell'ultima iterata calcolata C C==================== C Parte dichiarativa C==================== real*8 f external f real*8 toll,diff real*8 vi integer n,nmax real*8 x(0:*) C==================== C Parte esecutiva C==================== n=0 x(n)=vi diff=toll+1 do while (diff.ge.toll.and.n.lt.nmax) n=n+1 x(n)=f(x(n-1)) x(n+1)=f(x(n)) diff=abs(x(n+1)-x(n)) enddo return end C==================================================================== C Subroutine per il calcolo della stima dell'ordine C==================================================================== SUBROUTINE stimao(x,p,n) implicit none C C Variabili INGRESSO: C x vettore contenente le iterate - dimensione (0:n) C n indice dell'ultima iterata calcolata C C Variabili USCITA: C C p vettore contenente le stime - dimensione (3:n) C C==================== C Parte dichiarativa C==================== real*8 x(0:*), p(3:*) integer i, n C==================== C Parte esecutiva C==================== do i = 3,n p(i) = dlog(dabs(x(i)-x(i-1))/dabs(x(i-1)-x(i-2))) / * dlog(dabs(x(i-1)-x(i-2))/dabs(x(i-2)-x(i-3))) end do return end C==================================================================== C Funzione assegnata C==================================================================== real*8 function funz(x) implicit none real*8 x !funz=x+1.0d0 !funz=(x*(x**2+6))/(3*x**2+2) !funz=(2*x**3+4*x**2+10)/(3*x**2+8*x) funz=x**2-2 return end c==================================================================== |