IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Simulation temps réel d'un pendule


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Simulation temps réel d'un pendule
    Salut à tous,
    Je m'attaque cette fois-ci à la réalisation d'une simulation sur ordinateur d'un pendule tout simple.
    Sans vouloir utiliser les moteurs physiques existants je désire bien comprendre le mécanisme en le programmant moi-même.

    Donc j'ai deux particules, le premier est fixé au mur en hauteur, et le deuxième est à une certaine distance du premier. C'est cette deuxième particule (que j'assimile à un point P de masse m pour faire une étude ponctuelle) qui se balancera de gauche à droite, elle fera un demi arc de cercle vers le bas de la 1ere particule qui est fixe.

    Remarque : On considérera qu'une tige d'une certaine longueur et indéformable relie la particule 1 à la 2

    Les forces qui s'appliquent sur la particule sont : le POIDS (m*g) vers le bas et la REACTION de la tige qui maintien la 2eme particule à égale distance de la 1ere.
    C'est cette force de réaction qui me pose probleme car lors du balancement la longueur de la tige augmente jusuq'a un moment ou le système diverge

    Je vous montre le code pour trouver la force de réaction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	vecteur v12;
    	vecteur v12normalise;
    	float normeV12;
     
    	Cercle * obj1 = cercle1;
    	Cercle * obj2 = cercle2;
     
    	v12.InitEnMetre(obj1->vPos.x - obj2->vPos.x, obj1->vPos.y - obj2->vPos.y);
    	normeV12 = sqrt(v12.x*v12.x + v12.y*v12.y);
    	v12normalise.x = v12.x / normeV12;
    	v12normalise.y = v12.y / normeV12;
     
    	float produitscal;
    	produitscal = v12normalise.x*0.0f + v12normalise.y*1.0f; // produit scalaire entre deux vecteurs normalisés (le poids et la réaction)
    	obj->vReaction.x = -3.0f*produitscal * obj->vPoids.y * v12normalise.x;
    	obj->vReaction.y = -3.0f*produitscal * obj->vPoids.y * v12normalise.y; // je pense plus à -2.0f * ... mais ca marche mieux avec -3.0f
    Donc pour résumé j'ai calculer le vecteur direction de la force de réaction (qui passe par l'axe des deux particules), puis j'ai calculé le produit scalaire entre le poids et cette direction afin de déterminer la réaction qui doit compenser la force du poids.

    Plusieurs problèmes restent sans réponse:
    1/ Lorsque le produit scalaire entre le poids et le vecteur portant la réaction vaut 1 (donc lorsqu'ils sont sur le même axe) il suffit de mettre R = -M*G afin de compenser le poids. Mais cette formule ne marche que si l'on place la 2eme particule exactement à -90° (-pi/2 centre trigo) car si l'on place la particule plus haut, la distance augmente allégrement car il faut compenser - en plus du poids - la vitesse à laquelle elle tombe.

    Quelle autre méthode utilisé afin d'avoir un résultat vraie et en restant en temps réel c'est a dire que d'autres forces viendront se rajouter a celles ci et pas en continu (j'utilise RK4 pour l'intégration numérique)

    Bon je m'arrête la, je pense que vous voyez d'ou vient mon problème qui a première vue peu paraître simple.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ta question n'a aucun rapport avec OpenGL, je déplace dans le forum Algorithmes.

  3. #3
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut Re: Simulation temps réel d'un pendule
    Salut,

    Citation Envoyé par dnaprotector
    Remarque : On considérera qu'une tige d'une certaine longueur et indéformable relie la particule 1 à la 2
    ...
    C'est cette force de réaction qui me pose probleme car lors du balancement la longueur de la tige augmente jusuq'a un moment ou le système diverge
    Euh, juste en passant, y'aurait pas une petite contradiction là?
    Est-ce qu'il ne te manquerait pas une hypothèse à vérifier quelque part dans ton algo?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Euh, juste en passant, y'aurait pas une petite contradiction là?
    Est-ce qu'il ne te manquerait pas une hypothèse à vérifier quelque part dans ton algo?
    Et bien oui, lorsque je prend en compte ces forces lors de ma simu je vois que la longueur de la tige s'allonge et se retreci en fonction de la position. IL doit y avoir quelque chose qui ne marche pas bien mais je ne sais pas quoi

  5. #5
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Je suis un peu allergique aux pointeurs C++ (ou C???), donc sans doute que je passe à côté de quelque chose dans ton bout de code...

    Toutefois, si je me souviens bien de mes cours de physique de ma jeunesse, l'étude du pendule doit faire apparaitre l'accélération quelque part dans les équations non? (un truc en -L.a", avec L longueur de la tige, a l'angle de la tige avec la verticale, en gros c'est l'équation qui te permet de faire intervenir le fait que la tige est de longueur constante).

    Dans tes formules, je ne vois pas ceci... d'ailleurs je ne comprends pas trop le calcul de la réaction...
    Pourrais-tu mettre tes formules de calcul sous format mathématique? ou au moins en pseudo-algorithmique...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Note: si tu codes en C, utilise le type double plutot que float pour les calculs reels, voire long double (C99) si possible, c'est plus precis, voire plus rapide. (En C++ aussi, je suppose).

    Vu que la corde est de longueur constante, fixe la une fois pour toutes ! Le calcul a chaqe etape de V12normalise est inutile, sauf si tu veux donner une possibilite d'evolution a ton code, ou a titre de verification que le calcul ne diverge pas...

    Ca depend de ta fonction InitEnMetre, mais si tu initialise v12 a x=x1-x2 et y=y1-y2, il faudrait plutot l'appeler v21 (suivant la notation vectorielle usuelle).

    Pour ton calcul de la reaction, il faudrait verifier. Deja, que tu mettes des facteurs au pifometre me semble douteux... Sinon la reaction ne depend que de la position du module et de son poids, ca me semble logique.

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    si on considère 1 pendule de lonleur L ( la tige etant sans masse) avec une masse m en son extremiité ' basse' et fixe en x,y,z mais sans contrainte angulaire en son autre extremitée alors
    si on ecarte le pendure d'1 ange Te ( exprimé en radian ) il vient

    F = m.g.sin(Te) g= acceleration du à la pesentaeure = 9.81 m/s/s

    or F = m *gama ( Newton ) =>

    m .g . sin(Te) = -m*L* @2 Te / @ t2

    aux petits angles sin(Te) # Te =>

    Te'' = -g/L * Te => Te(t) = To sin( sqrt(g/L) * t + phi0 )
    Phi0 et To dependent des conditions initiales.
    les réactions d'axe sont évidentes à déduire.

    si l'angle T0 devait s'accroitre sin(Te) = Te devient faux et je ne pense pas qu'il y ait de solution analytique à l'équation différentielle. Il ne reste plus qu'une solution numérique.
    Si la tige devait être de masse non nulle mais avec une densité donnée, il est facile d'intégrer l'équation ci-dessus et de caculer la nouvelle équation angulre (t) du système.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    j.p.mignot a raison. Tu t'interesse à la réaction de la tige, mais ici elle importe peu, elle compense exactement les forces qui s'appliquent dans l'axe des deux particules : c'est la condition pour que la longueur de la tige reste constante. Donc la résultante des forces dans l'axe des deux particules est nulle. Reste la composante tangentielle au cercle décrit par la particule: la projection de la pesanteur sur cette direction et tu obtiens les expressions de j.p.mignot. La raison qui donnerait un intérêt au calcul de la réaction de la tige est de savoir si elle va casser ou non
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par j.p.mignot
    si on considère 1 pendule de lonleur L ( la tige etant sans masse) avec une masse m en son extremiité ' basse' et fixe en x,y,z mais sans contrainte angulaire en son autre extremitée alors
    si on ecarte le pendure d'1 ange Te ( exprimé en radian ) il vient

    F = m.g.sin(Te) g= acceleration du à la pesentaeure = 9.81 m/s/s

    or F = m *gama ( Newton ) =>

    m .g . sin(Te) = -m*L* @2 Te / @ t2

    aux petits angles sin(Te) # Te =>

    Te'' = -g/L * Te => Te(t) = To sin( sqrt(g/L) * t + phi0 )
    Phi0 et To dependent des conditions initiales.
    les réactions d'axe sont évidentes à déduire.

    si l'angle T0 devait s'accroitre sin(Te) = Te devient faux et je ne pense pas qu'il y ait de solution analytique à l'équation différentielle. Il ne reste plus qu'une solution numérique.
    Si la tige devait être de masse non nulle mais avec une densité donnée, il est facile d'intégrer l'équation ci-dessus et de caculer la nouvelle équation angulre (t) du système.
    Fonctions de Bessel?

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Non.

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Les fonctions de bessel sont les soultions de



    x . d/dx ( x. dy/dx ) +y . ( m^2 . x^2 - a^2 ) = 0

    => y = A * Ja ( m.x ) + B . Ya ( mx)

    en physique en général les solutions sont du type J car Y diverge en 0.


    ceci n'a rien à voir avec le pendule!!!

    On rencontre en général les fonctions de Bessel dans les problèmes à syméztrie axiale comme vibration d'un disque, d'une peau de tambour, ...

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Désolé de n'être pas revenu plus tôt mon moniteur était cassé

    J'ai réussi à simuler le pendule .
    Mais j'ai un autre probleme lorsque je veux appliquer un autre force sur le pendule.

    J'ai mon repère X vers la droite et Y vers le bas, puis deux vecteurs V1 et V2, j'ai trouvé l'angle entre les vecteurs mais la où je me casse la tête c'est que j'ai besoin de savoir lequel des deux est en avance sur l'autre avec le repère que j'ai donné plus haut.
    Car en faisant le produit scalaire on obtient un nombre entre -1 et 1 ensuite avec le arcos on obtient l'angle entre 0 et 180° (mais ca ne suit pas le sens du repère donc coment faire) si j'aurais pu avoir un angle sur 360 ° ca aurait pu m'aider, vous voyez comment faire?

    Pour me faire mieux comprendre, c'est que ayant l'angle entre les vecteurs (variant de 0 à 180°) je n'arrive pas à déterminer si cet angle est positif (sens direct) ou négatif (sens contraire) du repère.

    Si vous voyez comment faire help me

  13. #13
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    en prenant "x vers la droite" & " y vers le bas", le repére (i,j) ne respecte pas le sens trigonométrique. A prioris rien d'étonant à ce que l'arcos donne une rotation en sens contraire de celle observée.

Discussions similaires

  1. Graphes temps-réel pour les simulations
    Par sciencesmaths dans le forum Autres
    Réponses: 1
    Dernier message: 19/04/2013, 14h02
  2. Simuler l'heure en temps réel
    Par Nanty dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/05/2011, 10h32
  3. Simulation temps réel ?
    Par matt41fr dans le forum MATLAB
    Réponses: 4
    Dernier message: 24/03/2010, 20h47
  4. Réponses: 1
    Dernier message: 05/06/2008, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo