Applicazione di funzioni e strutture a simulazione moto
Transcript
Applicazione di funzioni e strutture a simulazione moto
Applicazione di strutture e funzioni all’esperienza di simulazione del moto di un punto materiale Università degli Studi di Brescia Elementi di Informatica e Programmazione – Università di Brescia 1 Simulazione punto materiale soggetto a molla e gravità (REPRISE) (xm, ym) -k*Δl mg (x1, y1) Elementi di Informatica e Programmazione – Università di Brescia 2 Punto materiale soggetto a molla e gravità: schema di massima PUNTO MATERIALE INIZIALIZZATO CON POSIZIONE E VELOCITA’ INIZIALE Stampa coordinate punto materiale mc=0; do{ mc++; CALCOLA FORZA RISULTANTE PUNTO MAT.LE è ACCELERAZ (ax, ay, az) AGGIORNA POSIZIONE E VELOCITA’ PUNTO MATERIALE Stampa coordinate punto materiale }while(Simulazione NON terminata); Elementi di Informatica e Programmazione – Università di Brescia 3 A CACCIA DI STRUTTURE (1) int mc; // clock // punto materiale 1 float x1, y1; // posizione corrente (metri) float vx1, vy1; // velocita' corrente (metri/s) float ax1, ay1; // accelerazione corrente (metri/s^2) (ES: PER 10 PUNTI?) struct puntomateriale //inizializzazione x1=X10; MOLTE VARIABILI // condizioni iniziali punto materiale y1=Y10; vx1=VX10; vy1=VY10; mc=0; // master clock = 0 printcoord(x1, y1); // stampa coordinate iniziali (x,y) do { mc++; MOLTI PARAMETRI //calcola accelerazione punto materiale 1 nella posizione precedente ForzaElastica(Xm1, Ym1, km1, lmr1, x1, y1, &ax1, &ay1); struct molla struct forza … Elementi di Informatica e Programmazione – Università di Brescia 4 A CACCIA DI STRUTTURE (2) ForzaElastica(Xm1, Ym1, km1, lmr1, x1, y1, &ax1, &ay1); MOLTE VARIABILI ax1=ax1/m1; ay1=ay1/m1; (ES: PER 10 PUNTI?) ay1=ay1-G; //aggiorna posizione sulla base della velocita' x1=x1+vx1*DELTAT; y1=y1+vy1*DELTAT; //aggiorna velocita' sulla base dell'accelerazione IDEM struct pos vx1=vx1+ax1*DELTAT; vy1=vy1+ay1*DELTAT; struct vel struct accelerazione if (mc%DELTATS==0) printcoord(x1,y1); } while (mc<ENDMC); // usciamo quando il master clock arriva al valore finale printcoord(x1,y1); // stampa coordinate finali raggiunte a fine traiettoria Elementi di Informatica e Programmazione – Università di Brescia 5 DEFINIZIONE STRUTTURE (E PASSIAMO AL 3D) struct pos{ struct forza{ float x; float fx; float y; float fy; float z; float fz; }; }; struct vel{ struct puntomateriale{ float vx; float massa; // massa float vy; float carica; // carica elettrica float vz; struct pos posiz; // posizione struct vel veloc; // velocita' }; }; struct accelerazione{ float ax; struct molla{ float ay; float lrip; // lunghezza riposo float az; float k; // costante elastica struct pos posperno; // posizione del perno }; }; Elementi di Informatica e Programmazione – Università di Brescia 6 A CACCIA DI FUNZIONI (1) int mc; // clock // punto materiale 1 float x1, y1; // posizione corrente (metri) float vx1, vy1; // velocita' corrente (metri/s) float ax1, ay1; // accelerazione corrente (metri/s^2) //inizializzazione x1=X10; // condizioni iniziali punto materiale y1=Y10; vx1=VX10; vy1=VY10; mc=0; // master clock = 0 printcoord(x1, y1); // stampa coordinate iniziali (x,y) void printcoord(struct puntomateriale) do { mc++; //calcola accelerazione punto materiale 1 nella posizione precedente ForzaElastica(Xm1, Ym1, km1, lmr1, x1, y1, &ax1, &ay1); … struct forza ForzaElastica(struct molla, struct puntomateriale) Elementi di Informatica e Programmazione – Università di Brescia 7 A CACCIA DI FUNZIONI (2) ForzaElastica(Xm1, Ym1, km1, lmr1, x1, y1, &ax1, &ay1); struct forza ForzaGrav(struct puntomateriale) ax1=ax1/m1; … ay1=ay1/m1; struct forza sommaf(struct forza, struct forza) ay1=ay1-G; struct accelerazione forzaToacc(struct forza, struct puntomateriale) //aggiorna posizione sulla base della velocita' x1=x1+vx1*DELTAT; void aggposvel(struct puntomateriale *, struct accelerazione) y1=y1+vy1*DELTAT; //aggiorna velocita' sulla base dell'accelerazione vx1=vx1+ax1*DELTAT; vy1=vy1+ay1*DELTAT; if (mc%DELTATS==0) printcoord(x1,y1); } while (mc<ENDMC); // usciamo quando il master clock arriva al valore finale printcoord(x1,y1); // stampa coordinate finali raggiunte a fine traiettoria Elementi di Informatica e Programmazione – Università di Brescia 8 PROTOTIPI DELLE FUNZIONI //stampa sul file pfoutput le coordinate (x,y) del punto materiale e va a capo void printcoord(struct puntomateriale p); //restituisce la forza elastica esercitata dalla molla m sul punto materiale pm struct forza ForzaElastica(struct molla m, struct puntomateriale pm); //restituisce la forza di gravita' applicata sul punto materiale pm struct forza ForzaGrav(struct puntomateriale pm); // restituisce la somma (vettoriale) delle forze f1 e f2 struct forza sommaf(struct forza f1, struct forza f2); // restituisce l'accelerazione ottenuta dalla forza f applicata sul punto materiale p struct accelerazione forzaToacc(struct forza f, struct puntomateriale p); //aggiorna posizione e velocita' del punto materiale p sulla base dell'accelerazione acc passata in ingresso void aggposvel(struct puntomateriale *pp, struct accelerazione acc); Elementi di Informatica e Programmazione – Università di Brescia 9 ESTRATTO DEL CODICE struct puntomateriale pm1={M1,C1,{X10,Y10,Z10},{VX10,VY10,VZ10}}; struct molla ml1={LMR1,KM1,{XM1,YM1,ZM1}}; mc=0; // master clock = 0 printcoord(pm1); // stampa coordinate iniziali del punto materiale do { mc++; // calcola accelerazione punto materiale 1 forzac=ForzaGrav(pm1); forzac=sommaf(forzac,ForzaElastica(ml1,pm1)); acc=forzaToacc(forzac,pm1); aggposvel(&pm1, acc); // aggiorna posizione e velocita' del punto materiale 1 if (mc%DELTATS==0) printcoord(pm1); } while (mc<ENDMC); // stampa coordinate dopo aggiornamento // esce quando il master clock arriva al valore finale Elementi di Informatica e Programmazione – Università di Brescia 10 TASK 1 Partire dal file puntomaterialestructTASK.c pubblicato, che contiene il codice presentato nei lucidi precedenti a meno del corpo delle seguenti tre funzioni: void printcoord(struct puntomateriale p); void aggposvel(struct puntomateriale *pp, struct accelerazione acc); struct forza sommaf(struct forza f1, struct forza f2); Completare il codice e sperimentarlo. NB: notare che ora si gestisce lo spazio x-y-z (z “verticale”) Elementi di Informatica e Programmazione – Università di Brescia 11 ANCORA SU GNUPLOT # File dati.txt con piu’ colonne 0 1 2 3 4 0 0 0 0 0 0 0.5 0.6 0.7 2 • Grafica i punti in 3D in coordinate x-y-y gnuplot> splot “dati.txt” • Con plot e splot e’ possibile indicare le colonne da usare, p.es. gnuplot> plot “dati.txt” using 1:3 produce il grafo (2D) x-y usando la colonna 1 per x, la 3 per y Elementi di Informatica e Programmazione – Università di Brescia 12 TASK 2 Modificare il codice creato nell’esercizio precedente per effettuare la seguente simulazione: (20, 0, 10) (0, 0, 10) (10, 10, 0) Molla esistente k=100, lm=10 k=100, lm=10 mg (5, 0, 5) Elementi di Informatica e Programmazione – Università di Brescia 13 TASK 3 Simulare una collezione di n punti materiali ciascuno con la propria carica elettrica (positiva o negativa) soggetti alle conseguenti reciproche forze di attrazione o repulsione. Elementi di Informatica e Programmazione – Università di Brescia 14