Newsgroup: it.scienza.fisica
Titolo: Problema con una simulazione

Salve,
ho voluto provare a simulare un oscillatore ideale a molla con un peso
attaccato senza fare ricorso all'analisi matematica ma semplicemente
iterando le seguente funzione:
v(t+dt)=v(t)-(k/m)*x(t)*dt
x(t+dt)=x(t)+v(t)*dt
Impostando valori di dt sempre piu piccoli(partendo da dt=0.3) ottengo
ovviamente simulazioni sempre piu precise e grafici sempre piu
dettagliati(uso excel per creare il grafico) ma per quanto sia piccolo dt
ho andamento crescente dell'ampiezza dell'onda cosa che ovviamente non e'
vera.
Dove sbaglio? Devo forse utilizzare un altro metodo? Se si', qual'e?
Grazie!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Che i sistemi di integrazione numerica possano essere instabili e' una 
cosa nota da quando sono stati inventati.
Nel caso tuo si puo' ottenere un miglioramento immediato approssimando 
le derivate in modo diverso.
Tu hai approssimato la derivata della funzione generica y(t) in questo modo:
y'(t)= [y(t+dt)-y(t)]/dt
che si chiama "forward-difference formula".
Ti propongo di rifare i conti approssimando la derivata con
y'(t)= [y(t+dt)-y(t-dt)]/[2*dt]
che invece si chiama "central-difference formula".
Come vedrai questo impone di ipotizzare qualche numero aggiuntivo 
all'inizio e lo devi fare con una certa saggezza.  Mi sembra che tu 
possa cavartela da solo e quindi ti lascio divertire.
Daniele Fua'
Uni.Mi.B.

 x(t+dt)=x(t)+v(t)*dt
prova ad aggiungere il termine di forza anche nell' equazione per x 
(algoritmo di Eulero):
a(t) = -(k/m)*x(t)
x(t+dt)=x(t)+v(t)*dt+0.5*a(t)*dt**2
Ancora meglio e'di riorganizzare il calcolo secondo il seguente 
algoritmo (alg. di Verlet con le velocita',  valido solo per forze non 
dipendenti dalla velocita'):
x(t+dt)=x(t)+v(t)*dt+0.5*a(t)*dt**2
v(t+dt)=v(t)+0.5*(a(t)+a(t+dt))*dt
che puo' essere implementato come:
dati x = x(0) e v=v(0)
calcola a = a(0) = -k/m * x(0)
per n volte ripeti:
     x = x + v*dt + 0.5*a*dt**2
     v = v + 0.5*a*dt   !  modifica parziale della v.
     a = -(k/m)*x
     v = v + 0.5*a*dt   !  questa e'la velocita' all'istante consiterato
        ! qui puoi far scrivere x e v, nonche' calcolare energia 
cinetica e potenziale per verificare quanto bene si conserva l' energia 
meccanica ad ogni step
ripeti
Giorgio

 Uni.Mi.B.
Grazie per l'aiuto!
Noto che vi e' una vera e propria teoria su queste cose. Dove posso
trovare materiale su internet (da scaricare gratis magari) su queste
tecniche?
Grazie ancora!


 Grazie ancora!
Certamente! ci sono intere biblioteche sull'integrazione numerica e sul 
calcolo numerico in genere.
Molto sinceramente ti consiglierei piu' un libro che internet e, per 
iniziare, secondo me uno dei libri migliori e':
Forman S. Acton, "Numerical methods that (usually) work", Harper & Row, 
1970.
Come vedi e' vecchiotto e, forse, non facile da reperire ma... se lo 
trovi ne vale la pena!
Comunque, tanto per aggiungere qualcosa al quesito iniziale: i metodi 
migliori per integrare equazioni di quel tipo sono quelli derivati da un 
vecchio metodo conosciuto per il nome degli inventori originali: 
Runge-Kutta. Sulla rete ne trovi in abbondanza di sicuro.
Daniele Fua'
Uni.Mi.B.

 Runge-Kutta. Sulla rete ne trovi in abbondanza di sicuro.
...
Non esattamente. I metodi RK hanno molti pregi ma per le equazioni del 
moto la famiglia dei metodi  simplettici (di cui il metodo di Verlet e' 
l' esempio piu' semplice) hanno dei vantaggi notevoli. Soprattutto se si 
devono tenere sotto controllo le costanti del moto.
La teoria dei metodi simplettici e' relativamente recente (anche se 
esistono da moltissimo tempo, la loro importanza e' stata messa in luce 
negli anni '80).
Giorgio

Scusami se ti correggo ma penso tu abbia avuto un lapsus,
penso tu volessi dire che per i sistemi simlettici il metodo di Verlet è 
migliore del Runge-Kutta, no?
Giorgio Pastore ha scritto:


 tecniche?
Certo: si chiama "analisi numerica" e in particolare "integrazione
numerica delle eq. differenziali" :)
Cerca in Google con parole chiave "numerical integration" e
"differential equations" e troverai un sacco di roba...
 
------------------------------
Elio Fabri
Dip. di Fisica - Univ. di Pisa
------------------------------

 migliore del Runge-Kutta, no?
Vero. Perche' e' un algoritmo simplettico :-)
Simplettici, nella mia frase, era comunque riferito a metodi ed era 
usato come "nome" di una classe di algoritmi. Altrimenti dovrei 
impelagarmi nella spiegazione di cosa sono i sistemi simplettici che, in 
questo contesto mi sembrava fuori luogo.
Giorgio