Laboratorio di trattamento numerico dei dati sperimentali Maurizio Tomasi turno A2 Giovedì 2 Novembre 2017
Premessa Negli esercizi di questa lezione è richiesto di prendere dimestichezza con l'ereditarietà multipla, un concetto della programmazione OOP. Il C++ è uno dei pochi linguaggi che supportano l'ereditarietà multipla: linguaggi più moderni hanno scelto di non supportarla es., C#, Java,. Per ulteriori informazioni, fare riferimento alla pagina What is the exact problem with multiple inheritance? In questo corso ne mostriamo l'uso, perché alcune librerie C++ sono basate su di essa ed è quindi importante conoscerla.
Esercizio 4.0 Campi vettoriali È richiesto di scrivere una classe CampoVettoriale, che rappresenti il valore di un campo vettoriale v( r ) in un punto r fissato. Esempi di campi vettoriali che ci serviranno: il campo elettrostatico; il campo gravitazionale. Questi due campi sono additivi. Ad esempio, il campo gravitazionale campi g i g dello spazio di una serie di cariche è dato dalla somma dei di ciascuna carica: N v g( r ) = g i( r) = G. r r i=1 N i=1 m i i 2
Esercizio 4.0 Campi vettoriali La classe CampoVettoriale deve implementare due metodi, Modulo e Somma. Usando la notazione della slide precedente: 1. Il metodo double Modulo() const deve restituire ; 2. Il metodo void Somma(const CampoVettoriale&) deve aggiornare il campo g g g una variabile interna alla classe CampoVettoriale sommando il contributo i esimo, g tipicamente dovuto a una delle particelle che compongono il campo. i
Esercizio 4.1 Campo di multipolo Per visualizzare rapidamente l'aspetto delle cariche, potete scrivere un semplice programma in Javascript formalmente noto come ECMAScript, usando direttamente il browser Firefox. Javascript è un linguaggio di programmazione che superficialmente assomiglia al C/C++, ed è usato nella programmazione dei siti web Gmail, Facebook, Instagram,. Esistono siti, come http://jsfiddle.net, che permettono di provare rapidamente brevi programmi in Javascript. Noi useremo Jsfiddle e la libreria Raphael.js per scrivere un piccolo programma con cui visualizzare la distribuzione delle cariche di un multipolo.
Esercizio 4.1 Campo di multipolo Nel riquadro «Javascript» di Jsfiddle digitate questo codice: var width = 320, height = 200; // No type is required var num_of_charges = 2; var r0 = 30, inner_radius = 6; // Create a «canvas» var paper = Raphael(0, 0, width, height); // Plot the charges for(i = 0; i < num_of_charges; i++) { ang = 2 * Math.PI * i / num_of_charges; var circle = paper.circle(width / 2 + r0 * Math.cos(ang), height / 2 + r0 * Math.sin(ang), inner_radius); // Use alternating colors: F00 (red) and 00F (blue) circle.attr("fill", (i % 2 == 0)? "#f00" : "#00f"); } Caricate «Raphael.js» v. slide successiva ed eseguite con CTRL+Invio.
Esercizio 4.1 Campo di multipolo Per vedere diversi multipoli, cambiate il valore della variable num_of_charges assicurandovi che sia sempre un numero pari. Dopo ogni modifica, premete CTRL+Invio.
Esercizio 4.1 Campo di multipolo L'esercizio richiede di stimare il coefficiente α nell'equazione E α R, verificando che α 2 + n/2. Il metodo più veloce è quello di fare in modo che il programma calcoli il campo per un certo numero di punti prefissati.
Esercizio 4.1 Campo di multipolo Come esempio, il programma potrebbe chiedere all'utente questi dati: 1. Numero di punti N, 2. Distanza R minima R, min 3. Distanza R massima R, max e poi calcolare il campo per punti collocati lungo l'asse x oppure y, oppure z: la scelta è ovviamente ininfluente : P i i = ( R min + (Rmax R min ), 0, 0 ), N 1 con i = 0 N 1.
Esercizio 4.1 Campo di multipolo Nell'ipotesi della slide precedente, il programma dovrebbe salvare in un file di testo N righe, ciascuna contenente: 1. La posizione xyz del punto i esimo 2. Il valore del campo nel punto i esimo In questo modo potete poi usare Gnuplot per visualizzare queste righe e verificare ad occhio per quali valori di R e R relazione diventa davvero esponenziale. Suggerimento: per usare assi con scala logaritmica, usare il comando set logscale, vedere il link per esempi d'uso. Una volta scelti R e R, fate calcolare al programma α e scrivetelo a video. min max min max
Esercizio 4.2 Satellite GOCE Ipotizzare che la fila di sfere sia allineata lungo un segmento di 100 km, e che ciascuna sfera tocchi l'adiacente. Il codice mostrato alla voce «Puntatori e vettori di puntatori» è solo un esempio, e non allinea le sfere come richiesto dall'esercizio.
Note finali Se l'idea di un «fiddle» come quello usato per eseguire codice Javascript nell'esercizio 4.1 vi piace, sappiate che esistono fiddle anche per altri linguaggi. Ad esempio, sul sito TutorialsPoint è disponibile un fiddle per programmi C++ che usa l'ultima versione del compilatore GCC.