Upload
tranmien
View
213
Download
0
Embed Size (px)
Citation preview
2
Docente: Vittoria Bruni
Email: [email protected]
Ufficio: Via A. Scarpa,
Pal. B, I piano, Stanza n. 16
Tel. 06 49766648
Ricevimento: Martedì 9.30-10.30
3
Obiettivi del corso
Fornire una panoramica dei metodi numerici fondamentali per la soluzione di
alcuni problemi di maggior interesse nel settore dell’ingegneria e di alcune
tecniche fondamentali della programmazione
Sviluppo di algoritmi risolutivi e relativa implementazione in un ambiente
di calcolo integrato
Risultati
- individuare un metodo numerico adatto a risolvere alcuni problemi test
- analizzarne e formularne la soluzione in modo algoritmico
- implementare tali algoritmi in Matlab/Octave
4
Programma sintetico
1. Nozioni introduttive dell’analisi numerica, classificazione degli errori,
condizionamento, stabilità
2. Introduzione alla programmazione in Matlab/Octave: tipi di dato primitivi,
variabili, espressioni e assegnazioni, array e matrici, funzioni e Script;
istruzioni condizionali e espressioni booleane, cicli
3. Metodi numerici per la soluzione di problemi a valori iniziali; errore di
troncamento locale, errore globale, consistenza e stabilità; convergenza
dei metodi
4. Metodi alle differenze finite per problemi ai limiti; convergenza, stabilità e
consistenza.
5. Metodi numerici per la soluzione di equazioni alle derivate parziali;
equazione del trasporto. equazione della propagazione del calore,
equazione di Poisson.
6. Soluzione di equazioni e sistemi di equazioni non lineari; errore di
troncamento, convergenza dei metodi, velocità di convergenza
7. Soluzione di sistemi di equazioni lineari: metodi diretti e iterativi
5
Testi consigliati:
Calcolo Numerico, L. Gori, Ed. Kappa, 2006
Esercizi di Calcolo Numerico, L. Gori, M.L. Lo Cascio, F. Pitolli,
Ed. Kappa, 2007
Il materiale didattico sarà disponibile sul sito
http://www.sbai.uniroma1.it/users/bruni-vittoria
nella pagina dedicata al corso Analisi Numerica
6 e che non possono essere risolti analiticamente
Cosa è il CALCOLO NUMERICO?
E’ quella branca della matematica che
costruisce e analizza
i metodi numerici
adatti a risolvere, con l’aiuto del calcolatore,
differenti problemi matematici
che nascono in varie discipline
(ingegneria, economia, biologia, ….)
7
Un ingegnere, durante la usa carriera, può aver necessità di usare
software commerciali che usano metodi numerici. E’ necessario
conoscere la teoria e i concetti alla base di questi metodi al fine di
poterli usare al meglio e saperne interpretare correttamente i
risultati
I metodi numerici offrono strumenti potenti per la soluzione di
problemi, soprattutto a seguito dello sviluppo del calcolatore
elettronico
E’ possibile scrivere un metodo numerico per un problema specifico
che non può essere risolto con i metodi esistenti
Perché conoscerlo
8
Disastri dovuti ad errori nelle simulazioni numeriche
La piattaforma è affondata nel mare del Nord al
largo della Norvegia a seguito di un’operazione
di zavorramento, provocando un effetto sismico
del terzo grado della scala Richter e una perdita
stimata in 700 milioni di dollari
Causa: Utilizzo incauto del codice elementi finiti
NASTRAN nella fase di progettazione (modello elastico lineare della tricella)
in cui gli sforzi di taglio sono stati sottostimati del 47%.
Alcune pareti di cemento non erano abbastanza spesse!!!
Un’analisi più attenta agli elementi finiti, eseguita dopo l'incidente, ha stabilito
che, con il disegno adottato, ci sarebbe stata una rottura ad una profondità di
62m, in buon accordo con la profondità (65m) a cui si è realmente verificata
Affondamento della piattaforma Sleipner A (23 Agosto 1991)
9
Sia U la velocità iniziale di swing,
calcolare l’angolo ottimo per cui la
distanza percorsa da una pallina da golf
prima che tocchi terra sia massima
Problema
10
Descrizione del problema fisico: - misura delle caratteristiche della pallina da golf: raggio, massa, geometria
- forze in gioco: peso della pallina, resistenza dell’aria, effetti del vento, ….
- approssimazioni: la palla è una sfera, assenza di vento
- caratteristiche del tiro (swing): velocità iniziale e angolo iniziale
Formulazione di un modello matematico: - tradurre il problema fisico in equazioni (per es. leggi di conservazione)
- usare le assunzioni fatte nel modello fisico per semplificare il modello
matematico
Soluzione del modello matematico (ben posto e ben condizionato!)
- soluzione analitica (raramente)
- soluzione numerica
Interpretazione e validazione - significato fisico del risultato
- identificare e stimare le “fonti” di errore
11
Parametri: massa M, raggio a,
coefficiente di resistenza dell’ aria
Variabili: posizione x = (x,y), velocità v = (ẋ, ẏ)
Legge della fisica: seconda legge di Newton
DCa
c2
2
)sin,cos()0( ),0,0()0(
||2
2
UUtt
cMgdt
dMF
dt
dM ext
vx
vvvx
Formulazione di un modello matematico
12
)sin,cos()0( ),0,0()0(
||2
2
UUtt
cMgdt
dMF
dt
dM ext
vx
vvvx
Trascurando la resistenza dell’aria
Le equazioni del moto diventano
di cui è possibile determinare la soluzione analitica
Da cui è possibile determinare la distanza D percorsa dalla pallina
nell’istante in cui tocca di nuovo il campo
0)(
)(
f
f
ty
Dtx
4
La velocità iniziale è uguale a quella finale !!!!!!
La resistenza dell’aria non può essere trascurata a velocità così alte
Formulazione di un modello matematico
13
Le equazioni del moto diventano
Di cui non è possibile determinare la soluzione analitica
Sono necessari metodi numerici per la soluzione di equazioni differenziali
Senza resistenza dell’aria la palla percorrerebbe 500m
prima di toccare terra
Considerando la resistenza dell’aria e usando un opportuno metodo numerico
per la soluzione di equazioni differenziali ordinarie, questa distanza si
riduce a 223m circa
Formulazione di un modello matematico
14
Un altro esempio:
Si vuole determinare la parte sommersa di una boa sferica di raggio
R = 0.055m e densità B=0.6 Kg/m3
Indicando con Fp la spinta idrostatica, con MB la massa della boa sferica, g
l’accelerazione di gravità e w=1 la densità dell’acqua, si ha
MBg = Fp
e quindi
4/3 R3 B= x2(R-x/3) wg da cui
x3-3x2R+4 R3 B=0
per calcolare il valore di x è necessario risolvere un’equazione non lineare
usando un opportuno metodo numerico
15
L’immagine plane.bmp ha dimensione: 384x256
La si vuole ingrandire, raddoppiandone la dimensione
Un altro esempio:
19
Problema da risolvere: calcolo dell’angolo ottimo per cui la distanza
percorsa da una pallina da golf prima che tocchi terra sia massima
Schematizzazione sulla base
di ipotesi esemplificative
Modello matematico: Legge di Newton
Metodo numerico: (la scelta è un arte)
Metodo di Eulero, di Runge-Kutta, …
Algoritmo
Soluzione numerica
La soluzione numerica è accettabile solo se si sanno stimare gli
errori da cui è affetta!!!
errori inerenti
errori di troncamento
stabilità
errori di arrotondamento
20
Possibili fonti di errori
1. Errore di misura: precisione dello strumento
(condizionamento)
2. Errore inerente: semplificazioni del modello reale
(interpretazione del risultato)
3. Errore di troncamento: discretizzazione, iterazioni
(dall’infinito al finito)
4. Errore di arrotondamento:
il calcolatore “lavora in precisione finita”
(il calcolatore non conosce i numeri reali
ogni numero è una sequenza finita di numeri interi (cifre))
Procedimento di calcolo e accuratezza del risultato
27
Sia
01
01
)(
1
0
x
xx
edtexf
x
xt
Supponiamo che x sia dato con precisione 10-9 x=1.4 10-9
714.0104.1
000000001.0
104.1
1000000001.1)(
99
xf
Si perde l’accuratezza della misura! Dell’ordine di 10-1
L’errore sul dato iniziale viene amplificato dal procedimento
di calcolo
28
Consideriamo lo sviluppo in serie di Taylor di f(x) in un intorno di 0
10 62
1 32
xexx
xex
L’errore dell’approssimazione
data dallo sviluppo in serie è
dell’ordine di 10^-28
Procedimento di calcolo e accuratezza del risultato
29
107.01102
4.1 1
2 1
1 )( 99
x
x
exf
x
L’errore sulla misura di f(x) ha lo stesso ordine di grandezza
dell’errore sulla misura di x
Procedimento di calcolo e accuratezza del risultato
30
Un numero reale x si può rappresentare come una sequenza
di infinite cifre decimali (rappresentazione in base 10)
Rappresentazione dei numeri
Ma più in generale, scelta una base β
con
31
Ma i calcolatori hanno una memoria finita:
•è possibile usare solo una sequenza finita di cifre
•i numeri sono rappresentati in virgola mobile o floating point
•i numeri sono in base binaria (β = 2) --- sequenza di 0 e 1 (bits)
mantissa base esponente
(virgola mobile normalizzata)
Base 2
54.75 = 110110.11 =
1.1011011⋅ 25
Base 10
265.87 = 2.6587⋅ 102
0.002658 = 2.658⋅ 10-3
Rappresentazione dei numeri
32
Conversione da base decimale a base 2: parte intera
•Dividere per 2 il numero e conservare il resto
•Ripetere il passo precedente sul quoziente fino a quando il
quoziente diventa 1
•Leggere i resti dall’ultimo al primo
Esempio: convertire il numero11 in base 2
Quoziente Resto
11 / 2 5 1
5 / 2 2 1
2 / 2 1 0
1 / 2 0 1
quindi, (11)10 =(1011)2 = 1⋅23+0⋅22+1⋅21+1⋅20
Rappresentazione dei numeri
33
Conversione da base decimale a base 2: parte frazionaria
• Moltiplicare per 2 il numero e conservare il numero intero del
risultato
• Ripetere il passo precedente sulla parte decimale del risultato
fino a quando diventa 0
• Leggere i numeri interi conservati dal primo all’ultimo
Esempio: convertire il numero 0.25 in base 2
Parte frazionaria Numero prima
della virgola
0.25 ⋅ 2 = 0.5 0.5 0
0.5 ⋅ 2 =1.0 0.0 1
quindi, (0.25)10 =(0.01)2 = 1⋅2-1+0⋅2-2
Rappresentazione dei numeri
34
Esercizio
Convertire in base 2 i seguenti numeri:
0.1875
37.25
128.000625
Rappresentazione dei numeri
35
Esercizio
Non tutti i numeri decimali possono essere rappresentati con un
numero finito di cifre in base binaria!
Consideriamo il numero 0.3
Parte frazionaria Numero prima
della virgola
0.3 ⋅ 2 = 0.6 0.6 0
0.6 ⋅ 2 = 1.2 0.2 1
0.2 ⋅ 2 = 0.4 0.4 0
0.4 ⋅ 2 = 0.8 0.8 0
0.8 ⋅ 2 = 1.6 0.6 1
La sequenza si ripete
infinite volte
(0.3)10 ≈ (0.01001)2 ≈ 0⋅2-1+1⋅2-2+0⋅2-3+0⋅2-4+1⋅2-5=0.28125
Rappresentazione dei numeri
36
Un numero in virgola mobile nella rappresentazione IEEE si scrive
mantissa normalizzata t bits segno s=1 bit
0 se +
1 se - esponente in [L,U] n bits
La scelta di n e t determina il numero massimo
rappresentabile e la sua precisione (numero di cifre decimali)
s e e e e e e e e a a a a a a a a a a a a a a a a a a a a a a a
t bits n bits s=1 bit
Rappresentazione dei numeri
37
Nel sistema IEEE
s n t Numero totale
di bits
Singola precisione 1 8 23 32
Doppia precisione 1 11 52 64
s e e e e e e e e a a a a a a a a a a a a a a a a a a a a a a a
t=23 bits n=8 bits s=1 bit
Rappresentazione dei numeri
38
Nel sistema IEEE
s n t Numero totale
di bits
Singola precisione 1 8 23 32
Doppia precisione 1 11 52 64
L’esponente e può essere sia positivo che negativo
si modifica in modo da memorizzare sempre un numero positivo
aggiungendo la quantità b = 0111…11 = 1+2+22…+2n-2= 2n-1-1
n bits
Rappresentazione dei numeri
39
Vogliamo ora stabilire quali sono i valori massimo U e minimo L
dell’esponente e
Allo 0 è associata la sequenza 0000..00 di n bits
mentre al NaN (Not a Number --- per esempio 0/0)
è associata la sequenza 111..11 di n bits
Quindi il massimo di e+ b è 111..11 - 000..01 = 111…10 da cui e ≤ 111..10 - 011..11 = 011..11 = b = U
Mentre il minimo di e + b risulta > 000..00 da cui e > -b ovvero e ≥ -b +000..01
quindi L=-(b-1)
Rappresentazione dei numeri
40
Per n= 8 b = 127, L = -126 U=127
-126≤ e ≤127
Per n= 11 b = 1023, L = -1022 U=1023
-1022≤ e ≤1023
Rappresentazione dei numeri
41
Alla mantissa sono riservati t bits e quindi la precisione è di t+1 (considerando la normalizzazione)
il più grande numero rappresentabile è
(1.111..11)⋅2U =(2-2-t) ⋅2U = 2U+1 (1-2-t-1)
mentre il più piccolo è (1.000..00)⋅2L = 2L
Per tutti i numeri al di fuori dell’intervallo [2L,2U+1 (1-2-t-1)] si ha
underflow oppure overflow
t bits
t bits
Rappresentazione dei numeri
Massimo (2U+1 (1-2-t-1)) Minimo (2L)
Singola precisione
(U=127, t=23, L=-126)
3.4 ⋅ 1038 1.2 ⋅ 10-38
Doppia precisione
(U=1023, t=52, L=1022)
1.79 ⋅ 10308 2.2 ⋅ 10-308
Esercizio:
Scrivere il numero 5.75 in formato IEEE in singola precisione
e il numero 765.25 in doppia precisione
Rappresentazione dei numeri
Esercizio: Scrivere il numero 5.75 in formato IEEE in singola precisione
1. Conversione del numero in base 2
5.75 = 101.11
2. Rappresentazione in virgola mobile normalizzata
101.11 1.0111 ⋅ 22
3. Somma 127 all’esponente e trasformalo in base 2:
e = 2+127 = 129 = 10000001
4. Scrivi mantissa: 1.01110000000000000000000
5. Determina il segno: + 0
6. Scrivi il numero completo: (-1)0 ⋅(1.01110000000000000000000) ⋅2129
Parte
fraz.
n. prima
della
virgola
0.75 ⋅ 2 = 1.5 0.5 1
0.5 ⋅ 2 = 1.0 0.0 1
Quoziente Resto
5 / 2 2 1
2 / 2 1 0
1 / 2 0 1
0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
s e e e e e e e e a a a a a a a a a a a a a a a a a a a a a a a
46
La rappresentazione dei numeri può essere molto costosa!!!
Gli errori di arrotondamento e la rappresentazione dei numeri
non possono essere trascurati in quanto possono alterare in
modo disastroso il risultato finale
47
Imperfezioni nello Intel Pentium (1994)
Il Pentium FDIV bug è stato scoperto dal prof. Thomas Nicely del
Lynchburg College nell'estate del 1994, quando, calcolando la costante di
Brun, si accorse che il risultato ottenuto era ben lontano da quanto stimato
teoricamente, anche considerando possibili errori di arrotondamento. Al
contrario, il calcolo effettuato su una macchina con processore 486 risultò
corretto. Il processore sbagliava a calcolare espressioni semplici quali
x (1 / x) in quanto i numeri erano dati con precisione fino alla quinta cifra decimale.
La Intel fu costretta a sostituire tutti i chip affrontando una spesa di circa
475 milioni di dollari.
La rappresentazione dei numeri può essere molto costosa!!!
48
Ariane 5 Il primo volo dell'Ariane 5 (giugno 1996) fallì e il razzo si autodistrusse
dopo 40 secondi dal lancio a causa di un malfunzionamento del software
di controllo.
Ci vollero 10 anni e 7 bilioni di dollari per realizzarlo.
Un dato a 64 bit in virgola mobile venne convertito in un intero a 16 bit
con segno.
Questa conversione causò una operazione errata (trap) del processore: il
numero in virgola mobile era troppo grande per poter essere
rappresentato con un intero a 16 bit. Questo errore scatenò una reazione
a catena che causò danni meccanici ai quali seguì l’azionamento del
comando di autodistruzione.
Fu necessario quasi un anno e mezzo per capire quale fosse stato il
malfunzionamento che aveva portato alla distruzione del razzo!
La rappresentazione dei numeri può essere molto costosa!!!
49
Missile Patriot Il 25/02/1991 durante la Guerra del Golfo un missile Patriot fallì
l’intercettazione di un missile Scud iracheno a causa di errori di
arrotondamento.
Questo errore costò la vita a 28 soldati!
Il Patriot usava un’aritmetica a 24 bit; il tempo era memorizzato
dall’orologio interno in decine di secondi e quindi diviso per 10 per
ottenere i secondi.
Ma 1/10 in base 2 ha una rappresentazione periodica:
0.00011001100110011001100……..
La memorizzazione delle prime 24 cifre causò un errore di circa
0.000000095 secondi, che dopo cento ore introdusse un errore di 0.3483
secondi che causò un errore di 687 m sulla stima della posizione del
missile Scud
La rappresentazione dei numeri può essere molto costosa!!!
53
Cancellazione numerica
Esercizi:
•Calcolare le radici dell’equazione di secondo grado x2-26x+1 lavorando con 5 cifre significative. Discutere i risultati
•Stabilire se per i numeri a=15.6 e b=15.7 vale la relazione
(a-b)2=a2-2ab+b2 lavorando con 3 cifre decimali esatte
54
Supponiamo di voler calcolare la somma di n numeri
decimali lavorando con 4 cifre significative
Per esempio, si vuole valutare nel punto x=-5 usando n+1
termini del suo sviluppo in serie di Taylor
1
n
k kn xS
n!
(-5).....
2!
(-5)
1!
(-5)1
n25- e
xe
Cancellazione numerica
55
0.006738 5 e mentre usando l’espressione precedente
al variare di n si ha grado Termine della
serie
Somma della
serie
0 1.000 1.000
1 -5.000 -4.000
2 12.50 8.500
3 -20.83 -12.33
4 26.04 13.71
5 -26.04 -12.33
6 21.70 9.370
7 -15.50 -6.130
… … …
… … …
Cancellazione numerica
56
0.006738 5 e mentre usando l’espressione precedente
al variare di n si ha grado Termine della
serie
Somma della
serie
16 0.7293E-1 0.1166
17 -0.2145E-2 0.009518
18 0.5958E-3 0.01011
19 -0.1568E-3 0.009932
20 0.3920E-3 0.009916
21 0.9333E-5 0.009912
22 0.2121E-5 0.009911
23 0.4611E-6 0.009911
24 0.9607E-7 0.009911
25 0.1921E-7 0.009911
Cancellazione numerica
57
3679.01
e
Calcolando, invece, prima
e poi moltiplicandolo per se stesso 5 volte si ha
che risulta prossimo a
|0.006738-0.006736|=2⋅10-6
0.006736 11
111
eeeee
0.006738 5 e
10 2.90.006738
|0.006736-0.006738| 4-
Cancellazione numerica
58
Considerare tre forme equivalenti di uno stesso polinomio:
Stabilire se, valutate al calcolatore in uno stesso punto,
forniscono lo stesso risultato
Esercizio
Cancellazione numerica
59
Propagazione degli errori di arrotondamento
Sia fl(x) il numero x rappresentato in floating point e arrotondato e
l’errore corrispondente
Sia fl(y) il numero y rappresentato in floating point e arrotondato e
l’errore corrispondente
Errore del prodotto exy:
fl(x)fl(y)=x(1+ex) y(1+ey) = xy (1+ex+ey+exey) ≈ xy (1+ex+ey)
)(
x
xxflex
)(
y
yyfley
exy
)1()( xx exxxexfl
)1()( yy eyyyeyfl
60
Errore della divisione ex/y:
ex/y
)1( ...)1)(1( )1(
)1(
)(
)( 2
yxyyx
y
x eey
xeee
y
x
ey
ex
yfl
xfl
Errore della somma ex+y:
1)( )1()1(
)()(
eyx
ye
yx
xyxyeexyxeyex
yflxfl
yxyxyx
ex+y
Se xy>0 allora |ex+y|≤ |ex|+|ey|
Se xy<0 le quantità possono essere molto grandi e yx
y
yx
x
Propagazione degli errori di arrotondamento
Per esempio, è accettabile un errore relativo che cresce
secondo la legge lineare
con c0 non molto grande
Mentre l’algoritmo è instabile se la crescita dell’errore è di
tipo esponenziale; per esempio
Stabilità di un algoritmo
00ne cen
63
00e ce n
n
Esercizio :
Mostrare che
non è adatto per il calcolo del seguente integrale
Propagazione dell’errore di arrotondamento
0)5
6log(
051
1
n
nInI
n
n
5
1
0
dx
x
xI
n
n
70
La funzione integranda è non negativa nell’intervallo di
integrazione. Inoltre
come si osserva anche dal grafico della funzione integranda
05
1
0
1
0
dxxdxx
x nn
71
Propagazione dell’errore di arrotondamento
Avendo solo un errore di arrotondamento sul dato iniziale
I0 = log(6/5) , risulta
)1()(~
0000 IIflI
001
00
2
200
2
112
0010000001
)5(~
51~
.
.
5)5(52
1~5
2
1~
55)51()1(51~
51~
IIIn
I
IIIIII
IIIIIII
n
nnn
Cresce in
valore assoluto
al crescere di n
73
Propagazione dell’errore di arrotondamento
0348)5(
1054.9)5(
20
10 2.
00
20
1320
-10
0
I
n
Dopo 20 passi l’errore è dell’ordine delle centinaia e la misura
dell’integrale è inattendibile 74
Propagazione dell’errore di arrotondamento
77
• Se il problema è molto sensibile alle variazioni dei
dati di input, allora nessun algoritmo, anche se
robusto e stabile, può dare una soluzione robusta
e stabile al problema
80
Studiare il condizionamento delle seguenti funzioni
0,0 ,)(
1
2)(
1)(
)log()(
)sin()(
)(
2)(
/1
2
2
xxxf
x
xxf
xxxf
xxf
xxf
xxf
xxf
Esercizi
81
Riferimenti bibliografici L. Gori Calcolo Numerico
Cap. 1. Par. 1.1, 1.2, 1.3, 1.4, 1.5 (escluso caso bidimensionale e condizionamento del calcolo di una radice), 1.6 (concetto di stabilità ed esempio 1.6.1)
83
Per risolvere numericamente un problema è necessario
1. Comprendere il problema da risolvere
2. Costruire un algoritmo stabile, robusto ed efficace
3. Conoscere lo strumento computazionale utilizzato (per
es. il calcolatore elettronico)
84
Il computer è diventato uno strumento di calcolo molto potente che ha
favorito lo sviluppo di metodi numerici e algoritmi sempre più sofisticati e
potenti in grado di affrontare problemi complessi
SOLUZIONE
Metodi elaborati e complicati per
rendere il problema trattabile
SOLUZIONE
Metodi (anche elaborati e complicati)
facili da usare
Formulazione del problema
Prima Dopo
INTERPRETAZIONE
Analisi approfondita limitata da
soluzioni troppo costose
(in termini di tempo di calcolo)
INTERPRETAZIONE
La facilità di calcolo favorisce:
- sviluppo e verifica di intuizioni
- simulazioni
- studio della sensibilità del sistema
85
Risolvere un problema con il calcolatore
• Descrivere il
problema
• Individuare le
informazioni e i
dati noti (input) e i
risultati desiderati
(output)
• Individuare
un metodo
risolutivo
adeguato
• Scomporre il
procedimento in
una sequenza di
azioni elementari e
univoche
(algoritmo)
• Scrivere un programma:
esprimere le istruzioni con un
opportuno formalismo
(linguaggio di programmazione)
comprensibile all’ elaboratore
86
Problema
Algoritmo
Programma Dati di input Dati di output
Risolvere un problema con il calcolatore
87
La programmazione è l’attività con cui si predispone l’elaboratore ad
eseguire un insieme di azioni elementari su un insieme di dati di
ingresso al fine di risolvere un certo problema
(la soluzione è data in forma di dati di output)
Il programma è quindi la formulazione testuale di un algoritmo in un
linguaggio di programmazione
L’ algoritmo è un insieme finito di istruzioni elementari
univocamente interpretabili che, eseguite in un ordine stabilito,
forniscono la soluzione ad un problema in un numero finito di passi
Alcune definizioni
88
• Eseguibilità: ogni istruzione deve poter essere eseguita dalla
macchina
• Non ambiguità: ogni azione deve essere univocamente
interpretabile
• Finitezza: il numero totale di azioni da eseguire per ogni insieme
di dati deve essere finito
Proprietà di un algoritmo
89
Problema: si vuole trasportare un lupo, una capra e un cavolo
da una sponda all’altra di un fiume senza «perdere i
passeggeri»
Algoritmo:
1. Trasporta la capra sull’altra sponda
2. Torna indietro
3. Trasporta il cavolo sull’altra sponda
4. Torna indietro portando anche la capra
5. Lascia la capra e Trasporta il lupo sull’altra sponda
6. Torna indietro
7. Trasporta la capra sull’altra sponda
Esempi di algoritmi
90
Problema: si vuole calcolare il massimo tra due numeri a e b e
assegnarlo alla variabile m
Algoritmo:
1. Leggi il valore di a e b
2. Se a > b allora poni m=a
altrimenti poni m=b
3. Output: m
Esempi di algoritmi
91
Problema: moltiplica per 2 ogni elemento di un insieme L
Algoritmo:
1. Leggi L
2. Per ogni elemento k dell’insieme L, poni k=2*k
3. Output: L
Esempi di algoritmi
92
Problema: si vuole calcolare il massimo di un insieme L di
numeri e assegnarlo alla variabile m
Algoritmo:
1. Leggi L
2. Seleziona il primo elemento dell’insieme L e ponilo in m
3. Per ogni elemento k dell’insieme, se k > m allora poni m=k
4. Output: m
Esempi di algoritmi
93
Ogni algoritmo è una combinazione di strutture
Ogni struttura ha un unico punto di ingresso e un unico punto di uscita
TEOREMA DI BOEHM-JACOPINI:
Un qualunque algoritmo può essere descritto unicamente attraverso le
tre strutture:
• Sequenza
• Diramazione
• Ciclo o Iterazione
Teorema di Boehm-Jacopini
94
Sequenza: costituita da istruzioni di lettura e scrittura, istruzioni di
assegnazione (leggi, scrivi, assegna,…)
Diramazione: permette di eseguire certe istruzioni al verificarsi di una
certa condizione; oppure di eseguire certe istruzioni al
verificarsi di una certa condizione ed altre istruzioni se
non si verifica (Se …. Allora …. Altrimenti)
Ciclo: è una struttura che permette di ripetere una o più operazioni in
sequenza per un numero finito di volte. La ripetizione del
gruppo di istruzioni soggette alla iterazione (o ciclo) è soggetta
al verificarsi di una certa condizione ed il controllo su di essa
può essere in testa alla struttura oppure in coda alla stessa
(Per ogni elemento fai/esegui…. Finché…. esegui…)
Teorema di Boehm-Jacopini
95
Stabilire se un numero N è un quadrato perfetto
INIZIO
Leggi il numero N
Calcola la radice quadrata di N e assegna a Q il risultato
Calcola la parte intera di Q e assegna a Y il risultato
Se Y2 = N allora visualizza il messaggio ‘N è un quadrato perfetto’
altrimenti visualizza il messaggio ‘N non è un quadrato perfetto’
FINE
Esempio
96
Si consideri la successione definita come segue
xn = a xn-1, n0
con a parametro reale. Stampare 100 elementi della successione con
x0 valore assegnato
INIZIO
Leggi x0, a
Esegui 100 volte le seguenti istruzioni
Calcola il prodotto a⋅x0 e assegna a x1 il risultato
Stampa x1
Assegna a x0 il valore di x1
FINE
Esempio
97
Si consideri la successione definita come segue
xn = a xn-1, n0
con a parametro reale assegnato.
Assegnati x0 e M,
se a<1, stampare gli elementi della successione tali che xn>aMx0;
se a>1, stampare gli elementi della successione tali che xn<aMx0;
se a=1, stampare il messaggio ‘la successione ha tutti gli elementi
uguali a x0’
Esempio
98
Scrivere un algoritmo e il relativo diagramma di flusso per risolvere i
seguenti problemi:
1. Risolvere l’ equazione lineare di primo grado ax-b=0 2. Calcolare le radici di una equazione di secondo grado
3. Calcolare il fattoriale di un numero intero n 4. Approssimare il valore di ex in un punto x0 con i primi n termini dello
sviluppo in serie di Mac Laurin
5. Trovare gli elementi maggiori di zero di un insieme ordinato di
numeri
6. Trovare gli elementi maggiori di zero di un insieme non ordinato di
numeri
7. Calcolare la media aritmetica degli elementi di un vettore di numeri
8. Calcolare la media aritmetica degli elementi di una matrice di numeri
Esercizi
99
• Risolvere l’ equazione lineare di primo grado ax-b=0
Start
1. Leggi a e b
2. Se a0 allora poni x=b/a
output: x
altrimenti se b 0 allora stampa ‘equazione impossibile’
altrimenti stampa ‘equazione indeterminata’
Stop
Esercizi
100
• Calcolare le radici dell’ equazione di secondo grado ax2+bx+c=0
Start
Leggi a, b e c
Se a=0 allora stampa ‘equazione di primo grado’
altrimenti poni D = b⋅b-4 ⋅ a ⋅ c
se D < 0 allora stampa ‘non esistono radici reali’
altrimenti se D=0 allora poni x1=-b/(2 ⋅ a)
Output: x1
altrimenti poni x1=(-b-sqrt(D))/(2 ⋅ a)
poni x2=(-b+sqrt(D))/(2 ⋅ a)
Output: x1, x2
Stop
Esercizi
101
Calcolare il fattoriale di un numero intero n
Start
Leggi n
Poni f = 1
Finché n1 esegui le seguenti istruzioni
poni f = f ⋅ n
poni n = n-1
Output: f
Stop
Esercizi
102
Approssimare il valore di ex in un punto x0 con i primi n termini dello sviluppo in
serie di Mac Laurin
Start
1. Leggi n e x0
2. Se n>0 allora
poni T=1
poni i =1
Finché i<n esegui le seguenti istruzioni
calcola il fattoriale di i e assegna ad f il risultato
assegna a T il valore T+x0i / f
incrementa i di una unità
Output T
altrimenti stampa il messaggio ‘n deve essere un numero positivo’
Output: f
Stop
Esercizi
Esercizi:
- generalizzare al caso di sviluppo in serie di Taylor attorno ad
un punto y assegnato
103
Due algoritmi sono equivalenti se:
• hanno le stesse variabili di input
• hanno le stesse variabili di output
• in corrispondenza degli stessi valori delle variabili di input producono gli
stessi valori delle variabili di output
Algoritmi equivalenti:
• possono avere differente efficienza (velocità e risparmio di risorse)
• possono essere profondamente diversi
Osservazioni:
• Un algoritmo semplice può essere meno efficace, soprattutto in
termini di velocità
• La semplicità può facilitare la comprensione e la correzione
• Non necessariamente un algoritmo “furbo” è più efficiente o affidabile
Algoritmi equivalenti
104
Linguaggi di programmazione
Un linguaggio di programmazione è un linguaggio formale
costituito da simboli (alfabeto), combinati in sequenze in base
a regole precise (sintassi) e a cui viene associato un
determinato significato (semantica)
• Con il termine sintassi si intende l’insieme delle regole che consentono
di legare gli elementi lessicali (parole, simboli, punteggiatura, etc.) in
modo da comporre enunciati dotati di senso nell’ambito del linguaggio
• Le regole sintattiche (o grammaticali) si propongono di collegare gli
enunciati semplici producendo enunciati composti
• La semantica disciplina il significato da attribuire alle costruzioni
linguistiche
105
Esistono diverse famiglie di linguaggi di programmazione:
• Linguaggi assembler
• Linguaggi funzionali
• Linguaggi imperativi (BASIC)
• Linguaggi a oggetti (Java) etc…
Linguaggi di programmazione
106
• Primi calcolatori (anni ‘40): istruiti ad eseguire una certa azione,
utilizzando un codice costituito solo dalle cifre binarie (bit) 0 e 1
I linguaggi consentono di descrivere le operazioni da far compiere al
calcolatore in maniera più semplice
• Linguaggi di tipo assembler (assemblatori): basati su semplici
forme mnemoniche che attribuiscono una sequenza di caratteri al
codice operativo in linguaggio macchina
• Linguaggi di programmazione ad alto livello (Fortran, C/C++,
Basic, Pascal, ….): evoluti in direzione dell’utente con la
definizione di standard in modo che un programma potesse
essere eseguito su diversi tipi di calcolatore senza cambiamenti
significativi
Linguaggi di programmazione
107
Ma la macchina utilizza esclusivamente l’alfabeto binario!
E’ necessaria un’operazione di traduzione dal codice scritto secondo
un linguaggio di programmazione (codice sorgente) al codice
comprensibile dal calcolatore (codice oggetto)
Tale operazione è effettuata per mediante opportuni programmi,
detti traduttori
I traduttori si dividono in due categorie:
• compilatori: la traduzione viene eseguita una volta sola ed è
permanente --- si produce il codice oggetto (file eseguibile) da cui
non è facile risalire al codice sorgente
• interpreti: la traduzione è necessaria ogni volta che intendiamo
usare un programma
Linguaggi di programmazione
108
Variabili
I calcolatori utilizzano esclusivamente numeri, mentre il linguaggio
gestisce più facilmente i nomi
I linguaggi di programmazione permettono di fare riferimento ai dati
utilizzando dei nomi, detti variabili
Una variabile è un contenitore etichettato da un nome e
caratterizzato da un contenuto
Il contenuto di una variabile può cambiare !
pluto
109
Variabili
Il contenuto di una variabile può cambiare a seguito di una
assegnazione
pluto
pluto
il contenuto della variabile
è il numero decimale 5.7
pluto := 5.7 5.7
il contenitore è vuoto
pluto
pluto := 5.7*5
il contenuto della
variabile ora è il
numero decimale 38.5
38.5
110
Variabili e Tipi di dato
Il contenuto di una variabile in un calcolatore è una sequenza di bit
è necessario determinare quale valore contiene la variabile (interpretare
la sequenza di bit)
I linguaggi di programmazione associano ad ogni variabile informazioni
anche sul tipo di valore che essa contiene
L’attribuzione di un significato particolare alla sequenza binaria è fatto
attraverso il concetto di tipo di dato
111
Un insieme minimo di tipi di dato può essere composto da:
• numeri interi • numeri in virgola mobile • caratteri
Una stringa è rappresentabile come una sequenza di caratteri
E’ possibile convertire un dato da un tipo ad un altro
Nei linguaggi di programmazione ad alto livello esistono
tipi di dato predefiniti Nei linguaggi di programmazione ad alto livello è possibile definire tipi
di dato per rappresentare informazioni specifiche per una data
applicazione
Variabili e Tipi di dato
112
Variabili e Tipi di dato: vettori
Un vettore è un insieme ordinato di variabili dello stesso tipo
Ogni elemento del vettore è caratterizzato dalla posizione
Esempio:
v = [2, 14, 13, 44, 142, -2]
v(3) = 13
v(6) = -2
Una matrice è un “vettore di vettori” Ogni elemento è caratterizzato dalla posizione: (indice riga, indice colonna)
Si possono definire anche vettori n-dimensionali