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