Magazine Tecnologia

Simulazione di Fisica: Sistema Massa-Molla

Creato il 08 novembre 2011 da Italiangeek

In questi giorni facendo un po’ di ordine nel mio personale materiale di studi, ho trovato alcuni appunti di fisica, tra questi oltre ad una parte teorica, ci sono una serie di applet in Java che ho sviluppato. Ho pensato che piuttosto che tenerli rinchiusi nel mio hard disk magari possono essere utili a qualche studente. Oggi parliamo di una simulazione di un Sistema Massa-Molla, in fondo alla pagina trovate l’applet in Java e il codice usato per crearla. Spero vi torni utile.

DESCRIZIONE SIMULAZIONE

L’esperimento consiste in una molla attaccata ad una estremità ad una massa ed imperniata in un muro all’estremità opposta. L’esperimento viene eseguito immerso in un fluido.

Simulazione di Fisica: Sistema Massa-Molla
Simulazione di Fisica: Sistema Massa-Molla

Sappiamo benissimo che in un sistema di tale tipo se la massa è spostata dalla sua posizione d’equilibrio (nella quale la molla non è affatto deformata), e se la superficie ha un coefficiente d’attrito nullo, cioè, non si ha attrito fra la massa in movimento e la superficie, allora si otterrà un moto armonico puro. Per capire l’origine di questo moto bisogna ricordare che quando la massa è spostata da un tratto x dall’equilibrio, la molla esercita su di essa, in accordo con la legge di Hooke, una forza F = -k*x, ove k è la costante elastica della molla, ed F è sempre opposta allo spostamento ed è detta forza di richiamo.

Si ha che:

Simulazione di Fisica: Sistema Massa-Molla
essa è la frequenza angolare dell’oscillatore in assenza di forza frenante. Come ci si attende la frequenza è maggiore per molle più dure e diminuisce all’aumentare della massa, e se vi è attrito, all’aumentare del coefficiente d’attrito. Applicando la seconda legge di Newton al nostro sistema in esame si ha che:

Simulazione di Fisica: Sistema Massa-Molla

dove m è il coefficiente d’attrito radente fra base della massa e la superficie, che è statico se la massa è ferma è dinamico se la massa è in movimento. Supporremo che m =b, cioè che il coefficiente d’attrito radente è uguale al coefficiente d’attrito fra la massa ed il fluido dove è immerso l’esperimento.

da cui differenziando si ottiene che :

Simulazione di Fisica: Sistema Massa-Molla

Dove:

  • F = sommatoria delle forze lungo l’asse x del sistema;
  • v = velocità istantanea della massa;
  • a = accelerazione istantanea della massa;
  • A = ampiezza oscillazione;
  • x = spostamento orizzontale della massa;
  • b = coefficiente d’attrito fra massa e fluido;
  • k = costante elastica della molla;
  • t = tempo;
  • w = frequenza angolare quando b=0;

Per quanto riguarda l’energia di un oscillatore armonico di codesto tipo, si noterà che se si è in presenza di un coefficiente d’attrito nullo allora l’energia meccanica totale del sistema si conserverà trasformandosi continuamente da energia potenziale immagazzinata nella molla in energia cinetica della massa e viceversa. In presenza invece di un coefficiente d’attrito non nullo una parte di energia verrà dispersa sotto forma di calore per effetto dell’attrito fra la massa e la superficie. Nei sistemi reali tuttavia sono sempre presenti forze dissipative come l’attrito, che dissipano e ritardano il moto del sistema massa molla. In questi casi il moto si dirà smorzato.

Verificheremo questi tre seguenti casi:

OSCILLATORE SOTTOSMORZATO

Quando la forza dissipativa è piccola rispetto a quella di richiamo, il moto conserva il carattere oscillatorio ma la ampiezza delle vibrazioni diminuisce con il tempo ed alla fine il moto cesserà. Il grafico ci mostrerà che in questi casi l’ampiezza delle oscillazioni decresce esponenzialmente nel tempo. In questo caso si ha inoltre che:

Simulazione di Fisica: Sistema Massa-Molla
OSCILLATORE CRITICAMENTE SMORZATO

Si ha quando il coefficiente d’attrito ha un valore maggiore o uguale al valore critico, in questo caso il sistema non oscilla più e torna in equilibrio in modo esponenziale. In questo caso si ha che:

Simulazione di Fisica: Sistema Massa-Molla
OSCILLATORE SOVRASMORZATO

