• Non ci sono risultati.

Simulazione dinamica

N/A
N/A
Protected

Academic year: 2021

Condividi "Simulazione dinamica"

Copied!
17
0
0

Testo completo

(1)

Simulazione dinamica

Stefano Lacaprara

(2)

Simulazione di un sistema dinamico

Consideriamo un sistema dinamico semplice, e proviamo a fare una simulazione del

comportamento dinamico

Idea: integrare le leggi del moto per un sistema a 2 corpi sottoposti a vincoli esterni.

(3)

Sistema

2 palle in una scatola, soggette a

forza di gravita’

una molla fra loro

rimbalzi elastici sulle pareti

(4)

Parametri

grandezza della scatola

massa delle palle

costante elastica della molla

forza di gravita’

Per risolvere le equazioni del moto useremo una tecnica di integrazione numerica, discretizzando il tempo.

Dovremo scegliere bene il parametro t

(5)

Eq. moto

La fisica e' semplice. Devo calcolare la risultante delle forze su ogni palla

NB: F e a sono vettori

Per la cinematica, faccio integrazione numerica

a  t  = dv  t 

dt a  t Δt  = v  t Δt  v  t 

Δt

F  = m ∗ a

(6)

Cinematica

Per la cinematica, faccio integrazione numerica

a  t  = dv  t 

dt a  t Δt  = v  t Δt  v  t 

Δt

v  t  = dx  t 

dt v  t Δt  = x  t Δt  x  t 

Δt

(7)

Quindi

( )

( ) ( ) ( )

( t t ) ( ) x t t v ( ) t

x

t a t

t v t

t v

m F

t a

altri

i

∆ +

=

∆ +

∆ +

=

∆ +

= ∑ /

(8)

Forze e accelerazioni

a quali accelerazioni e’ soggetta una palla:

gravita = -g su Y

molla = -k/m*(dist-(dist a riposo)) su (x,y)

rimbalzi

semplicemente dico che invertono la componente della v

corrispondente

(9)

Cosa ci serve

Dinamica su piano: vettore 2 dimensioni

somma e differenza vettoriale, prodotto per scalare

Masse:

conoscono posizione, velocita' (vect 2d), massa

sanno calcolare forza cui sono sottoposte

gravita' (facile)

molla: serve posizione altra palla

rimbalzi (invertire una componente velocita')

Scatola

dimensioni

contiene le due palle

evolve

(10)

Vettore 2d

class Vec2d { public:

Vec2d(float x, float y) ...

float x() const { return theX; } ...

private:

float theX, theY;

};

Vec2d operator+(const Vec2d& a, const Vec2d& b) { ... }

... operator*(const float s, const Vec2d&v) { ... }

(11)

Palla

class Palla { public:

Palla(float m, Vec2d pos. Vec2d vel) { ... } Vec2d pos() const ;

...

void evolvi(Vec2d F); // evolvi data una forza esterna

void controllaBordi(float bordi ...); // controlla di non essere arrivato al bordo

private:

float mass;

Vec2d vel;

Vec2d pos;

};

(12)

Scatola

class Scatola { public:

Scatola () ...

evolvi(); // calcola le forze su ciascuna delle due palle e fai evolvere le palle

display(); // mostra la scatola con palle e molla private:

Palla p1,p2;

float dimX, dimY;

};

(13)

Parametri

Ci servono alcuni parametri globali

Usiamo namespace per proteggerli

accelerazione gravita'

k molla

lunghezza a riposo molla

Delta T discretizzazione tempo namespace pars {

const float g=9.81; // gravity acc const float k=1.2; // spring k

const float l_0=5.; // spring rest lenght const float dt=0.1; // intervallo di tempo }

(14)

Main

Scatola s;

for (int i=0; i<iterMax; ++i){

s.evolvi();

s.display();

}

(15)

Per visualizzare

Uso istogramma 2d (TH2F) di root

Riempio isto con pos di ciascuno delle due palle, con altezza pari alla massa (cosi' vengono di colore diverso)

Per molla uso TLine(x1,x2,y1,y2);

Devo cancellare l'istogramma precedente ad ogni iterazione

Il modo piu' semplice e' creare un nuovo istogramma ad ogni step e distruggerlo dopo aver fatto DrawCopy()

Devo lavorare su un'unica TCanvas

La creo io fuori del loop

ad ogni step chiamo Tcanvas::Update() per aggiornare la canvas

(16)

void Rimbalzo(int iterMax=10) { Scatola s;

TCanvas * canvas = new TCanvas();

for (int i=0; i<iterMax; ++i){

s.evolvi();

s.display();

canvas->Update();

} return;

}

(17)

// mostra lo stato void display() {

TH2F histo("fff","Tavolo",40,0,dimX,40,0,dimY);

histo.Fill(p1().pos().x(), p1().pos().y(), p1().mass());

histo.Fill(p2().pos().x(), p2().pos().y(), p2().mass());

histo.DrawCopy("zcol");

TLine theSpring(p1().pos().x(), p1().pos().y(), p2().pos().x(), p2().pos().y());

theSpring.DrawClone();

}

Riferimenti

Documenti correlati

• la chiamata ricorsiva che riproduce la struttura della formula (N + soluzione del problema della somma dei primi N-1 numeri.

Thats why this is an essential reference work for those who study in depth these issues and especially the defini- tion of the bibliographic universe, of work, of families of works,

monitoring of HCV-infected patients, including those with mild or asymptomatic clinical variants, is mandatory for a timely diagnosis and treatment of the Table 3

del 2001 e di conseguenza una riduzione della sua estensione superficiale con la formazione di zone “intermatte” nell’ambito del posidonieto (Fig.21). 21 Regressione della

COMPILARE la parte precedente queste istruzioni, in particolare, scrivere cognome e nome (in stam- patello), firmare, indicare il numero di matricola e segnare il proprio corso

lavoro salute diritti inclusione invalidità disabilita assenza cancro indennità inabilità congedi aspettativa retribuzione leggi informazione normative benefici part-time work

terminale rimane utilizzabile (il comando viene.. 4) abbiamo visto come si può utilizzare ds9 fuori da IRAF o attraverso IRAF (tv e poi disp).. Scaricate ora le due immagini