venerdì 20 marzo 2009

Esercizio: Simulazione 2 - conservazione approssimativa energia

In questo esempio l'oscillatore è 1-dimensionale. Il programma c++ allegato è simile al precedente ma più semplice (in pratica ho tolto un po' di righe). Oltre ai valori di x(t), nelle colonne di dati sono riportate anche l'energia potenziale, cinetica e totale. Come visibile nei numeri e nei diagrammi, a causa della tecnica approssimata l'energia totale fluttua in modo periodico e sistematico attorno a quello che dovrebbe essere un valore costante (si sballa di più/meno 10 percento).

Simulazione 2

Esercizio: Cerca di riprodurre questi numeri e le figure.

5 commenti:

  1. Non mi è chiara una cosa, come faccio a determinare la velocità iniziale, cioè come arrivo da 10 a 9.7 al primo step. Io so che k = 3 e so che la forza quindi è -kx cioè 30 N. Devo approssimare la velocità iniziale con l'accelerazione iniziale?

    RispondiElimina
  2. In questa simulazione, nel listato dati è "saltata" la prima riga, quella relativa al tempo zero. La prima riga pubblicata si riferisce al tempo 0.1. AB

    RispondiElimina
  3. OK ma non ho capito come si fa a passare da 10 a 9,7....

    RispondiElimina
  4. cioè non ho capito come si fa a ricavare la velocità iniziale con quale formula.....

    RispondiElimina
  5. La risposta è nella funzione next, alla riga 28 del programma:

    void next(double dt, double fx) {
    //accelerazione n
    ax = fx/mass;
    //velocità n+1
    vx = vx + ax*dt;
    //posizione n+1
    x = x + vx*dt;
    }

    Sarebbe perfettamente lecito scrivere questa funzione al contrario:

    void next(double dt, double fx) {
    //posizione n+1
    x = x + vx*dt;
    //velocità n+1
    vx = vx + ax*dt; //accelerazione n
    ax = fx/mass;
    }

    ed in tal caso la velocità al tempo 0.1 sarebbe 0.

    Nota di programmazione: in c++ le due scritture della funzione next funzionano entrambe, in c nel primo caso la funzione next va bene quasi così com'è, nel secondo occorre definire x, vx ed ax come static, in modo che conservino ad ogni giro della funzione il valore che avevano al giro precedente. Oppure definirle come variabili globali (ad inizio programma, fuori da ogni funzione). Quest'ultima è una pratica MOLTO pericolosa, e va contro quel principio per cui uno vorrebbe usare facilmente in un programma le funzioni che aveva messo in un altro. AB

    RispondiElimina