Newsgroup: it.scienza.fisica
Titolo: dinamica discreta

Ho un programma nel quale devo simulare la dinamica di una griglia di 
punti. Ogni punto è soggetto ad una forza elastica e ad
una forza di attrito dipendente in modo lineare dalla velocità.
Ho però il vincolo di utilizzare una rappresentazione a virgola fissa 
per la posizione e la velocità dei punti. Dunque possiamo pensare che la 
posizione dei punti è un numero intero, e la velocità è pure un numero 
intero. Il passo temporale è 1 e la massa 1, cosicchè una volta 
calcolata la forza F_i a cui è soggetto il punto P_i, l'evoluzione del 
sistema è:
v_i  <-  v_i + F_i
x_i  <-  x_i + v_i
L'evoluzione della griglia risulta verosimile. Se la eccito le onde si 
propagano su di essa è si smorzano nel tempo. Solo che la griglia non si 
ferma mai! Continua a fare piccole oscillazioni intorno alla posizione 
di riposo. Questo è sicuramente dovuto all'utilizzo di variabili a 
virgola fissa. Infatti, ad esempio, la forza di attrito diventa nulla 
quando la velocità scende sotto una certa soglia, in quanto la forza di 
attrito è calcolata come F = - v / c dove v è la velocità, c è una 
costante (intera) e "/" è la divisione tra interi, dunque F=0 se v<c.
Sapete se questo fenomeno è studiato? Ha un nome?
Ho fatto diversi tentativi per risolvere la questione. Ho provato a 
fermare forzatamente i punti che si trovano sotto una certa energia, 
oppure ho provato ad aggiungere delle forze apposite... ma i punti non 
si fermano. Il problema è probabilmente che dovrei guardare il problema 
globalmente, non sul singolo punto, ma non so come fare...
E.

F_i  ->  k^2 * F_i.
A scanso di equivoci (avrei dovuto farlo nel messaggio scritto
prima, ma non ci avevo pensato :-( preciso che queste
sostituzioni andranno effettuate nei _valori numerici_ delle
v_i e F_i, e che _dopo_ aver fatto
queste sostituzioni, anche le equazioni
iterative del moto, in cui F e v sono moltiplicate
da un tempo unitario che ora esplicito:
v(n+1)  =  v(n) + F(n) * 1
x(n+1)  =  x(n) + v(n) * 1
andranno modificate, in questo modo:
v(n+1)  =  v(n) + F(n) / k
x(n+1)  =  x(n) + v(n) / k
e in modo analogo anche le equazioni piu' precise
che ho scritto nel messaggio precedente diventeranno:
v(n+1/2) = v(n-1/2) + F(n) / k
x(n+1) = x(n) + v(n+1/2) / k
v(1/2) = v(0) + F(0) / 2 / k.
Ciao
-- 
Giorgio Bibbiani

 e "/" è la divisione tra interi, dunque F=0 se v<c.
Io non sono convinto che tutta la colpa sia nell'utilizzo di variabili
intere.
Per prima cosa, se vuoi risolvere il problema derivante dall'uso
della divisione intera, puoi provare a cambiare l'unita' di
misura del tempo (cosa perfettamente lecita, infatti quando
hai detto che il passo temporale è 1 e la massa 1, in sostanza
non hai fatto altro che scegliere le tue unita' di misura
di tempo e massa):
se scegli una unita' di misura del tempo piu' grande rispetto
alla attuale di un fattore intero k > 1, allora dato che c ha
dimensioni fisiche di tempo / massa, il valore numerico 1 / c
(qui e oltre con / si intende la divisione nel campo reale)
viene sostituito dal valore numerico k / c, e si puo' scegliere
il valore di k in modo che quest'ultimo valore sia con
buona approssimazione un numero intero, cosi' facendo si
sostituisce la divisione intera con la moltiplicazione per
l'approssimazione intera di k / c.
Nel concreto, scegliere una unita' di misura del tempo
piu' grande di un fattore k significa che dovrai
effettuare le sostituzioni:
1 / c  ->  k / c  (approssimato con un intero)
v_i  ->  k * v_i
F_i  ->  k^2 * F_i.
Come seconda cosa, le equazioni iterative per l'evoluzione
temporale del sistema che hai utilizzato (n e' l'istante di tempo,
per semplicita' considero un solo grado di liberta'):
v(n+1)  =  v(n) + F(n)
x(n+1)  =  x(n) + v(n)
non consentono di ottenere una grande precisione, perche'
il valore di x all'istante n+1, x(n+1), e' calcolato utilizzando il
valore della velocita' all'istante n, v(n), mentre la velocita'
non e' costante nell'intervallo di tempo che va da n a n+1.
Per avere una precisione di calcolo decisamente superiore
con un piccolo sforzo in piu', potresti modificare le
equazioni del moto in questo modo:
v(n+1/2) = v(n-1/2) + F(n)
x(n+1) = x(n) + v(n+1/2),
cosi' facendo il valore di x all'istante n+1 e'calcolato
utilizzando il valore della velocita' al tempo n+1/2.
Rimane il problema che le condizioni iniziali (se n = 0 e'
il tempo iniziale) sono date nella forma x(0) e v(0),
mentre a noi per partire serve il valore v(1/2),
che possiamo stimare cosi':
v(1/2) = v(0) + F(0) / 2.
Se vuoi un riferimento bibliografico puoi consultare ad es.
le Lectures on Physics di Feynman, vol. 1 (Feynman
calcola le orbite planetarie con un calcolo
quasi back of the envelope :-).
Ciao
-- 
Giorgio Bibbiani

 intere.
Infatti hai ragione! Da quello che capisco mi suggerisci di raffinare il 
passo temporale e di riscalare di conseguenza le velocità. Io però non 
posso raffinare il passo temporale (che è fissato) ma in effetti mi sono 
accorto che le variabili per la velocità (a differenza di quelle della 
posizione) non utilizzavano tutti i bit a disposizione. Dunque è stato 
sufficiente raffinare l'unità di misura delle velocità e ora funziona bene!
E.