Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Pendolo Sferico

  1. #1

    Pendolo Sferico

    Ciao a tutti.

    Sto facendo una simulazione in C++ di sistemi fisici semplici e mi piacerebbe simulare un pendolo sferico. Il problema é che le equazioni che ho trovato in internet (che danno le derivate seconde dei due angoli a partire dagli angoli stessi e dalle loro derivate prime) sono solo per un pendolo soggetto alla forza di gravità e senza attrito.

    A me servirebbero le equazioni con attrito e che tengono conto di una qualunque (alla forza di gravità voglio aggiungere anche quella di Archimede e magari mettere un ventilatore che spinge il pendolo quando questa entra nel suo campo d'azione, un campo magnetico, ...).

    Qualcuno sa dove posso trovarle?

    Grazie,
    R.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  2. #2
    La forza di Archimede è facile facile, aggiungi una forza diretta verso l'alto di intensità pari alla forza peso che eserciterebbe un volume d'aria pari a quello del tuo pendolo; prendendo l'asse z come verticale e diretto verso l'alto,


    L'attrito in un fluido di un corpo che si muove a bassa velocità si modellizza normalmente come una forza proporzionale e opposta alla velocità in cui il corpo si sta muovendo:
    ; in particolare, dai un'occhiata qui per i casi particolari.

    Il ventilatore direi che vada gestito sempre con l'attrito fluido, usando però, invece della velocità del pendolo rispetto al sistema-laboratorio, la velocità rispetto all'aria.

    La risposta ad un campo magnetico dipende da diversi fattori (in particolare, com'è il campo magnetico, di che materiale è il pendolo).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    La forza di Archimede è facile facile, aggiungi una forza diretta verso l'alto di intensità pari alla forza peso che eserciterebbe un volume d'aria pari a quello del tuo pendolo; prendendo l'asse z come verticale e diretto verso l'alto,


    L'attrito in un fluido di un corpo che si muove a bassa velocità si modellizza normalmente come una forza proporzionale e opposta alla velocità in cui il corpo si sta muovendo:
    ; in particolare, dai un'occhiata qui per i casi particolari.

    Il ventilatore direi che vada gestito sempre con l'attrito fluido, usando però, invece della velocità del pendolo rispetto al sistema-laboratorio, la velocità rispetto all'aria.

    La risposta ad un campo magnetico dipende da diversi fattori (in particolare, com'è il campo magnetico, di che materiale è il pendolo).
    Scusa, credo di essermi spiegato male. Le forze so come sono fatte e come scriverle in codice. Per esempio ho creato una classe Gravita che prende come argomento un vettore (intensità e direzione del campo) e un valore (densità dell'aria) e che ha una funzione per aggiungere tale forza al mio oggetto. Stessa cosa farei con le altre forze. Quindi ogni oggetto ha un attributo Forza che é la somma risultante di tutti i campi di forza applicati (campo gravitazionale, campo elettrico, "vento" del ventilatore, ...). In questa somma però non vi é l'attrito, che preferisco passare come parametro all'oggetto stesso. Quindi nell'equazione del moto scompongo la forza totale in forze esterne e forza d'attrito:

    $$ \vec{F}_\text{tot} = \vec{F}_\text{att} + \vec{F}_\text{ext} = -b\vec{v} + \vec{F}_\text{ext}$$

    Quello che mi serve é l'espressione di $\theta''$ e $\phi''$ in funzione di $b$, $\vec{F}_\text{tot}$, $\theta'$, $\theta$, $\phi'$, $\phi$ e le variabili geometriche del pendolo (m, L), come ho per esempio per un pendolo piano:

    $$\Omega = \frac{1}{mL} (\cos(\Omega)\overline{F}_{ext}\ \overline{d} − \sin(\Omega) \overline{F}_{ext}\ \frac{\overline{g}}{g} − \frac{b}{L} \Omega'$$



    Ps: Come hai fatto a scrivere le formule matematiche? Ho provato con la sintassi di LaTeX ma nada...
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  4. #4
    Non ho capito, tu vuoi scrivere direttamente la legge oraria del pendolo sferico con anche dentro l'attrito? Credevo che nel tuo programma usassi un qualche metodo di risoluzione numerica delle equazioni differenziali (es. Runge Kutta) per simulare il moto...

    Trovare una soluzione analitica non credo sia immediato, dato che con l'attrito ti vengono meno le condizioni per poter risolvere il problema in maniera semplice con il formalismo lagrangiano.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Originariamente inviato da MItaly
    Non ho capito, tu vuoi scrivere direttamente la legge oraria del pendolo sferico con anche dentro l'attrito? Credevo che nel tuo programma usassi un qualche metodo di risoluzione numerica delle equazioni differenziali (es. Runge Kutta) per simulare il moto...
    No, non la legge oraria. Utilizzo infatti un integratore di Eulero progressivo (aggiungerò poi Newmark e Runge Kutta), quindi mi serve l'equazione per trovare le derivate seconde.

    Concretamente, per una palla, la sua equazione del movimento é semplicemente

    a = P'' = F_ext / m

    dove P = (x,y,z). Ho quindi una funzione evoluzione() che ritorna il vettore accelerazione (ossia il vettore derivata seconda dei tre gradi di liberà spaziali, x, y, z). Nel pendolo sferico i gradi di libertà sono due e avrei bisogno di trovare l'espressione matematica che mi da la derivata seconda dei due gradi di libertà (i due angoli), che farei ritornare dalla funzione evoluzione(). L'integratore utilizza poi le derivate seconde per calcolare i nuovi angoli e le nuove derivate prime degli angoli (questi ultimi due vettori sono attributi).

    Quello però che voglio fare é dividere le forze esterne e l'attrito. Le forze esterne date da campi di forza sono salvate in un vettore attributo del mio oggetto, mentre per l'attrito vorrei che fosse già codificato nelle equazioni differenziali del moto di modo che basta dare all'oggetto il valore b (coefficiente d'attrito per lo smorzamento) come attributo.

    Così é più chiaro? Se vuoi posso anche allegare il progetto intero...

    Grazie,
    R.
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  6. #6
    Non capisco dove sta il problema, perché non ti limiti semplicemente a sommare -bv/m all'accelerazione al momento di integrare con Eulero? La v già ce la dovresti avere, se, come dovresti fare, stai riducendo il sistema di equazioni differenziali del second'ordine ad uno vettoriale al prim'ordine come spiegato qui...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da MItaly
    Non capisco dove sta il problema, perché non ti limiti semplicemente a sommare -bv/m all'accelerazione al momento di integrare con Eulero? La v già ce la dovresti avere, se, come dovresti fare, stai riducendo il sistema di equazioni differenziali del second'ordine ad uno vettoriale al prim'ordine come spiegato qui...
    Perché ridurlo a uno di primo ordine? Rimane piuttosto facile risolvere quello di secondo ordine. Solo che non conosco le relazioni per \theta'' e \phi''. Ho infatti aggiunto la forza di attrito con la velocità espressa in coordinate sferiche e chiaramente, tendo conto del fatto che R=cste., si ottiene che l'attrito agisce solamente nelle componenti theta e phi (ovvio). Poi però non so come comportarmi con la somma delle forze esterne... Se le proietto in coordinate sferiche sono a posto?

    Posto il codice C++ del pendolo piano e dell'integratore per fare chiarezza, anche se siamo in OT: il discorso non riguarda il codice ma la situazione fisica in generale! ; ).

    codice:
    #ifndef PENDOLOPIANO_H
    #define PENDOLOPIANO_H
    
    #include "Pendolo.h"
    
    class PendoloPiano : public Pendolo
    {
    public:
    	// --- COSTRUTTORI ---
    	PendoloPiano(const Vettore&, const Vettore&, double, double, const Vettore&, const Vettore&, const Vettore&, double, double, double = 1, double = 1);
    	PendoloPiano(const vector&, const vector&, double, double, const vector&, const vector&, const vector&, double, double, double = 1, double = 1);
    	PendoloPiano(const list&, const list&, double, double, const list&, const list&, const list&, double, double, double = 1, double = 1);
    
    	// --- METODI ---
    	Vettore evoluzione() const;
    	
    	Vettore get_posizione() const;
    	Vettore get_velocita() const;
    };
    
    #endif
    codice:
    #include "PendoloPiano.h"
    
    #include <cmath>
    
    // *** PUBLIC ***
    
    // --- COSTRUTTORI ---
    PendoloPiano::PendoloPiano(const Vettore& p, const Vettore& v, double r, double m, const Vettore& f, const Vettore& O, const Vettore& d, double L, double b, double a, double mu)
    : Pendolo(p,v,r,m,f,O,d,L,b,a,mu)
    {}
    
    PendoloPiano::PendoloPiano(const vector& p, const vector& v, double r, double m, const vector& f, const vector& O, const vector& d, double L, double b, double a, double mu)
    : Pendolo(p,v,r,m,f,O,d,L,b,a,mu)
    {}
    
    PendoloPiano::PendoloPiano(const list& p, const list& v, double r, double m, const list& f, const list& O, const list& d, double L, double b, double a, double mu)
    : Pendolo(p,v,r,m,f,O,d,L,b,a,mu)
    {}
    
    // --- METODI ---
    
    Vettore PendoloPiano::evoluzione() const
    {
    	Vettore g({0,0,-1});
    	Vettore r({	(1 / (massa * lunghezza)) *
    				( std::cos(omega[0]) * forza * direzione
    				- std::sin(omega[0]) * forza * g
    				- (b / lunghezza) * omega_[0]) });
    				
    	return r;
    }
    	
    Vettore PendoloPiano::get_posizione() const
    {
    	Vettore g({0,0,-1});
    	
    	return origine + lunghezza * std::cos(omega[0]) * g + lunghezza * std::sin(omega[0]) * direzione;
    }
    
    Vettore PendoloPiano::get_velocita() const
    {
    	Vettore g({0,0,-1});
    	
    	return lunghezza * omega_[0] * ( std::cos(omega[0]) * direzione - std::sin(omega[0]) * g );
    }
    codice:
    #include "IntegratoreEulero.h"
    
    // *** PUBLIC ***
    
    // --- COSTRUTTORI ---
    IntegratoreEulero::IntegratoreEulero(double t)
    : Integratore(t)
    {}
    
    // --- METODI ---
    
    void IntegratoreEulero::integra(OggettoMobile& OM) const
    {
    	OM.set_omega_( OM.get_omega_() + dt * OM.evoluzione() );
    	OM.set_omega( OM.get_omega() + dt * OM.get_omega_() );
    }
    Il metodo evoluzione() ritorna un Vettore ad un unica componente contenente l'accelerazione angolare dell'angolo del pendolo piano (suo unico grado di libertà), e l'integratore utilizza questa funzione per calcolare poi la velocità angolare e l'angolo. EDIT: Il pendolo piano eredita da Pendolo che eredita da OggettoMobile. omega é il Vettore contenente i gradi di libertà dell'OggettoMobile, mentre il vettore omega_ é contiene la derivata prima di questi gradi di libertà.

    Quello che mi serve é capire, fisicamente, come é esattamente il metodo evoluzione(), in pratica quali sono le espressioni delle accelerazioni angolare dei due angoli del pendolo sferico (suoi gradi di libertà). Su internet li ho trovati ma spesso non c'é l'attrito (che voglio far apparire esplicitamente in modo da dover specificare solo b) e spesso l'unica forza applicata é quella di gravità, quindi nelle equazioni appare la costante g e non il vettore (o la sua proiezione) della somma di forze applicate al pendolo...
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  8. #8
    UP
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  9. #9
    UP
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

  10. #10
    UP
    K. L. Thompson
    You can't trust code that you did not totally create yourself.
    A. Bogk
    UNIX is user-friendly, it just chooses its friends.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.