Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due...

31
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while

Transcript of Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due...

Page 1: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Cicli in Fortran

I cicli consentono di eseguire una sequenza di

istruzioni più di una volta

due tipi:

Cicli iterativi

Cicli while

Page 2: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Ciclo Iterativo

DO indice=inizio,fine,incremento

istruzione 1

istruzione 2

……………

END DO

blocco

indice è una variabile intera ed è utilizzatata

come contatore del ciclo

inizio, fine, incremento sono parametri

incremento è facoltativo se è omesso si assume

che è uguale a 1

Page 3: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Ciclo Iterativo

1) inizio, fine, incremento possono essere costanti,

variabili o espressioni;

se sono variabili o espressioni devono essere

valutate prima del ciclo

2) all’inizio del ciclo il programma pone indice=inizio

se indice*incremento =< fine*incremento

il programma esegue le istruzioni all’interno del ciclo

Page 4: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Ciclo Iterativo3) eseguite le istruzioni all’interno del ciclo il

programma pone indice=indice+incremento

se indice*incremento =< fine*incremento

vengono eseguite nuovamente le istruzioni del ciclo

4) si ripete il punto 3) finchè

indice*incremento =< fine*incremento

quando questa condizione non è più vera viene

eseguita la prima istruzione dopo il ciclo

5) Si eseguono

n.iter.= (fine-inizio+incremento)/incremento

Page 5: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Ciclo Iterativo (esempi)

DO i=1,10,2

istruzione

……………

END DO

5 iterazioni

DO i=3,-3,-2

istruzione

……………

END DO

4 iterazioni

Page 6: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Istruzione CYCLE

Istruzione CYCLE interrompe l’esecuzione delle

istruzioni del ciclo e fa ritornare all’inizio del ciclo

L’indice del ciclo viene incrementato e l’esecuzione

delle istruzioni del ciclo riprende se l’indice non ha

raggiunto il suo valore

Page 7: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Istruzione CYCLE (esempio)

PROBLEM esempio

INTEGER :: I

DO i=1,10

IF ( i == 3 ) CYCLE

WRITE(*,*) i

END DO

END PROGRAM esempio

Si stampano tutti i numeri interi compresi tra 1 e 10

Escluso il numero 3

Page 8: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Istruzione EXIT

Istruzione EXIT interrompe l’esecuzione delle

istruzioni del ciclo, fa uscire dal ciclo

Viene eseguita la prima istruzione dopo END DO

del ciclo

Page 9: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Istruzione EXIT (esempio)

PROBLEM esempio

INTEGER :: I

DO i=1,10

IF ( i == 3 ) EXIT

WRITE(*,*) i

END DO

END PROGRAM esempio

Si stampa solamente il numero 1

Page 10: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Ciclo while

DO WHILE (espressione logica)

istruzione 1

istruzione 2

……………

END DO

blocco

quando l’espressione logica è .TRUE. il blocco

delle istruzioni del ciclo vengono ripetute

quando l’espressione logica è .FALSE. viene

eseguita la prima istruzione dopo END DO

Page 11: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Ciclo while

DO

…………...

IF (espressione logica) EXIT

……………

END DO

blocco

quando l’espressione logica è .TRUE. il blocco

delle istruzioni del ciclo vengono ripetute

quando l’espressione logica è .FALSE. viene

eseguita la prima istruzione dopo END DO

Page 12: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

PROBLEM esempio

DOUBLE PRECISION :: var,eps

eps=1.D0

DO

var=1.D0+eps

IF ( var.EQ.1.D0) EXIT

eps=eps/2.d0

END DO

WRITE(*,*) ‘ eps =’, eps

END PROGRAM esempio

Ciclo while

Page 13: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Cicli DO con nome

DO indice = inizio, fine, incremento

…………...

…………...

IF (espressione logica) CYCLE

……………

……………

END DO

[nome]

[nome]

[nome]

Page 14: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Cicli DO con nome

DO

…………...

IF (espressione logica) CYCLE

……………

END DO

