Laboratorio di trattamento numerico dei dati sperimentali
A.A. 2025/2026
Obiettivi formativi
L'insegnamento si propone di fornire agli studenti una introduzione alle principali tecniche numeriche utilizzate in fisica. Si discutono funzioni e comandi del sistema operativo, alcune tipologie di strutture di dati (in particolare quelle offerte dalla libreria standard C++), tecniche numeriche per il calcolo di integrali, soluzione di equazioni differenziali e alcuni esempi di metodi basati sulla generazione di numeri casuali. Particolare enfasi viene posta sulla comprensione approfondita dei vantaggi e delle limitazioni delle tecniche numeriche presentate. Il linguaggio di programmazione utilizzato e' il C++ di cui si studiano le caratteristiche principali come ereditarietà, incapsulamento e polimorfismo, nel modello di progettazione e programmazione orientato agli oggetti (OO).
Risultati apprendimento attesi
Lo studente al termine dell'insegnamento avrà acquisito le seguenti abilità:
1) saprà interagire con il sistema operativo UNIX, in particolare nelle sue funzioni di lettura, scrittura e immagazzinamento dei dati.
2) saprà scrivere codice in C++ per acquisire e/o analizzare dati sperimentali e calcolarne i principali stimatori statistici.
3) sarà in grado di implementare nel linguaggio C++ alcuni algoritmi numerici come la ricerca di zeri di una funzione, il calcolo di integrali e la risoluzione di equazioni differenziali.
4) saprà scrivere un codice numerico in C++ per affrontare alcuni semplici problemi di meccanica ed elettrostatica.
5) sarà in grado di costruire un generatore di numeri casuali e di comprenderne funzionamento e limitazioni.
6) saprà utilizzare la generazione di numeri casuali per costruire algoritmi di soluzione di integrali mono e multidimensionali.
7) saprà utilizzare la generazione di numeri casuali per costruire simulazioni numeriche di apparati sperimentali studiando la propagazione delle incertezze sistematiche connesse alla misura.
1) saprà interagire con il sistema operativo UNIX, in particolare nelle sue funzioni di lettura, scrittura e immagazzinamento dei dati.
2) saprà scrivere codice in C++ per acquisire e/o analizzare dati sperimentali e calcolarne i principali stimatori statistici.
3) sarà in grado di implementare nel linguaggio C++ alcuni algoritmi numerici come la ricerca di zeri di una funzione, il calcolo di integrali e la risoluzione di equazioni differenziali.
4) saprà scrivere un codice numerico in C++ per affrontare alcuni semplici problemi di meccanica ed elettrostatica.
5) sarà in grado di costruire un generatore di numeri casuali e di comprenderne funzionamento e limitazioni.
6) saprà utilizzare la generazione di numeri casuali per costruire algoritmi di soluzione di integrali mono e multidimensionali.
7) saprà utilizzare la generazione di numeri casuali per costruire simulazioni numeriche di apparati sperimentali studiando la propagazione delle incertezze sistematiche connesse alla misura.
Periodo: Primo semestre
Modalità di valutazione: Esame
Giudizio di valutazione: voto verbalizzato in trentesimi
Corso singolo
Questo insegnamento può essere seguito come corso singolo.
Programma e organizzazione didattica
Edizione unica
Responsabile
Periodo
Primo semestre
Programma
Durante l'insegnamento si presentano alcune tecniche numeriche per affrontare problemi fisici di interesse. Il linguaggio di riferimento per l'implementazione di queste tecniche è il C++ di cui si approfondiranno le principali caratteristiche sintattiche.
Gli argomenti trattati nel dettaglio saranno :
1) Analisi dati sperimentali : lettura dati da un file, analisi statistica elementare e visualizzazione dei dati raccolti.
- Richiami sugli elementi base del linguaggio C ( tipi di dati, strutture di controllo )
- Introduzione alla programmazione orientata agli oggetti, il concetto di classe
- Classi e funzioni template
- Contenitori di dati e algoritmi: contenitori elementari, contenitori STL (vector, list e map) e algoritmi (algorithm.h)
2) Esercizi su approccio object oriented: calcolo di campi elettrici e gravitazionali
- classi derivate, classi a derivazione multipla. incapsulamento.
3) Metodi di ricerca di zeri di una funzione: algoritmo di bisezione, metodo delle secanti e di Newtown. Performance e limitazioni.
- metodi virtuali, classi astratte e polimorfismo
4) Tecniche di quadratura numerica : metodo midpoint, metodo dei trapezi e di Simpson. Stima dell'errore nel calcolo di un integrale con tecniche numeriche.
5) Soluzione di equazioni differenziali ordinarie. Metodi ad un passo (Eulero e Runge-Kutta). Applicazione a vari sistemi fisici : pendolo, oscillatore armonico forzato e smorzato. Analisi dell'errore.
6) Richiami di teoria delle probabilità, variabili casuali e teorema del limite centrale. Generatori di numeri casuali per distribuzione uniforme, esponenziale e gaussiano. Metodo della funzione inversa e accept/reject. Metodi Monte Carlo per l'integrazione di una funzione e per la simulazione di apparati sperimentali.
Gli argomenti trattati nel dettaglio saranno :
1) Analisi dati sperimentali : lettura dati da un file, analisi statistica elementare e visualizzazione dei dati raccolti.
- Richiami sugli elementi base del linguaggio C ( tipi di dati, strutture di controllo )
- Introduzione alla programmazione orientata agli oggetti, il concetto di classe
- Classi e funzioni template
- Contenitori di dati e algoritmi: contenitori elementari, contenitori STL (vector, list e map) e algoritmi (algorithm.h)
2) Esercizi su approccio object oriented: calcolo di campi elettrici e gravitazionali
- classi derivate, classi a derivazione multipla. incapsulamento.
3) Metodi di ricerca di zeri di una funzione: algoritmo di bisezione, metodo delle secanti e di Newtown. Performance e limitazioni.
- metodi virtuali, classi astratte e polimorfismo
4) Tecniche di quadratura numerica : metodo midpoint, metodo dei trapezi e di Simpson. Stima dell'errore nel calcolo di un integrale con tecniche numeriche.
5) Soluzione di equazioni differenziali ordinarie. Metodi ad un passo (Eulero e Runge-Kutta). Applicazione a vari sistemi fisici : pendolo, oscillatore armonico forzato e smorzato. Analisi dell'errore.
6) Richiami di teoria delle probabilità, variabili casuali e teorema del limite centrale. Generatori di numeri casuali per distribuzione uniforme, esponenziale e gaussiano. Metodo della funzione inversa e accept/reject. Metodi Monte Carlo per l'integrazione di una funzione e per la simulazione di apparati sperimentali.
Prerequisiti
1) conoscenza dei principali elementi di sintassi del linguaggio C/C++ presentati nell'insegnamento di Informatica del primo anno: tipi di variabili, strutture di controllo (if, for, while), funzioni e passaggio dei dati
2) elementi base di analisi matematica: sviluppi di Taylor, derivate, integrali ed equazioni differenziali
2) elementi base di analisi matematica: sviluppi di Taylor, derivate, integrali ed equazioni differenziali
Metodi didattici
L'insegnamento si articola in 12 lezioni frontali da due ore in aula e in 12 sessioni di laboratorio da tre ore. In ogni lezione frontale vengono introdotti gli elementi teorici di base per un nuovo argomento che viene poi approfondito mediante applicazioni concrete nella sessione di laboratorio successiva. Nelle sessioni di laboratorio vengono proposti dei problemi di analisi numerica e di fisica da affrontare implementando gli algoritmi numerici discussi a lezione in codici C++.
Gli studenti svolgono l'attività di laboratorio in modo autonomo seguendo le indicazioni sul sito di riferimento e appoggiandosi all'aiuto del docente o degli assistenti in caso di necessità.
Gli studenti svolgono l'attività di laboratorio in modo autonomo seguendo le indicazioni sul sito di riferimento e appoggiandosi all'aiuto del docente o degli assistenti in caso di necessità.
Materiale di riferimento
D.S. Malik: Programmazione in C++. Apogeo, 2013.
N. M. Josuttis: The C++ Standard Library-A Tutorial and Reference, 2nd Edition, Addison Wesley Longman, 2012
W.H. Press et al.: Numerical recipes in C/C++: the art of scientific computing, Cambridge University Press
http://www.cplusplus.com/
https://en.cppreference.com/w/
Trasparenze delle lezioni teoriche e sito di laboratorio
https://myariel.unimi.it/course/view.php?id=8085
https://labtnds.docs.cern.ch/
N. M. Josuttis: The C++ Standard Library-A Tutorial and Reference, 2nd Edition, Addison Wesley Longman, 2012
W.H. Press et al.: Numerical recipes in C/C++: the art of scientific computing, Cambridge University Press
http://www.cplusplus.com/
https://en.cppreference.com/w/
Trasparenze delle lezioni teoriche e sito di laboratorio
https://myariel.unimi.it/course/view.php?id=8085
https://labtnds.docs.cern.ch/
Modalità di verifica dell’apprendimento e criteri di valutazione
La verifica dell'apprendimento sarà effettuata a partire dalla valutazione di :
1) codici realizzati dallo studente durante le sessioni di laboratorio per la soluzione degli esercizi proposti.
2) una prova pratica al calcolatore
3) una discussione orale.
Il voto finale in trentesimi verrà definito in sede di esame orale e terrà conto dell'esito delle tre parti sopra elencate.
- Gli esercizi svolti verranno valutati in termini di correttezza, completezza ed efficienza del codice.
- La prova pratica, della durata di due ore, punta a verificare la capacità dello studente di applicare le conoscenze acquisite durante l'insegnamento ad un problema fisico nuovo: lo studente dovrà realizzare un programma in linguaggio C++ che permetta la soluzione del problema proposto. In questa prova lo studente potrà utilizzare tutto il materiale da lui realizzato durante lo svolgimento del laboratorio.
- La prova orale infine, della durata di circa un'ora, partirà da una discussione dei contenuti della prova scritta per poi accertare più in generale la conoscenza degli aspetti teorici (algoritmi) e metodologici (codifica) trattati nell'insegnamento.
1) codici realizzati dallo studente durante le sessioni di laboratorio per la soluzione degli esercizi proposti.
2) una prova pratica al calcolatore
3) una discussione orale.
Il voto finale in trentesimi verrà definito in sede di esame orale e terrà conto dell'esito delle tre parti sopra elencate.
- Gli esercizi svolti verranno valutati in termini di correttezza, completezza ed efficienza del codice.
- La prova pratica, della durata di due ore, punta a verificare la capacità dello studente di applicare le conoscenze acquisite durante l'insegnamento ad un problema fisico nuovo: lo studente dovrà realizzare un programma in linguaggio C++ che permetta la soluzione del problema proposto. In questa prova lo studente potrà utilizzare tutto il materiale da lui realizzato durante lo svolgimento del laboratorio.
- La prova orale infine, della durata di circa un'ora, partirà da una discussione dei contenuti della prova scritta per poi accertare più in generale la conoscenza degli aspetti teorici (algoritmi) e metodologici (codifica) trattati nell'insegnamento.
FIS/01 - FISICA SPERIMENTALE - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore
Lezioni: 24 ore
Turni:
Docente:
Carminati Leonardo Carlo
Turno 1
Docente:
Carminati Leonardo CarloTurno 2
Docente:
Carminati Leonardo CarloTurno 3
Docente:
Maino DavideTurno 4
Docente:
Tomasi MaurizioTurno 5
Docente:
Galli Davide EmilioGruppo serale
Responsabile
Periodo
Primo semestre
Programma
Verranno presentati elementi utili per acquisire e trattare dati con l'ausilio di uno più elaboratori elettronici, anche utilizzando e modificando codice di terze parti. In particolare:
· Funzionamento del microprocessore e operazioni fondamentali che può svolgere
· Ruolo del sistema operativo - fondamenti di UNIX
· Strutture comuni dei linguaggi di programmazione ad alto livello, e loro equivalenza
· Tecniche di debug
· Strutture di dati e algoritmi
· Calcolo, misura e confronto dell'efficienza degli algoritmi
· Fondamenti del modello a oggetti
· Temi di analisi numerica:
◦ Instabilità numerica
◦ Ricerca degli zeri di una funzione
◦ Calcolo delle derivate
◦ Soluzione delle equazioni differenziali ordinarie
◦ Calcolo degli integrali
◦ Metodi Montecarlo
· Regular expressions
· Reti di comunicazione di dati
· Elementi fondamentali di programmazione parallela
· Funzionamento del microprocessore e operazioni fondamentali che può svolgere
· Ruolo del sistema operativo - fondamenti di UNIX
· Strutture comuni dei linguaggi di programmazione ad alto livello, e loro equivalenza
· Tecniche di debug
· Strutture di dati e algoritmi
· Calcolo, misura e confronto dell'efficienza degli algoritmi
· Fondamenti del modello a oggetti
· Temi di analisi numerica:
◦ Instabilità numerica
◦ Ricerca degli zeri di una funzione
◦ Calcolo delle derivate
◦ Soluzione delle equazioni differenziali ordinarie
◦ Calcolo degli integrali
◦ Metodi Montecarlo
· Regular expressions
· Reti di comunicazione di dati
· Elementi fondamentali di programmazione parallela
Prerequisiti
E' necessario aver fatto proprio quanto proposto nel corso di "Informatica" del primo anno: sapere come scrivere semplici programmi di stile procedurale in almeno un linguaggio di programmazione.
Metodi didattici
Sono previste 25 sessioni di due ore in laboratorio, in orario serale (18-20). I gruppi di lavoro lavoreranno dapprima su attività comuni, assegnate a tutti i gruppi, e quindi sul problema scelto per l'esame. Nel corso di ogni sessione in laboratorio verranno presentati i materiali teorici o formali previsti dal programma del corso e utili per la continuazione dell'attività. Fra una sessione e l'altra verranno assegnate alcune attività di approfondimento asincrone.
Materiale di riferimento
Il materiale del corso verrà progressivamente reso disponibile a questa URL:
https://www.mi.infn.it/~prelz/ltnds2025/
Altri testi di riferimento utili:
M. T. Goodrich, R. Tamassia et al: Data Structures and Algorithms in C++/Python/*
Wes McKinney, Python for Data Analysis, 3rd edition, O'Reilly 2022
N. M. Josuttis: The C++ Standard Library-A Tutorial and Reference, 2nd Edition, Addison Wesley Longman, 2012
W.H. Press et al.: Numerical recipes in C/C++: the art of scientific computing, Cambridge University Press
https://www.mi.infn.it/~prelz/ltnds2025/
Altri testi di riferimento utili:
M. T. Goodrich, R. Tamassia et al: Data Structures and Algorithms in C++/Python/*
Wes McKinney, Python for Data Analysis, 3rd edition, O'Reilly 2022
N. M. Josuttis: The C++ Standard Library-A Tutorial and Reference, 2nd Edition, Addison Wesley Longman, 2012
W.H. Press et al.: Numerical recipes in C/C++: the art of scientific computing, Cambridge University Press
Modalità di verifica dell’apprendimento e criteri di valutazione
Il laboratorio verrà strutturato come lavoro in piccoli gruppi. Dopo aver risolto alcuni problemi comuni ogni gruppo dovrà scegliere in modo originale un problema di particolare interesse, da risolvere con strumenti informatici e di trattamento e analisi dei dati, e dovrà elaborare e giustificare una soluzione. La prova orale finale, individuale, sarà basata sul codice sviluppato nel lavoro di gruppo.
FIS/01 - FISICA SPERIMENTALE - CFU: 6
Laboratori: 36 ore
Lezioni: 24 ore
Lezioni: 24 ore
Docenti:
Prelz Francesco, Rebatto Davide
Docente/i
Ricevimento:
su appuntamento
Ricevimento:
Mercoledì 14:30-16:00, oppure in altri giorni via appuntamento per e-mail
Dip. di Fisica, stanza A/T/S5b (piano 0 edificio LITA), via Celoria, 16
Ricevimento:
Su appuntamento via e-mail: [email protected]
Studio presso l'edificio 'I' - Centro di Calcolo del dipartimento di Fisica, via Celoria 16
Ricevimento:
Su appuntamento
Uff. I/T/11A c/o Palazzina Calcolo del Dipartimento di Fisica (via Celoria 16)
Ricevimento:
Su appuntamento
Laboratorio di Strumentazione Spaziale, Dipartimento di Fisica (via Celoria 16, Milano)