"?manu*" ha scritto:
> 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.
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
Received on Tue Feb 05 2008 - 20:30:13 CET