Calcolo numerico

Programmazione in Fortran 77.

Integrazione numerica

 In questa rubrica presento una completa serie di algoritmi implementati in Digital Visual Fortran 90 ( 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.

Metodo di Cavalieri Simpson
cavsimpson.f cav.out
C====================================================================
C Programma per il calcolo integrale (Metodo CAVALIERI SIMPSN)
C====================================================================
program CavSimpson
implicit none
C====================
C Parte dichiarativa
C====================
real*8 funz
real*8 a,b,int
integer m
real*8 x(0:100)
integer n
character*20 nomefile
C====================
C Parte esecutiva
C====================

C====================
C Ingresso dati
C====================
print *, 'Dammi gli estremi a e b dell''intervallo iniziale'
read*, a, b
b=dacos(b)

print *, 'Dammi il numero di suddivisioni per integrare m'
read*, m
do while (mod(m,2).ne.0)
print *, 'Reinserire m pari '
read*, m
enddo

print *, 'Dammi il nome del file in uscita'
read*, nomefile

open(unit=10,file=nomefile)

C============================================
C Chiamata della formula CAVALIERI SIMPSON
C============================================

Call cavsimp(m,b,a,int)

C====================
C Uscita dati
C====================

print*, 'Valore approssimato integrale int =', int
write(10,*)'**********************************'
write(10,*)'* Gottardo Marco matr 347349/IT             *'
write(10,*)'* esame di calcolo numerico                        *'
write(10,*)'* 03/07/2003                                              *'
write(10,*)'* Metodo di integrazione Cavalieri Simpson *'
write(10,*)'* Comparazione dei risultati                          *'
write(10,*)'* funz=funz=exp(x)*dcos(x)                        *'
write(10,*)'* vedi tabella risultati pag 208                      *'
write(10,*)'* tra 0 e pi cav(512) -12.0703463160        *'
write(10,*)'*                                                                 *'
write(10,*)'***********************************'
write(10,*)
write(10,*)'Estremo iniziale a = ',a
write(10,*)'Estremo finale b = ',b
write(10,*)'Suddivisioni m = ',m
write(10,*)'Valore approssimato dell''integrale = ',int
close(10)

stop
end

C====================================================================
C Algoritmo del calcolo integrale con metodo CAVALIERI SIMPSON
C Applicazione dell'integrazione nell'intervallo assegnato
C====================================================================
Subroutine cavsimp(m,b,a,int)
implicit none
real*8 h,a,b,x,funz,int,fx
integer m,i
h=(b-a)/m
int=funz(a)+funz(b)
do i= 1, m-1, 2
x=a+(i*h)
Int=Int+(4.0d0*funz(x))
enddo
do i=2, m-2, 2
x=a+(i*h)
Int= Int+(2.0d0*funz(x))
enddo
Int= h*(Int/3.0d0)
return
end

C=======================
C Funzione assegnata
C=======================
real*8 function funz(x)
implicit none
real*8 x
funz= exp(x)*dcos(x)
return
end
 ********************************
* Gottardo Marco matr 347349/IT          *
* esame di calcolo numerico                     *
* 03/07/2003                                           *
* Metodi di integrazione numerica             *
* Comparazione dei risultati                      *
* funz=funz=exp(x)*dcos(x)                     *
* vedi tabella risultati pag 208                   *
* tra 0 e pi cav(512) -12.0703463160     *
* tra 0 e pi trap(512) -12.0704220570     *
*                                                              *
*********************************

Estremo iniziale a = 0.000000000000000E+000
Estremo finale b = 3.14159265358979

numero di divisioni sull'intervallo = 512

Valore approssimato dell'integrale
Metodo dei trapezi -> I= -12.2128471815589
Metodo Cavalieri Simpson -> I= -12.0703463163890
 

 

Programma di calcolo dell'integrale di una funzione predefinita, in un intervallo assegnato con il metodo dei trapezi.

Metodo dei trapezi.
trapezi.f trapezi.out
C====================================================================
C Programma per il calcolo integrale (Metodo Trapezi)
C====================================================================
program trapezi
implicit none
C====================
C Parte dichiarativa
C====================
real*8 funz
real*8 a,b,int
integer m
real*8 x(0:100)
integer n
character*20 nomefile
C====================
C Parte esecutiva
C====================

C====================
C Ingresso dati
C====================
print *, 'Dammi gli estremi a e b dell''intervallo iniziale'
read*, a, b
b=dacos(b)

print *, 'Dammi il numero di suddivisioni per integrare m'
read*, m
do while (mod(m,2).ne.0)
print *, 'Reinserire m pari '
read*, m
enddo

print *, 'Dammi il nome del file in uscita'
read*, nomefile

open(unit=10,file=nomefile)

C============================================
C Chiamata della formula Trapezi
C============================================

Call trapez(m,b,a,int)

C====================
C Uscita dati
C====================

print*, 'Valore approssimato integrale int =', int
write(10,*)'*********************************'
write(10,*)'* Gottardo Marco matr 347349/IT            *'
write(10,*)'* esame di calcolo numerico                       *'
write(10,*)'* 03/07/2003                                             *'
write(10,*)'* Metodo di integrazione numerica Trapezi *'
write(10,*)'* Comparazione dei risultati                       *'
write(10,*)'* funz=funz=exp(x)*dcos(x)                      *'
write(10,*)'* vedi tabella risultati pag 208                   *'
write(10,*)'* tra 0 e pi trap(512) -12.0704220570    *'
write(10,*)'*                                                              *'
write(10,*)'*********************************'
write(10,*)
write(10,*)'Estremo iniziale a = ',a
write(10,*)'Estremo finale b = ',b
write(10,*)'Suddivisioni m = ',m
write(10,*)'Valore approssimato dell''integrale = ',int
close(10)

stop
end

C====================================================================
C Algoritmo del calcolo integrale con metodo Trapezi
C Applicazione dell'integrazione nell'intervallo assegnato
C====================================================================
Subroutine trapez(m,b,a,int)
implicit none
real*8 h,a,b,x,funz,int
integer m,i
h=(b-a)/m
int=funz(a)+funz(b)
do i=1, m-1
x=a+(i*h)
Int= Int+(2.0d0*funz(x))
enddo
Int= h*(Int/2.0d0)
return
end

C=======================
C Funzione assegnata
C=======================
real*8 function funz(x)
implicit none
real*8 x
funz= exp(x)*dcos(x)
return
end
 ********************************
* Gottardo Marco matr 347349/IT           *
* esame di calcolo numerico                      *
* 03/07/2003                                            *
* Metodo di integrazione numerica Trapezi *
* Comparazione dei risultati                        *
* funz=funz=exp(x)*dcos(x)                       *
* vedi tabella risultati pag 208                     *
* tra 0 e pi trap(512) -12.0704220570       *
*                                                                 *
***********************************

Estremo iniziale a = 0.000000000000000E+000
Estremo finale b = 3.14159265358979
Suddivisioni m = 512
Valore approssimato dell'integrale = -12.0704220570084
 

Programma comparativo dei due metodi di integrazione.

Programma comparativo dei trapezi/Cavalieri S.
integrali.f integrali.out
C====================================================================
C Gottardo Marco matr 347349/IT
C Esame di calcolo numerico
C Sessione estiva 3/07/2003
C Programma per il calcolo integrale (comparazione tra i metodi)
C====================================================================
program integrale
implicit none
C====================
C Parte dichiarativa
C====================
real*8 funz,trapez,cav_sim,C_S
real*8 a,b,integr,integ,integS,CS,caval
integer divis
real*8 x(0:100)
integer n
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
print *, 'Dammi il numero di suddivisioni per integrare'
read*, divis
c
print *, 'Dammi il nome del file in uscita'
read*, nomefile
c
integr = trapez(divis,b,a,integ)
caval = C_S(a,b,divis,integS)

open(unit=10,file=nomefile)
write(10,*)'************************************'
write(10,*)'* Gottardo Marco matr 347349/IT                 *'
write(10,*)'* esame di calcolo numerico                           *'
write(10,*)'* 03/07/2003                                                 *'
write(10,*)'* Metodi di integrazione numerica                   *'
write(10,*)'* Comparazione dei risultati                             *'
write(10,*)'*funz=(1.0d0/(1.0d0+(x-(acos(-1.0d0)))**2))*'
write(10,*)'*                                                                     *'
write(10,*)'* tra 0 e 5 I=2.33976628367 circa                 *'
write(10,*)'************************************'
write(10,*)
write(10,*)'Estremo iniziale a = ',a
write(10,*)'Estremo finale b = ',b
write(10,*)
write(10,*)'numero di divisioni sull''intervallo = ',divis/4
write(10,*)
write(10,*)'Valore approssimato dell''integrale '
write(10,*)'Metodo dei trapezi -> I=',integ
write(10,*)'Metodo Cavalieri Simpson -> I=',integS
close(10)
stop
end

C====================================================================
C Funzione assegnata
C====================================================================
real*8 function funz(x)
implicit none
real*8 x
funz=(1.0d0/(1.0d0+(x-(acos(-1.0d0)))**2))
return
end
C====================================================================
C Algoritmo del calcolo integrale con metodo dei Trapezi
C Applicazione dell'integrazione nell'intervallo assegnato
C====================================================================
real*8 function trapez(divis,b,a,integ)
implicit none
real*8 h,a,b,sum,xi,funz,integ
integer divis,index
h=(b-a)/divis
print *,'Ampiezza base trapezi h ',h
do while (index.le.divis)
xi=a+(index*h)
sum=(((funz(xi)+funz(xi+h))*h)/2)
integ=sum+integ
index=index+1
end do
write(6,*)
print *, ' Integrale calcolato'
write(*,'(a,f20.15)') 'Soluzione appross. metodo trapezi',integ
return
end
C====================================================================
C Algoritmo del calcolo integrale con metodo di Cavalieri Simpson
C Applicazione dell'integrazione nell'intervallo assegnato
C====================================================================
real*8 function C_S(a,b,n,integS)
implicit none
integer i,n,iter,n1,n2
real*8 a,b,x,In,I2n,h,S1,Xo,X1,X2,INT(2),funz,integS
iter =0
30 iter=iter+1
h=(b-a)/(2.0d0*n)
S1=0.0d0
X2=a
do 40 i=1,n
Xo=X2
X1=Xo+h
X2=X1+h
S1=S1+h*(funz(xo)+4.0d0*funz(x1)+funz(X2))/3.0d0
40 continue
INT(iter)=S1
n=2*n
if(iter.lt.2) goto 30
IN=INT(1)
I2n=INT(2)
n1=n/4
n2=n/2
c write(6,*)n1,In,n2,I2n
integS=I2n
write(6,*)'Soluzione approssimata cavalieri Simpson:',I2n
return
end
 ************************************
* Gottardo Marco matr 347349/IT                 *
* esame di calcolo numerico                            *
* 03/07/2003                                                  *
* Metodi di integrazione numerica                    *
* Comparazione dei risultati                             *
*funz=(1.0d0/(1.0d0+(x-(acos(-1.0d0)))**2))*
*                                                                     *
* tra 0 e 5 I=2.33976628367 circa                 *
************************************

Estremo iniziale a = 0.000000000000000E+000
Estremo finale b = 5.00000000000000

numero di divisioni sull'intervallo = 500

Valore approssimato dell'integrale
Metodo dei trapezi -> I= 2.34200029777255
Metodo Cavalieri Simpson -> I= 2.33976628366840