Si ha quando il sistema è talmente viscoso che la forza frenante è maggiore della forza di richiamo, in tal caso il sistema non oscilla ma ritorna verso la posizione d’equilibrio. In questo caso si ha che:

Simulazione di Fisica: Sistema Massa-Molla

Esamineremo solo il 1° di questi tre casi.

Inoltre si possono considerare nel sistema due diversi tipi di coefficienti d’attrito, e quindi due diverse forze d’attrito:

Forza d’attrito cinetica

dovuta all’attrito fra la massa in moto e la “rugosità” della superficie piana di scorrimento (essa sarà presente solamente quando la massa è in movimento) pari ad bc*v con bc coefficiente d’attrito cinetico e v velocità istantanea.

Forza d’attrito statica

dovuta all’attrito fra la massa “ferma” e la “rugosità” della superficie piana di scorrimento (essa scomparirà naturalmente non appena la massa sarà in movimento, quindi soltanto se la forza d’attrito statica è minore della forza di richiamo della molla) pari ad bs*m*g con bs coefficiente d’attrito statico m massa ed g accelerazione di gravità. Essa inoltre si trasformerà in forza d’attrito dinamica non appena la massa sarà in movimento, cioè bs diverrà bc.

Simulazione

Per effettuare una simulazione ci affidiamo ad un applet scritta in Java, di seguito qualche riga su come usarla:

Si sposti la massa dal suo stato equilibrio lungo l’asse delle ascisse, cliccando sulla massa con il tasto sinistro del mouse, e rilasciando la stessa per far iniziare il moto. Si può modificare la massa, la costante elastica della molla k (che quantifica la rigidità della molla), e lo smorzamento. L’incremento o il decremento della massa può essere effettuato sostituendo il valore di default della casella testo inerente in basso con un valore arbitrario, e premendo infine il pulsante “Aggiorna”. L’incremento o il decremento della costante elastica e del coefficiente d’attrito può avvenire in modo del tutto analogo al precedente.

Valori iniziali di default delle variabili:

  • Massa = 10 Kg;
  • Costante elastica k = 100;
  • Coefficiente d’attrito = 0.5;
Per avviare l’applet trascinare la massa cliccando con il tasto sinistro del mouse e quindi rilasciare il tasto:


di seguito il codice Java della applet

