Nella sessione di laboratorio bisognerà risolvere almeno un problema, gli altri potranno essere affrontati a casa, come possibili temi d’esame.
Tutti i problemi richiedono di discretizzare le equazioni differenziali su di un reticolo. Come suggerimento, anziché impostare una matrice, accedendo agli elementi tramite indici multipli, ad esempio
conviene definire un vettore ed accederci indirizzando direttamente l’elemento opportuno:
Sebbene la costruzione sembri più complicata, ha il vantaggio di permettere più facilmente di riutilizzare il codice. Ad esempio la seguente funzione che calcola la massima componente di un vettore:
può essere chiamata nel secondo caso come
distanza(dimx*dimy*dimz,M)
ma non può essere utilizzata se M è una matrice a più indici.
In due dimensioni il potenziale elettrostatico deve soddisfare l’equazione:
![]() | (1) |
con delle opportune condizioni al contorno.
Il problema può essere discretizzato su un reticolo di passo Δx:


Il procedimento di risoluzione può essere un metodo di rilassamento, in cui si immette una soluzione di prova u(0) e si applica la trasformazione

iterando il procedimento fino a quando la distanza massima tra u(n) ed u(n+1) è minore di una tolleranza data.
Determinare il potenziale su di un reticolo opportuno, con condizioni al contorno nulle sui bordi, per i seguenti problemi:
≤ 1, e densità di carica nulla
ρ(x,y) = 0.
≤ 1
,
≤ 1In tutti i casi dare la stima del campo elettrico nel punto
.
Processi diffusivi, tra cui la propagazione del calore, vengono descritti dall’equazione:

Il problema ora è di trovare l’evoluzione temporale della funzione, data la sua condizione iniziale.
Possiamo discretizzare il problema su di un reticolo di passo Δx per la variabile spaziale e valutarne l’evoluzione temporale con passi Δt:


Si tratta quindi, dopo aver dato la condizione iniziale al tempo 0, di calcolare i valori negli intervalli successivi.
Il metodo è stabile se viene soddisfatta la condizione
![]() | (2) |
Considerare i seguenti casi, usando come condizioni al contorno il fatto che la u mantenga le condizioni iniziali in tali punti (fisicamente il problema è quello di una sbarra termostatata agli estremi):
σ0 = 0.2: verificare che il profilo
della u si mantiene gaussiano, con larghezza che aumenta con il tempo
σ(t) =
e verificare il raggiungimento della condizione
di equilibrio con un passo che soddifa la (2) e poi provare ad aumentarlo
sopra il limite definito dall’equazione, fino al punto di vedere l’instaurarsi
di instabilità numeriche tipo quella in figura:
L’equazione delle onde:
![]() | (3) |
descrive segnali che si propagano con una velocità v.
Anche in questo caso vogliamo trovare come soluzione l’evoluzione temporale di una condizione iniziale che, questa volta richiede di fornire sia la funzione al tempo 0, u(x,0), che la sua derivata temporale, ∂u∕∂t(x,0).
La discretizzazione sul reticolo:

porta ora ad equazioni che richiedono due passi temporali precedenti:

per cui bisogna ricordarsi di tenere i risultati di due iterazioni.
Per iniziare ad iterare, si possono costruire i due passi iniziali come

anche in questo caso esiste una condizione di stabilità:
![]() | (4) |
che stavolta risulta particolarmente critica.
Bisogna poi fornire delle condizioni sugli estremi dell’intervallo.
Affrontare i seguenti casi:




In un esercizio come questo è importante sapere graficare bene i risultati. Per fare questo è bene salvare i dati in maniera che si possano ricostruire facilmente. Per cui potrebbe essere utile salvare i dati delle u che si vogliono visualizzare successivamente in un formato del tipo:
e fare una macro che legge le prime due righe, crea un opportuno istogramma 2D di dimensione dimx*dimy:
(capite il motivo dei valori strani per i limiti dell’istogramma?) e poi lo riempie con un ciclo del tipo:
Si noti che il metodo Fill di un istogramma permette di inserire un parametro in più rispetto al numero di dimensioni dell’istogramma, appunto per permettere di definire il peso che un particolare ingresso ha nel bin. Se nel bin c’è un solo ingresso, il suo peso definisce il valore dell’istogramma.
Nel disegnare gli istogrammi bidimensionali, può essere divertente cercare di
giocare con le opzioni del metodo Draw. In particolare le opzioni più chiare
sono
| "CONT3" | "SURF3" |
![]() | ![]() |
ROOT implementa una speciale classe di file per immagazinare i suoi oggetti. Questo fatto può essere utile per immagazzinare istogrammi e grafici, senza doversi tenere tutti i dati utilizzati per crearli (si noti che ROOT realizza automaticamente una compressione dei suoi file, cosa particolarmente utile per chi ha problemi di quota!).
Per aprire un file, basta usare l’istruzione:
TFile *myfile = new TFile("nomedelfile","NEW")
Le opzioni possibili sono:
| NEW o CREATE | Crea un nuovo file. Se il file esiste già invia un messaggio di errore |
| RECREATE | Crea un nuovo file. Se il file esiste già viene sovrascritto |
| UPDATE | Permette di modificare il file aggiungendo nuovi oggetti |
| READ | Apre il file solo in lettura |
Se nessuna opzione viene specificata, il file viene aperto in modo READ. Una volta aperto il file, oggetti di root possono esservi scritti usando il metodo Write() che è definito per la maggior parte di essi. Ad esempio:
Come ultima istruzione, abbiamo messo la chiusura del file.
Per accedere ai file creati, il sistema più sempice è di entrare in ROOT e creare un
oggetto di tipo TBroser:
TBrowser b;
Questa dichiarazione apre un’interfaccia grafica che permette di navigare tra i file e
gli istogrammi dentro i file.
Potrebbe essere comodo costruire un file di root, produrre gli istogrammi dal nostro programma e salvarli direttamente lì. Per fare questo bisogna imparare come accedere agli header files di ROOT ed alle sue librerie. La cosa è ragionevolmente semplice:
Nel makefile, si noti l’utilizzo delle variabili predefinite:
| $@ | il target |
| $^ | la lista completa delle dipendenze |
| $< | la prima dipendenza |
Essendo gli esercizi abbastanza dettagliati, non c’è un questionario, ma siete pregati di mostrare ai docenti i vostri risultati, o almeno di confrontarli con quelli attesi mostrati nella pagina delle soluzioni derivate_soluzioni.html, in modo da avere conferma della loro correttezza.