…………...

IF (espressione logica) EXIT

……………

[nome]

[nome]

[nome]

[nome]

Page 15: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

SUBROUTINE

SUBROUTINE nome_subr ( lista_argomenti )

sezione esecutiva

sezione dichiarativa

RETURN

END SUBROUTINE nome_subr

Page 16: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

SUBROUTINE

PROGRAM nome_prog

CALL nome_subr ( lista_argomenti )

END PROGRAM nome_prog

Page 17: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

SUBROUTINE

1) ogni subroutine è compilata separatamente dal programma principale e da altre subroutine quindi può usare le stessi nomi delle variabili e le stesse etichette utilizzate dal programma principale o da altre subroutine

2) l’ordine e il tipo degli argomenti della chiamata devono corrispondere a quelli della definizione

Page 18: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

SUBROUTINE

PROGRAM mainINTEGER, PARAMETER :: n=2DOUBLE PRECISION :: f,x(n)

END PROGRAM main

CALL funct( n,x,f )

SUBROUTINE funct(n,x,f ) INTEGER :: n DOUBLE PRECISION :: f,x(n)

Page 19: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Istruzione INTENT

INTENT(IN) l’argomento è un dato di input

INTENT(OUT) l’argomento è un dato di output

INTENT(IN OUT) l’argomento è sia un dato di input che di output

se l’istruzione INTENT è assente l’argomento è sia un dato di input che di output

Page 20: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Istruzione INTENT

SUBROUTINE funct(n,x,f ) INTEGER, INTENT(IN) :: n DOUBLE PRECISION, INTENT(IN) :: x(n) DOUBLE PRECISION, INTENT(OUT) :: f

Page 21: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

FUNCTION

FUNCTION nome_funct ( lista_argomenti )

sezione esecutiva nome_funct=espressione

sezione dichiarativa

RETURN

END FUNCTION nome_funct

Page 22: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

PROGRAM nome_prog

var=nome_funct( lista_argomenti )

END PROGRAM nome_prog

FUNCTION

Page 23: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Calcolo del gradiente approssimato

xfxfx

yxf

0

lim,

0 ,0)(

)(,

app

troncapp

err

errerrxfxfx

yxf

Page 24: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Calcolo del gradiente approssimato

xfxfx

yxf

0

lim,

0 ,0)(

)(,

app

troncapp

err

errerrxfxfx

yxf

Page 25: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

xfxf

xyxf

,

per valori di sufficientemente piccoli

Forward formula

xfxfx

yxf , Backward formula

2

,

xfxfx

yxf Symmetric formula

Calcolo del gradiente approssimato

Page 26: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

subroutine gradapp(n,x,f)................................. call funct(n,x,f) do i=1,n z=x z(i)=x(i)+eps call funct(n,z,fp) g(i)=(fp-f)/eps end do return end subroutine gradapp

Page 27: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Generatore di Numeri Pseudo-casuali

RANDOM_NUMBER(x)

x è un REAL

ritorna un valore estratto da una sequenza di numeri pseudo-casuali

il valore restituito nella variabile x è compreso tra 0 (incluso) e 1 (escluso)

10 x

Page 28: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Gen. di Num. Cas. (esempio di numero in [l,u) )

PROGRAM num_cas implicit none real :: num double precision, parameter :: l=-10, u=10 double precision :: dnum,x call RANDOM_NUMBER(num) dnum=dble(num) x=l+dnum*(u-l) stopend program num_cas

Page 29: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Sequenza pesudo-casuale

seed della sequenza

… s … …s … …s

circa 1018 numeri circa 1018 numeri

Page 30: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.

Inizializzazione della sequenza

RANDOM_SEED()

imposta l’innesco della sequenza random s ad un valore ottenuto sulla base del tempo di sistema.

se CALL RANDOM_SEED() precedel’istruzione CALL RANDOM_NUMBER(num)ad ogni esecuzione del programma vengonogenerati numeri differentialtrimenti vengono generati gli stessi numeri

Page 31: Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.