program Integ implicit none ! Legge una curva definita per punti ! calcola l'integrale per trapezi ! ! INTERFACE real function integrale(x,y,n) implicit none integer ,intent(IN)::n real ,intent(In):: x(:),y(:) end function integrale real function integrale90(x,y,n) implicit none integer ,intent(IN)::n real ,intent(In):: x(:),y(:) end function integrale90 real function integrale90_1(x,y,n) implicit none integer ,intent(IN)::n real ,intent(In):: x(:),y(:) end function integrale90_1 real function integrale90_2(x,y,n) implicit none integer ,intent(IN)::n real ,intent(In):: x(:),y(:) end function integrale90_2 END INTERFACE integer ::n,i,iend real, allocatable,dimension(:) :: x,y real:: xx,xint character (len=40) :: nome 1 Write(6,*)'Nome File?' read(5,'(a)')nome open (unit=50,status='old',file=nome,err=1) do i=1,1000000 read(50,*,iostat=iend)xx if(iend /= 0)exit enddo if(iend > 0)then write(6,*)'Errore di lettura :',iend stop endif n=i-1 write(6,*) 'Lette ',n,' righe' rewind(50) allocate(x(n)) allocate(y(n)) do i=1,n read(50,*)x(i),y(i) enddo close(50) ! provo diversi tipi di funzione xint=integrale(x,y,n) write(6,*) 'Integrale =',xint xint=integrale90(x,y,n) write(6,*) 'Integrale90 =',xint xint=integrale90_1(x,y,n) write(6,*) 'Integrale90_1 =',xint xint=integrale90_1(x,y,n) write(6,*) 'Integrale90_2 =',xint ! poiche' l'ultima versione si riduce a una sola linea: ! posso anche scrivere semplicemente: xint=sum((y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)))/2 write(6,*) 'Integrale diretto 1 =',xint ! oppure write(6,*) 'Integrale diretto 1 =',sum((y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1))/2) end program Integ real function integrale(x,y,n) implicit none ! integrale per trapezi (Fortran "classico") integer ,intent(IN)::n real ,intent(In):: x(:),y(:) integer ::i integrale=0 do i=2,n integrale=integrale + (y(i)+y(i-1))*(x(i)-x(i-1)) ! write(6,*)x(i),y(i),integrale enddo integrale=integrale/2 end function integrale real function integrale90(x,y,n) implicit none ! integrale per trapezi (operazioni vettoriali) integer ,intent(IN)::n real ,intent(In):: x(:),y(:) real, allocatable :: trapezi(:) integer ::i allocate (trapezi(n-1)) trapezi=(y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)) integrale90=trapezi(1) do i=2,n-1 integrale90=integrale90+trapezi(i) enddo integrale90=integrale90/2 deallocate (trapezi) end function integrale90 real function integrale90_1(x,y,n) implicit none ! integrale per trapezi (operazioni vettoriali e subroutine) integer ,intent(IN)::n real ,intent(In):: x(:),y(:) real, allocatable :: trapezi(:) integer ::i allocate (trapezi(n-1)) trapezi=(y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)) integrale90_1=sum(trapezi)/2 deallocate (trapezi) end function integrale90_1 real function integrale90_2(x,y,n) implicit none ! integrale per trapezi (operazioni vettoriali e subroutine) ! come il precedente, piu' sintetico integer ,intent(IN)::n real ,intent(In):: x(:),y(:) integrale90_2=sum((y(2:n)+y(1:n-1))*(x(2:n)-x(1:n-1)))/2 end function integrale90_2