// Autore: Massimo Orazio Spata
// http://www.italiangeek.com
import java.applet.Applet;
import java.awt.*;
public class Massamolla extends Applet
    implements Runnable
{
    public void init()
    {
        setLayout(new BorderLayout(20, 20));
        Panel p1 = new Panel();
        p1.setLayout(new GridLayout(1, 7));
        i1 = new TextField(String.valueOf(massa), 5);
        i2 = new TextField(String.valueOf(k), 5);
        i3 = new TextField(String.valueOf(attritocinetico), 5);
        b7 = new Button("Aggiorna");
        b8 = new Button("Pausa");
        b9 = new Button("Graf.1");
        b0 = new Button("Graf.2");
        l1 = new Label("Massa");
        l3 = new Label("Attrito");
        l2 = new Label("Cost. elast.");
        p1.add(b7);
        p1.add(b8);
        p1.add(b9);
        p1.add(b0);
        p1.add(l1);
        p1.add(i1);
        p1.add(l2);
        p1.add(i2);
        p1.add(l3);
        p1.add(i3);
        add("South", p1);
        t = new Thread(this);
        t.start();
    }
    public void paint(Graphics g)
    {
        d = size();
        update(g);
    }
    public boolean mouseDrag(Event e, int mDx, int mDy)
    {
        if(mDy > 100 & mDy < 150)
        {
            tempo1 = 0;
            set = 0;
            if(mDx > 300)
                x = 300;
            else
            if(mDx < 100)
                x = 100;
            else
                x = mDx;
            mx = x;
            inx = x;
            repaint(150L);
            return true;
        } else
        {
            return false;
        }
    }
    public boolean mouseUp(Event e, int mDx, int mDy)
    {
        set = 1;
        offGraphics.setColor(Color.gray);
        offGraphics.fillRect(d.width / 2, 0, d.width / 2, d.height);
        return true;
    }
    public boolean action(Event e, Object o)
    {
        if(e.target instanceof Button)
        {
            if(o.equals("Aggiorna"))
                doStartUpdate();
            else
            if(o.equals("Pausa"))
                doPauseResume();
            else
            if(o.equals("Graf.1"))
                scelta = true;
            else
            if(o.equals("Graf.2"))
                scelta = false;
        } else
        {
            return super.action(e, o);
        }
        return true;
    }
    private void scegligraf1()
    {
        offGraphics.setColor(Color.red);
        offGraphics.fillOval(d.width / 2 + 10 + tempo, mx - 51, 2, 2);
        x1 = d.width / 2 + 10 + tempo;
        y1 = mx - 51;
        x2 = x1;
        y2 = y1;
    }
    private void scegligraf2()
    {
        x1 = d.width / 2 + 10 + tempo;
        y1 = mx - 51;
        offGraphics.setColor(new Color(0, 255, 255));
        if(tempo == 0)
            offGraphics.drawLine(x1, y1, x1, y1);
        else
            offGraphics.drawLine(x2, y2, x1, y1);
        x2 = x1;
        y2 = y1;
    }
    private void doStartUpdate()
    {
        if(set == 0)
        {
            massa = Double.valueOf(i1.getText()).doubleValue();
            k = Double.valueOf(i2.getText()).doubleValue();
            attritocinetico = Double.valueOf(i3.getText()).doubleValue();
            attritostatico = attritocinetico + 0.10000000000000001D;
            t.start();
            set = 1;
            return;
        } else
        {
            t.suspend();
            massa = Double.valueOf(i1.getText()).doubleValue();
            k = Double.valueOf(i2.getText()).doubleValue();
            attritocinetico = Double.valueOf(i3.getText()).doubleValue();
            attritostatico = attritocinetico + 0.10000000000000001D;
            t.resume();
            return;
        }
    }
    private void doPauseResume()
    {
        if(set1 == 0)
        {
            t.suspend();
            set1 = 1;
            return;
        } else
        {
            t.resume();
            set1 = 0;
            return;
        }
    }
    public void run()
    {
        do
        {
            do
            {
                double freq = Math.sqrt(k / 100D / massa);
                int a = (int)((double)(inx - 200) * Math.exp(((double)tempo1 * attritocinetico * -1D) / (2D * massa)) * Math.cos((double)tempo1 * freq));
                if(k == 0.0D || attritostatico * massa * 9.8100000000000005D >= (k / 100D) * (double)Math.abs(inx - 200))
                    mx = inx;
                else
                    mx = 200 + a;
            } while(set == 0);
            repaint();
            try
            {
                Thread.sleep(150L);
            }
            catch(InterruptedException _ex) { }
            tempo1 = tempo1 + 1;
        } while(true);
    }
    private void getHtmlInput()
    {
        massa = Double.valueOf(getParameter("massa")).doubleValue();
        k = Double.valueOf(getParameter("k")).doubleValue();
        attritocinetico = Double.valueOf(getParameter("attritocinetico")).doubleValue();
    }
    public void update(Graphics g)
    {
        if(offGraphics == null || d.width != offDimension.width || d.height != offDimension.height)
        {
            offDimension = d;
            offImage = createImage(d.width, d.height);
            offGraphics = offImage.getGraphics();
        }
        boolean flag1 = attritostatico * massa * 9.8100000000000005D >= (k / 100D) * (double)Math.abs(inx - 200);
        boolean flag2 = attritocinetico / (2D * massa) < Math.sqrt(k / 100D / massa);
        if(k == 0.0D)
        {
            offGraphics.setColor(Color.yellow);
            offGraphics.drawString("Attenzione Costante elastica nulla ...", 500, 270);
        } else
        if(flag1)
        {
            offGraphics.setColor(Color.green);
            offGraphics.drawString("Attenzione forza di attrito statica maggiore forza di richiamo", 400, 270);
        } else
        if(flag2)
        {
            offGraphics.setColor(Color.red);
            offGraphics.drawString("Oscillatore sottosmorzato...", 500, 270);
        }
        offGraphics.setColor(Color.black);
        offGraphics.fillRect(0, 0, d.width / 2, d.height);
        offGraphics.setColor(new Color(255, 255, 100));
        offGraphics.drawLine(50, 100, 50, 150);
        offGraphics.drawLine(50, 150, 350, 150);
        offGraphics.drawLine(40, 140, 40, 90);
        offGraphics.drawLine(40, 90, 50, 100);
        offGraphics.drawLine(50, 140, 340, 140);
        offGraphics.drawLine(350, 150, 340, 140);
        offGraphics.drawLine(40, 90, 30, 90);
        offGraphics.drawLine(50, 100, 40, 100);
        offGraphics.drawLine(40, 160, 50, 160);
        offGraphics.drawLine(40, 100, 40, 160);
        offGraphics.drawLine(40, 100, 30, 90);
        offGraphics.drawLine(30, 90, 30, 150);
        offGraphics.drawLine(350, 150, 350, 160);
        offGraphics.drawLine(50, 150, 50, 160);
        offGraphics.drawLine(50, 160, 350, 160);
        offGraphics.drawLine(30, 150, 40, 160);
        offGraphics.setColor(Color.black);
        offGraphics.drawString("Spazio", d.width / 2 + 13, d.height - 270);
        offGraphics.drawString("Tempo", d.width - 45, d.height / 2 + 15);
        offGraphics.setColor(Color.blue);
        offGraphics.drawLine(offDimension.width / 2 + 10, offDimension.height / 2, offDimension.width - 10, offDimension.height / 2);
        offGraphics.drawLine(offDimension.width / 2 + 10, 15, offDimension.width / 2 + 10, 270);
        offGraphics.setColor(Color.black);
        offGraphics.drawString("0", 376, offDimension.height / 2 + 15);
        tempo = tempo1 * 2;
        if(scelta)
            scegligraf2();
        else
            scegligraf1();
        offGraphics.setColor(new Color(255, 230, 0));
        int coordx6[] = {
            40, 340, 350, 50
        };
        int coordy6[] = {
            140, 140, 150, 150
        };
        offGraphics.fillPolygon(coordx6, coordy6, 4);
        offGraphics.setColor(new Color(255, 255, 100));
        int coordx3[] = {
            50, 40, 40, 350, 350, 50
        };
        int coordy3[] = {
            100, 100, 160, 160, 150, 150
        };
        offGraphics.fillPolygon(coordx3, coordy3, 6);
        offGraphics.setColor(new Color(255, 230, 0));
        int coordx4[] = {
            50, 40, 30, 40
        };
        int coordy4[] = {
            100, 90, 90, 100
        };
        offGraphics.fillPolygon(coordx4, coordy4, 4);
        offGraphics.setColor(new Color(255, 150, 20));
        int coordx5[] = {
            40, 30, 30, 40
        };
        int coordy5[] = {
            100, 90, 150, 160
        };
        offGraphics.fillPolygon(coordx5, coordy5, 4);
        offGraphics.setColor(getBackground());
        offGraphics.drawLine(mx - 10, 140, mx + 50, 140);
        if(mx > 289)
            offGraphics.drawLine(340, 140, mx + 50, mx - 150);
        offGraphics.setColor(Color.red);
        offGraphics.drawRect(mx, 100, 50, 50);
        offGraphics.drawLine(mx, 150, mx - 10, 140);
        offGraphics.drawLine(mx - 10, 140, mx - 10, 90);
        offGraphics.drawLine(mx - 10, 90, mx, 100);
        offGraphics.drawLine(mx - 10, 90, mx + 40, 90);
        offGraphics.drawLine(mx + 40, 90, mx + 50, 100);
        int coordx[] = {
            mx, mx, mx + 50, mx + 50
        };
        int coordy[] = {
            150, 100, 100, 150
        };
        offGraphics.fillPolygon(coordx, coordy, 4);
        offGraphics.setColor(new Color(150, 0, 0));
        int coordx1[] = {
            mx - 10, mx - 10, mx, mx
        };
        int coordy1[] = {
            140, 90, 100, 150
        };
        offGraphics.fillPolygon(coordx1, coordy1, 4);
        offGraphics.setColor(new Color(200, 0, 0));
        int coordx2[] = {
            mx - 10, mx + 40, mx + 50, mx
        };
        int coordy2[] = {
            90, 90, 100, 100
        };
        offGraphics.fillPolygon(coordx2, coordy2, 4);
        spazio = (mx - 75) / 11;
        offGraphics.setColor(ltblue);
        offGraphics.drawLine(60 + spazio, 130, 60 + 2 * spazio, 110);
        offGraphics.drawLine(59 + spazio, 130, 59 + 2 * spazio, 110);
        offGraphics.drawLine(61 + spazio, 130, 61 + 2 * spazio, 110);
        offGraphics.drawLine(60 + 3 * spazio, 130, 60 + 4 * spazio, 110);
        offGraphics.drawLine(59 + 3 * spazio, 130, 59 + 4 * spazio, 110);
        offGraphics.drawLine(61 + 3 * spazio, 130, 61 + 4 * spazio, 110);
        offGraphics.drawLine(60 + 5 * spazio, 130, 60 + 6 * spazio, 110);
        offGraphics.drawLine(61 + 5 * spazio, 130, 61 + 6 * spazio, 110);
        offGraphics.drawLine(59 + 5 * spazio, 130, 59 + 6 * spazio, 110);
        offGraphics.drawLine(60 + 7 * spazio, 130, 60 + 8 * spazio, 110);
        offGraphics.drawLine(61 + 7 * spazio, 130, 61 + 8 * spazio, 110);
        offGraphics.drawLine(59 + 7 * spazio, 130, 59 + 8 * spazio, 110);
        offGraphics.drawLine(60 + 9 * spazio, 130, 60 + 10 * spazio, 110);
        offGraphics.drawLine(61 + 9 * spazio, 130, 61 + 10 * spazio, 110);
        offGraphics.drawLine(59 + 9 * spazio, 130, 59 + 10 * spazio, 110);
        offGraphics.setColor(Color.blue);
        offGraphics.drawLine(50, 120, 60, 120);
        offGraphics.drawLine(50, 121, 60, 121);
        offGraphics.drawLine(50, 119, 60, 119);
        offGraphics.drawLine(60 + 11 * spazio, 120, mx - 5, 120);
        offGraphics.drawLine(60 + 11 * spazio, 121, mx - 5, 121);
        offGraphics.drawLine(60 + 11 * spazio, 119, mx - 5, 119);
        offGraphics.drawLine(60, 120, 60 + spazio, 130);
        offGraphics.drawLine(60, 121, 59 + spazio, 130);
        offGraphics.drawLine(60, 119, 61 + spazio, 130);
        offGraphics.drawLine(60 + 2 * spazio, 110, 60 + 3 * spazio, 130);
        offGraphics.drawLine(59 + 2 * spazio, 110, 59 + 3 * spazio, 130);
        offGraphics.drawLine(61 + 2 * spazio, 110, 61 + 3 * spazio, 130);
        offGraphics.drawLine(60 + 4 * spazio, 110, 60 + 5 * spazio, 130);
        offGraphics.drawLine(59 + 4 * spazio, 110, 59 + 5 * spazio, 130);
        offGraphics.drawLine(61 + 4 * spazio, 110, 61 + 5 * spazio, 130);
        offGraphics.drawLine(60 + 6 * spazio, 110, 60 + 7 * spazio, 130);
        offGraphics.drawLine(59 + 6 * spazio, 110, 59 + 7 * spazio, 130);
        offGraphics.drawLine(61 + 6 * spazio, 110, 61 + 7 * spazio, 130);
        offGraphics.drawLine(60 + 8 * spazio, 110, 60 + 9 * spazio, 130);
        offGraphics.drawLine(59 + 8 * spazio, 110, 59 + 9 * spazio, 130);
        offGraphics.drawLine(61 + 8 * spazio, 110, 61 + 9 * spazio, 130);
        offGraphics.drawLine(60 + 10 * spazio, 110, 60 + 11 * spazio, 120);
        offGraphics.drawLine(61 + 10 * spazio, 110, 60 + 11 * spazio, 119);
        offGraphics.drawLine(59 + 10 * spazio, 110, 60 + 11 * spazio, 121);
        g.drawImage(offImage, 0, 0, this);
    }
    public Massamolla()
    {
        massa = 10D;
        k = 100D;
        x = 200;
        inx = 200;
        mx = 200;
        freq = Math.sqrt(k / 100D / massa);
        attritocinetico = 0.5D;
        attritostatico = 0.60000000000000009D;
        scelta = true;
        ltblue = new Color(0, 150, 255);
    }
    Dimension offDimension;
    Dimension d;
    Image offImage;
    Graphics offGraphics;
    int tempo1;
    int tempo;
    double massa;
    double k;
    int set;
    int set1;
    int spazio;
    int x;
    int x1;
    int x2;
    int y1;
    int y2;
    int inx;
    int mx;
    double freq;
    double attritocinetico;
    double attritostatico;
    boolean scelta;
    Color ltblue;
    Thread t;
    Button b7;
    Button b8;
    Button b9;
    Button b0;
    Label l1;
    Label l2;
    Label l3;
    TextField i1;
    TextField i2;
    TextField i3;
}

Download
Massamolla.java
Massamolla.class

Articoli Simili:

  1. Ninite: Il sistema più facile e veloce per aggiornare e installare il software (Windows)
  2. 10Gb sul cloud gratis con Minus

Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :