Scientifico
Lezione N. 1
Luca Formaggia
MOX
Dipartimento di Matematica F. Brioschi
Politecnico di Milano
A.A. 2011/2012
1/1
Aule e orari
2/1
Docenti
I
3/1
4/1
Modalit di esame
Corso da 8 crediti
I
5/1
Supporto informatico
I portali del corso sono
http://corsi.metid.polimi.it
e
www2.mate.polimi.it:8080/CN/PACS
Liscrizione al portale METID necessaria per accedere ai tutti i
servizi.
Il sistema operativo di riferimento Linux, i compilatori di
riferimento sono i compilatori gnu versione 4.x. Utilizzeremo il
softare eclipse come strumento di sviluppo (IDE) (scaricabile dal
sito www.eclipse.org) Un altra IDE utilizzabile Code::Blocks
(www.codeblock.org).
Sul portale PACS si trovano informazioni su Linux e su Windows.
6/1
7/1
8/1
9/1
Fenomeno Fisico
Osservazione Sperimentale
Modello Concettuale
Modello Matematico
Leggi di Conservazione
Equazioni Differenziali
Modelli Statistici
Programmazione
00
11
00
11
000
111
Linguaggio di programmazione
Implementazione dellalgoritmo
Strutture dati
Ottimizzazione
Analisi
Buona posizione
Propriet della soluzione
Soluzione analitica
Analisi Numerica
Metodi di discretizzazione
Stima dellerrore
Analisi degli algoritmi
PostProcessing
Visualizzazione
Analisi dei risultati
CALCOLO SCIENTIFICO
10/1
Dallalgoritmo al risultato
CODIFICA
Algoritmo
Risultati
POST
PROCESSING
COMPILAZIONE
Programma
Sorgente
Codice
Macchina
11/1
Implementazione di un linguaggio
I
12/1
Compilazione
prog.cc
g++ c prog.cc
Linking
prog.o
g++ o prog prog.o
lblas lX
Preprocessing
Esecuzione
prog
prog
check
librerie statiche
libblas.a
Loader
librerie dinam.
libX.so
system libraries
13/1
Tipi di programmazione
Programmazione Procedurale.
I dati vengono elaborati da procedure (comandi o funzioni) che ne
modificano lo stato operando (tipicamente) in modo sequenziale.
Programmazione ad oggetti.
I dati sono encapsulati in strutture apposite (classi). Si opera sui
dati tramite metodi della classe. Laccesso diretto ai dati
normalmente proibito.
Programmazione generica.
Si opera su tipi di dati differenti (ma che soddisfano pre-requisiti
opportuni) usando la stessa interfaccia.
14/1
Programmazione procedurale
Esempio in MATLAB
A=gallery(poisson,100); b=ones(100,1);
[L,U]=lu(A) y=L\b;
x=U\y;
15/1
Programmazione ad oggetti
Esempio in C++
class Matrix{public:
Matrix(string filename);
Vector solve(Vector const & b);
private:
double * dati;}
...
Matrix A(file.dat);Vector b;
Vector x;
x=A.solve(b);
..
Non si pu accedere direttamente a dati.
16/1
Programmazione generica
Esempio in C++
template<class T> T sqrt(T& x);
...
int main(){
float x; int y; complex z;
flot rx; int ry, complex rz;
rx=sqrt(x); // usa sqrt<float>
ry=sqrt(y); // usa sqrt<int>
rz=sqrt(z); // usa sqrt<complex>
...}
La funzione sqrt<T>(T &) si applica a ogni tipo T purch esso
soddisfi opportuni prerequisiti stabiliti dal programmatrore (p. es.
x > 0 per dati float e int).
17/1
Programmazione generica
Un secondo Esempio
template<class T> class Vector {...}
class triangle {...}
int main(){
Vector<float> a;// Un vettore di float
Vector<triangle> b;// Un vettore di triangle ...
triangle t=b[2]; ...}
18/1
Il linguaggio C++
I
19/1
Pascal
Fortran
20/1
I
I
I
Core Language
<i
str
e
<vector>
h>
am
>
umfpack.h
libumfpack.a
libblas.so
at
External
Libraries
STANDARD LIBRARY
m
<c
fem.h
libfem.a
<s
g>
trin
23/1
esempio_ch1
#include <iostream> // include il modulo per li/o
// della libreria standard
int main() {
using namespace std; \\rende visibili i nomi della STL
int n, m; // n e m sono 2 interi
cout Dammi due interi: endl;
cin n m;
if (n > m) {
int temp = n; n = m;
m = temp; }
double sum = 0.0;
for (int i = n; i <= m; i++)
sum += i;// sum += i significa sum = sum + i;
cout Somma= sum endl;
}
24/1
la direttiva include
#include<iostream>
using namespace std;
Il linguaggio C++ consiste in un insieme di istruzioni di base (core
language) e estensioni le cui definizioni possono essere richiamate
con in comando #include<XXX> dove XXX un header file.
In particolare la libreria standard (Standard template library o STL)
mette a disposizione il modulo iostream per li/o, che definisce
(tra laltro) std::cin e std::cout per li/o da tastiera/terminale.
using namespace std; permette di omettere il qualificatore
(scope qualifier) std:: ai nomi di introdotti dal modulo iostream.
25/1
Il programma principale
int main() {
....
for (int i = n; i <= m; i++) a[i]=i;
}
Per produrre un eseguibile il sorgente del programma deve contenere
uno e un solo main() (programma principale o main program).
In C++ il main ritorna sempre un intero (int) e pu prendere in
ingresso due argomenti (si veda lesercitazione) oppure nessuno,
come in questo caso.
Le istruzioni (statement) terminano sempre con il punto e virgola
(;) che funge da separatore. Non vi un formato predefinito, a
differenza di Python o del Fortran77.
26/1
Le variabili
int n, m;
float x, y;
Triangle t; ...
for (int i = n; i <= m; i++)
27/1
Identificatori
28/1
29/1
Linput/output (formatted)
#include <iostream>
..
std::cout Dammi due interi: std::endl;
std::cin n m;
Uno stream pu essere immaginato come una sorgente o un
pozzo di dati (tipicamente caratteri), usualmente associati a
lettura/scrittura da file o teminale.
La standard template library attraverso il modulo iostream mette
a disposizione 4 stream per i/o da/su terminale:
std::cin
std::cout
std::cerr
std::clog
Standard
Standard
Standard
Standard
Input (buffered)
Output (buffered)
Error (unbuffered)
Logging (default = cout)
30/1
Tipi di variabili
I principali tipi nativi forniti dal linguaggio sono
float
Numero reale in singola precisione (4 bytes)
double
Numero reale in doppia precisione (8 bytes)
long double Numero reale in precisione estesa (8 o 16 bytes)
int
Intero con segno (tip. 4 bytes)
short int
Intero corto con segno (tip. 1 byte)
long int
Intero esteso con segno (tip. 8 bytes)
bool
Variabile logica (impl. dip.)
char
Carattere (1 byte)
unsigned
31/1
32/1
base (tipicamente 2)
mantissa, 0 m t 1
t
e
precisione
esponente, emin e emax
Analogamente
y = 0.d1 d2 ...dt e
d1 6= 0,
0 di 1
0 < m < t1
33/1
Arrotondamento
Un numero reale x range(F ) rappresentato nel computer da
x = fl (x) F e |x x|/x lerrore di arrotondamento (relativo).
Se x range(F ) allora x = fl (x) F e
x x
= ,
x
1
con || u = 1t
2
34/1
Aritmetica IEEE
Lo standard IEEE 754 stato definito nel 1985 e definisce un
sistema aritmetico a virgola mobile oramai comunemente
implementato nei normali microprocessori. Definisce due tipi
principali di floating point: singola precisione (float) e doppia
precisione (double).
Type
Size
Range
float
double
32
64
23 + 1
52 + 1
8
11
224
253
1038
10308
op = + , /
35/1
Numeri speciali
Lo standard IEEE stabilisce che
fl (x) = 0 se|x| < Fmin
(UNDERFLOW)
(OVERFLOW)
36/1
|y |
Il backward error (relativo) e definito da y = f (x(1 + Delta)). Se
f C 2 ha che
y y
= c(x) + O((x)2 )
y
|c(x)| detto numero di condizionamento. Normalmente ne viene
fornita una stima
C (x)||
37/1
Un esempio: la cancellazione
|a b|
|a| + |b|
|a| + |b|
y y
|=
C =
y
|a b|
|a b|
|a b|
38/1
b b2 4ac
x1,2 =
2a
39/1
char p=A;
char q=\n;
Un carattere individuato da gli apici singoli. Vi sono dei caratteri
speciali, quali \n. Questultimo indica andare a capo (carriage
return).
Una variabile char contiene un singolo carattere. Vedremo in
seguito come trattare le stringhe di caratteri.
40/1
bool
bool l=true;
bool s;int a=5;
s= (a==5); //s pari a true
La variabile bool pu assumere solo due valori, vero o falso,
indicati dalle due parole riservate true e false. Si pu usare in
alternativa 1 e 0.
Le variabili bool vengono usualmente utilizzate per memorizzare il
risultato di espressioni logiche.
41/1
Principali operazioni
i=g+g; La somma (+), moltiplicazione (*) etc. sono definite per
tutti i tipi numerici.
a=pow(3.5,4). (3.5)4 . Richiede <cmath>.
a*=5. Equivalente a a=a*5. Ma pi efficiente. In generale op ha
anche lequivalente op=
++i e i++. Preincremento e post-incremento. Entrambe pari a
i = i + 1 ma la seconda ritorna il valore di i prima dellincremento.
--i e i--. Come sopra ma decrementando di 1.
Operatori logici: &&, || e !.
Test logici: ==, !=, <, <= etc.
42/1
43/1
Inizializzazione di variabili
Per i tipi nativi la dichiarazione implica anche listanzazione della
variabile (a meno che non si usi la keyword extern) e
linizializzazione (a meno che la variabile non sia membro di una
struct o classe)
extern int z; Dichiarazione
int a; Dichiarazione (e istanziazione/inizial.)
float b=3.14; Inizializzazione
float c(3.14); Inizializzazione
float e=atan(1)*4; Inizializzazione
long int=3L; Inizializzazione
a=10; Assegnazione
Nota: Non assumere mai che una variabile sia inizializzata
automaticamente a un valore: inizializzatela sempre esplicitamente.
44/1
45/1
` compilazione
Unitdi
46/1
if (n > m) {
...Blocco di istruzioni
}...
for (int i = n; i <= m; i++) sum+=i
47/1
Ciclo for
for(init;test;update) {
corpo (body)
..}
init una istruzione che viene eseguita allinizio del ciclo,
tipicamente per inizializzare una variabile locale, per esempio int
i=0.
test. Una espressione logica che viene eseguita allinizio del corpo
del ciclo. Se vera le istruzioni nel corpo vengono eseguite. Es.:
i<10.
update una istruzione che viene eseguita alla fine del corpo del
ciclo. Es.: ++i.
Le variabili definite nel ciclo sono locali al ciclo:
i=90;
for(int i=0;i<=10;++i) ...
couti; // i qui vale 90
48/1
49/1
Conversioni particolari
int a=5; char A=A
bool c=bool(a); non serve la conver. esplicita
float b=3.14;
c=b; c pari a true
a=A; a il codice ASCII di A
50/1
51/1
52/1
53/1
Visibilit ed esistenza
55/1
Array (monodimensionali)
double a[5]={1.6,2.7,3.4,7,8};
b=a[0]+a[3];//b vale 8.6
int c[2]; c[0]=7; c[1]=8;
In C++ gli array vengono indirizzati a partire da 0 usando
loperatore [].
Unalternativa: usare i vector<> della Standard Template Library
#include <vector>
vector<double> a;
a.push_back(1.6)\1.6 -> a[0]
56/1
vector<T>
I vector della standard library sono un esempio di template di cui
parleremo estensivamente in una prossima lezione.
Sono dei contenitori generici che implementano lindirizzamento
diretto tramite loperatore [].
#include <vector>
using std::vector
vector<unsigned int> a(5);
a[2]=9;
...
a[0]+=a[2];
...
57/1