Trajectoire d'une balle, looping, décrochement

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
zepem
Membre Naturel
Messages: 12
Enregistré le: 24 Jan 2009, 05:50

trajectoire d'une balle, looping, décrochement

par zepem » 26 Fév 2012, 01:45

Bonjour,
Je fais en JavaScript une animation qui représente la trajectoire d'une balle.
Pour l'instant j'ai définit tout les paramètres nécessaires (il me semble).
Image
c'est le screenShot de l'image d'une trajectoire possible
les point J1 J2 ... J7 sont des point de jonction entre des morceaux de trajectoire qui ont des coordonnées connu dans (u,v) tout comme les rayons des différentes portions r1 ... r5 et les hauteurs et largeurs des premières et dernière portion ligne.
Je voudrais savoir comment définir l’accélération et la vitesse de la balle (supposé sans frottement, sans volume), et donc pouvoir en déduire sa position au cour du temps.
ce qui me pose problème c'est la question de la réaction au support, je ne sais plus comment faire les bon calcules.
je pense que le plus simple c'est de traiter le problème portion par portion, du style:
on connais le vecteur vitesse en entré de portion (à un point J), on déduit la progression jusqu'au point suivant.
Voila j’espère que le problème est bien exposé ^^



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 26 Fév 2012, 08:22

salut,

Je voudrais savoir comment définir l’accélération et la vitesse de la balle (supposé sans frottement, sans volume)
ce qui me pose problème c'est la question de la réaction au support


Je comprends pas. Ta balle est lancée? elle a un poids?
Tu connais quelques points p1,...p7, et tu veux en déduire sa future sa trajectoire (y compris avec les rebonds)?
la vie est une fête :)

zepem
Membre Naturel
Messages: 12
Enregistré le: 24 Jan 2009, 05:50

par zepem » 26 Fév 2012, 09:23

La balle part du point (0,0) sans vitesse, elle roule sur le rail du fait de la gravité.
son poids est choisi.
je connais les points p1(xp1,yp1) ...p7 et aussi les centres est rayon d'arcs de cercles.
je veux en déduire à l'instant t la position, la vitesse, l’accélération de la balle.
y a pas de rebond, si la balle décroche, la trajectoire et le point de décrochement sont montrés mais l'impact suivant n'est pas animé, c'est la fin de l'animation.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 26 Fév 2012, 09:28

les coordo de la balle laissent supposer qu'on est dans un plan.
Comme on a son poids je suppose que ya la gravité, donc on est dans un plan "vertical" type l'écran de pc

pe aurais-tu un schéma?
est-ce aue c'est un truc genre ca?
Image
la vie est une fête :)

zepem
Membre Naturel
Messages: 12
Enregistré le: 24 Jan 2009, 05:50

par zepem » 26 Fév 2012, 09:36

oui c'est exactement ça, c'est dans un repère située selon les flèches orange ( le repère est inversé car c'estplus simple pour le rendu javascript, mais si il faut je peux faire un repère avec la fleche j vers le haut, comme on vois d’habitude.
dans le script les coordonnées des centres sont connu, je ne les ai pas placé sur le rendu ne pour pas surchargé. je vais faire un mode qui les fait apparaitre si tu veux les visualiser ?

edit---------------------

je vais rapidement ajouter les traits sur le dessin, parce que le schéma ne permet pas de voir ou sont les centres, mais en gros, y a pas de surprise, les arcs sont construit de maniere "la plus simple"

les centres sont en rouge. ils pourrait etre ailleurs si la trajectoire est modifié, mais les traits roses orthogonaux le restes. il est possible de changer la valeur du rayon, la valeur des pentes. je vais faire un autres pour voir la différence.
Image

voici un autre, un centre tombe sur une jonction, mais c'est une coïncidence
Image

Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 03:41

par Mathusalem » 26 Fév 2012, 18:29

Je ne sais pas dans quelle mesure celà va t'aider, mais quelques points importants :

Puisque tu as un problème où je suppose aucune friction mais l'action de la gravité, tu as conservation de l'énergie mécanique. Disons que ton objet se situe en (0,0) avec une vitesse v0.

Si tu définis la hauteur nulle comme le point de départ, tu as que la coordonnée y de ton point matériel, suivant ton choix d'axe, donne l'équation suivante [conservation d'energie].


C'est-à-dire qu'en tout point tu connais l'expression de la norme de ta vitesse selon la hauteur du point. Puisque tu sais que cette vitesse est parallèle à la courbe, tu peux t'arranger pour implémenter son mouvement.

Si le haut de ton looping est une partie circulaire, alors la condition de décollement est
avec R le rayon du cercle. Si c'est une ellipse, c'est plus tendu à calculer,

zepem
Membre Naturel
Messages: 12
Enregistré le: 24 Jan 2009, 05:50

par zepem » 26 Fév 2012, 23:01

merci beaucoup Mathusalem pour ces explications qui devraient à vue d’œil me suffire à terminer l'animation, je me lance des maintenant, je mettrait un gif de l’anime si je termine :happy:

edit ----------------
j'ai parlé un peu vite, je ne vois pas comment faire ...
je voudrais pour chaque section du parcourt, avoir la position en fonction du temps.

utiliser la conservation de l'énergie et lier la vitesse à l'altitude me met tout de suite face à un problème: à t=0 v=0, donc la balle ne change pas d'altitude, donc elle ne change pas de vitesse, donc elle bouge pas...

Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 03:41

par Mathusalem » 26 Fév 2012, 23:36

zepem a écrit:merci beaucoup Mathusalem pour ces explications qui devraient à vue d’œil me suffire à terminer l'animation, je me lance des maintenant, je mettrait un gif de l’anime si je termine :happy:

edit ----------------
j'ai parlé un peu vite, je ne vois pas comment faire ...
je voudrais pour chaque section du parcourt, avoir la position en fonction du temps.

utiliser la conservation de l'énergie et lier la vitesse à l'altitude me met tout de suite face à un problème: à t=0 v=0, donc la balle ne change pas d'altitude, donc elle ne change pas de vitesse, donc elle bouge pas...


Justement c'est le problème de la conservation d'énergie. Tu peux pas sortir un courbe temporelle du déplacement de la balle.. En revanche tu sais qu'au point suivant la balle aura une vitesse dictée par l'équation plus haut.

Le truc, c'est que depuis tout en haut de la pente, tant que la balle est sur une pente d'inclinaison constante, et si t'appelles A l'angle entre la pente et l'horizontale, ton équation du mouvement selon la pente est x(t) = 1/2 gsin(A)*t^2.
Mais dès que la pente commence à se courber, c'est plus si évident et là j'utiliserai la conservation de l'énergie pour déterminer les vitesses aux point succéssifs.

zepem
Membre Naturel
Messages: 12
Enregistré le: 24 Jan 2009, 05:50

par zepem » 27 Fév 2012, 01:34

Mathusalem a écrit:Tu peux pas sortir un courbe temporelle du déplacement de la balle.


sans ça je peut pas faire l'animation :mur:

le début de l'animation fonctionne, c'est simple c'est rectiligne. Voici le code utilisé:

// retourne le temps total qu'il faut pour parcourir la distance et la vitesse final, selon acc et v initiale
rectiligneT=function(dist,v0,acc){
temps=(Math.sqrt(2*dist*acc+v0*v0)-v0)/acc;
vitesse=v0+acc*temps;
return [temps,vitesse];
};

// retourne la position x selon une accélération et une vitesse initiale au cours du temps t
rectiligneP=function(t,acc,v0){
return t*(v0+t*acc/2);
};

Pour finir l'animation, il faudrait que je détermine deux autres fonctions similaires mais pour le cas d'un arc de cercle, un peu comme ça:

// retourne le temps total qu'il faut pour parcourir distance sur l'arc de cercle et la vitesse final, selon le rayon, l'angle de départ en radian, le Sens(horaire ou trigo) et v initiale
arcT=function(dist,v0,Rayon,Angle,Sens){
return [???,???];
};

// retourne la position x selon Rayon,Angle,Sens, au cours du temps
arcP=function(t,Rayon,Angle,Sens,v0){
return ???;
};

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 27 Fév 2012, 07:40

jai pas trop lu la réponse de mathusalem qui a l'air intéressante, ni même avancé sur le truc.

Par contre un petit détail d'implém :
Code: Tout sélectionner
rectiligneT=function(dist,v0,acc){

déclare une variable globale (référant une fonction) au moment de l'exécution. Ca n'a aucun intérêt et il vaut mieux écrire
Code: Tout sélectionner
 function rectiligneT(...){
qui sera prise en compte au moment de la "pré" exécution. De fait t'auras pas de problème de portée lorsque ton script s'exécutera par exemple.

L'autre détail
Code: Tout sélectionner
temps=(Math.sqrt(2*dist*acc+v0*v0)-v0)/acc;
vitesse=v0+acc*temps;

pour les même raisons temps et vitesse seront globales et modifiables entre temps. C'est peu probable que les valeurs soient modifiées par un autre appel de la fonction, mais c'est un risque inutile.
var temps = ...;
(ou let)
la vie est une fête :)

Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 03:41

par Mathusalem » 27 Fév 2012, 09:09

zepem a écrit:sans ça je peut pas faire l'animation :mur:

le début de l'animation fonctionne, c'est simple c'est rectiligne. Voici le code utilisé:

// retourne le temps total qu'il faut pour parcourir la distance et la vitesse final, selon acc et v initiale
rectiligneT=function(dist,v0,acc){
temps=(Math.sqrt(2*dist*acc+v0*v0)-v0)/acc;
vitesse=v0+acc*temps;
return [temps,vitesse];
};

// retourne la position x selon une accélération et une vitesse initiale au cours du temps t
rectiligneP=function(t,acc,v0){
return t*(v0+t*acc/2);
};

Pour finir l'animation, il faudrait que je détermine deux autres fonctions similaires mais pour le cas d'un arc de cercle, un peu comme ça:

// retourne le temps total qu'il faut pour parcourir distance sur l'arc de cercle et la vitesse final, selon le rayon, l'angle de départ en radian, le Sens(horaire ou trigo) et v initiale
arcT=function(dist,v0,Rayon,Angle,Sens){
return [???,???];
};

// retourne la position x selon Rayon,Angle,Sens, au cours du temps
arcP=function(t,Rayon,Angle,Sens,v0){
return ???;
};


Quelques remarques :
1. en général, pour un problème de ce genre, tu peux tout de suite oublier d'obtenir une expression x(t) = ... à cause de la géométrie du problème, parce que la force qui travaille dans ce problème (la gravité projetée dans la direction de la pente) est une fonction Force = g*f(x), avec f(x) une fonction dépendant de la position et dépendant directement de la géométrie du problème.

2. C'est justement à cause de la nature compliquée de x(t) que l'on efface le problème temporel en resolvant des équations pour des quantités indépendantes du temps (norme de la vitesse en tout point - pas en tout temps ; condition de décollement, etc..)

3. Pour un problème de ce genre, il faudrait : avoir accès à la courbe discrétisée (c'est-à-dire que ta courbe est un ensemble fini de coordonnées {x1,y1};{x2,y2}; etc..) et pour chaque point connaître la normale à la courbe. Comme ça tu peux écrire l'équation des forces en tout point en vérifiant qu'à chaque pas la force normale de soutient est dans la direction de la normale à la courbe (si elle est dans la direction inverse, ça voudrait dire que la courbe 'aspire' la boule, et puisque ce n'est pas possible, ça veut dire qu'en ce point, la boule décroche). Ensuite il te suffit de faire un truc du genre v(xi,yi) = a(xi-1,y1-1)*;)t, où ;)t est choisi assez petit.

4. Si ton problème consiste uniquement de droites et d'arc de cercles, alors on peut déjà mieux s'arranger, mais ça reste impossible (très ardu) de déduire l'équation du mouvement.

Mets-toi au centre d'un cercle, trace une verticale passant par le cenre. Ta boule entre au pied du cercle. On s'intéresse à l'angle B entre la verticale et le rayon qui relie la boule au centre (problème équivalent, puisque la position de la boule sur le cercle est Rayon*B). Alors tu dois résoudre
pour avoir une expression analytique de la vitesse/position de la boule. Et ça, c'est tendu. Remarque, l'équation est indépendante du rayon de ton cercle. Donc à toi de faire gaffe quand tu rentres d'un cercle dans un autre, de bien calculer la position correcte de la boule.
Sachant que t'as comme condition initiale B(0) = 0 (temps d'entrée) et B'(0) = v/R (vitesse de la boule à l'entrée)

4.1 Méthode : applique le schéma d'Euler du deuxième ordre pour obtenir successivement B(0), B(0+;)T), B(0+2;)T) etc.. si ;)t est assez petit ça devrait être assez fluide.
A chaque pas temporel, il te faut vérifier que -g*cos(B) <= v^2/R avec R le rayon du cercle sur lequel se trouve la boule. Si la condition n'est pas vérifiée, la boule décolle. Du moment que la boulle décolle, tu as denouveau une expression analytique du mouvement sous forme de jet ballistique.

zepem
Membre Naturel
Messages: 12
Enregistré le: 24 Jan 2009, 05:50

par zepem » 27 Fév 2012, 17:15

Merci pour ton explication, je retiens une chose: c'est pas facile de faire cette animation.
Je suis désolé je n'est pas tout capté, mais ça ma au moins "inspiré". voici ou j'en suis:
Image
sur cette portion de cercle , je note:

-;) l'angle entre la position de la balle et la vertical
-fC(EN ROSE) la force centrifuge, dont la norme dépend de la vitesse en ce point de l'arc
-GR la composante normal de de la force gravitationnelle
-GA la composante colinéaire de la force gravitationnelle
-fR(EN VERT) la réaction au support, qui se fait aussi grande que l'addition de GR+fC
-G(EN BLEU) la force gravitationnelle

-R le rayon
-v0 la vitesse en ce point

Je cherche la position en fonction du temps, mais c'est impossible sans connaitre la norme de GA(l’accélération suivant la trajectoire) en fonction du temps.
Avant cela je cherches les variations d'angle ;) en fonction de t en admettant qu'on connais la vitesse v0 constante sur cette petite portion:

;);)(;)t,v0,R) = ;)t*v0/R rad

ça permet de trouver la variation de l’accélération GA en fonction d'une position donnée selon ;)
(sachant que dans le cadre de la progression du mouvement, GR ne nous intéresse pas puisqu'il est par définition normal à la trajectoire, est donc n’influe pas la vitesse, donc pas la position. il sera utile pour connaitre le point de décrochement):


;)||GA|| (;)t,v0,R,;)) = ( sin(;)) - sin( ;) - ;);)(;)t,v0,R) )* ||G||

de même:

;)||GR|| (;)t,v0,R,;)) = ( cos(;)) - cos( ;) - ;);)(;)t,v0,R) )* ||G||


Voila voila, maintenant que faire de ça ? dériver selon t pour faire giclée les ;) ?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 27 Fév 2012, 21:32

c'est pas facile de faire cette animation

ata, s'il s'agit de faire une animation, c'est moins compliqué.

Tout ce que t'as à faire (enfin, c'est pas testé mais ca me parait légit), c'est de prendre un temps t suffisamment petit et de mettre à jour à chaque fois la vitesse et l'accélération etc!
Genre en un point (2D), un vecteur tangent à la courbe est , avec f l'équation de la courbe.
La force résultante est avec le vecteur tangent unitaire dont l'expression est donnée par

T'en déduis l'accélération (chui pas sûr à chaud comme ca pour préserver les vecteurs mais ca semble coolos, au pire ya des modifications subtiles mais rien de bien méchant par rapport à l'approche qu'on a)
Et donc la position

avec la vitesse au point
donc avec
pour t entre 0 et Delta t

Du coup, j'intuite que tu peux écrire qqch du genre
Code: Tout sélectionner
//x : current position
//s : current speed vector
//t : deltatime between current and new
//return [xnew,snew]
//xnew new calculated x
//snew new calculated speed vector
function updatePosition(x,s, t){
 var xnew,snew,v_n,t_n,a_n;
 t_n = [1, fprime(x_n)]/Math.sqrt(1 + fprime(x_n));
 v_n = t_n*t;
 a_n = [0, P*fprime(x_n)]
 snew = s + v_n;
 xnew  = 0.5 * Math.pow(t,2)*a_n + s*t + x;
 return [xnew, snew];
}

var position = [0, 0];
var speed =  [0,0];
window.setTimeout(20, function(){
 [position, speed] = updatePosition(position, speed, 20/frameRate)
})
la vie est une fête :)

Mathusalem
Membre Irrationnel
Messages: 1837
Enregistré le: 14 Sep 2008, 03:41

par Mathusalem » 27 Fév 2012, 22:24

Ce que dit fatal_error est bien dans l'idée de ce que j'ai marqué plus haut, mais son implémentation requiert des calculs assez lourds.

La seule force qui travaille (donc qui contribue à changer ta vitesse) dans ce problème, c'est la gravité projetée sur la direction de déplacement.

Puisque tu possèdes une courbe faite de droites et de cercles il te suffit de diviser le problème en contrôlant à chaque fois dans quelle partie de la piste tu te trouves (droite ou cercle).

Du moment que tu es sur une droite inclinée d'un angle par rapport à l'horizontale, tu as (x désigne la coordonnée parallèle à la pente)

.

Quand tu rentres dans un cercle, t'y rentres avec une vitesse et donc à la base tu as une vitesse angulaire avec R le rayon du cercle.

Si est l'angle qui repère ton décalage angulaire par rapport au diamètre vertical du cercle, alors tu as

Tu veux appliquer ce que t'explique fatal_error pour résoudre cette équation différentielle.
La deuxième dérivée s'exprime comme cela en la discrétisant.



Mais tu possèdes aussi une vitesse initiale au temps t = 0 où tu rentres dans le cercle. En discrétisant, ça te fait

Avec ça tu peux lancer la simulation.
En combinant 1 et 2, tu as au départ pour t = 0 ( par choix)
Premier pas.
Deuxième pas
3ème pas etc..

Donc, pour des temps suffisamment petits, tu vas obtenir une bonne approximation de la position de ta boule sur l'arc de cercle, repéré par l'angle qui repère ton décalage à la verticale.

Il suffit à chaque pas de vérifier pour être sûr que la bille ne décolle pas.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 11 Mar 2012, 22:42

plop,

je up ce problème, j'ai essayé de me pencher dessus, mais ca merdouille et j'arrive pas à trouver pourquoi.

Je considère la courbe d'eq f(x) = 400*(x-200)^2/(200^2)
(en gros c'est une x^2 avec changement d'echelle et translation)
je pose ma balle par exemple en x=350, et je regarde comment elle suit la courbe (elle sârrete en 200, centre de la parabole).

Ce qui est chelou, c'est que j'ai un coefficient qui traine et qui est suspicieux.
En un point (x,f(x)) donné, je considère le poids P orienté vers le bas.
la réaction orthogonale à la courbe ,
le vecteur tangent unitaire
Leq de chais plus quoi me donne
somme des forces = m * a
avec somme des forces = , m la masse de la boule et l'accélération
J'ai donc
(en exprimant P en fonction de et , la composante sur s'envole pour conserver l'adhérence)
J'ai donc
et premier truc qui me titille,

g étant la gravité.
est-ce normal que la masse de la boule n'intervienne pas (même si ya pas de frottement) dans l'expression de l'accélération a?

Bon après plus rien ne métonne donc je passe à la suite en supposant que c'est correct.
Je décide de calculer x(t), la position de x à l'instant t de manière itérative.
Pour ca je considère que pendant un instant delta T, l'accélération est constante.
j'ai donc
a_n donné ci-dessus,


seulement ainsi, ca "diverge", cad la boule fait des mouvements de plus en plus grand.
En revanche en spécifiant 2+epsilone à la place de 1/2

la bille finit bien par s'arrêter en x=200


Quelqu'un a-t-il une idée?
Code: Tout sélectionner




#canvas{
  background-color:#eeeeee;
}


function f(x){
  return 400*Math.pow(x-200,2)/Math.pow(200,2);
}
function fp(x){
  return 400/Math.pow(200,2)*2*(x-200);
}
function toY(y){
  return -y+400;//400=canvas.height
}
function plotBall(ball, ctx){
  clearPlot(ctx);
  ctx.beginPath();
  var fpcx = fp(ball.x[0]);
  var factor= ball.R/Math.sqrt(fpcx*fpcx+1);
  var V=[-fpcx*factor, factor];
  ctx.arc(ball.x[0]+V[0], toY(ball.x[1]+V[1]), ball.R, 0, Math.PI*2, true);
  ctx.fill();
  ctx.closePath();
}
//cf mf post
function newPos(ball, deltaT){
  console.log(ball.toString());
  //fpcx=f'(x)
  var fpcx = fp(ball.x[0]);
  //c=1/m vec(P).vec(t)
  var c = -ball.gravity *fpcx/(1+fpcx*fpcx);
  //acceleration = c * [1, f'(x)]
  var a=[c, c*fpcx];
  var v=[ball.v[0]+ball.a[0]*deltaT,
         ball.v[1]+ball.a[1]*deltaT]; 
  //why is this fuckin 3 and not 1/2
  var x=[ball.v[0]*deltaT+2.5*ball.a[0]*deltaT*deltaT+ball.x[0],
         ball.v[1]*deltaT+2.5*ball.a[1]*deltaT*deltaT+ball.x[1]];
  //fishy, why keeping y make the ball fall
  x[1] = f(x[0]);
  ball.a = a;
  ball.v=v;
  ball.x=x;
  return ball;
}
function Ball(o){
  for(var i in o){
    this[i] = o[i];
  }
  var _that = this;
  this.toString=function(){
    var s = '';
    s+='x:'+_that.x;
    s+="\nv:"+_that.v;
    s+="\na:"+_that.a;
    return s;
  }
}
function clearPlot(ctx){
  ctx.clearRect ( 0 , 0 , 400 , 450 );
  ctx.beginPath();
  var dT=10;
  for(var x=0;x











(l40, modifier 2.5 par 1/2...)
la vie est une fête :)

Black Jack

par Black Jack » 12 Mar 2012, 10:49

fatal_error a écrit:plop,

je up ce problème, j'ai essayé de me pencher dessus, mais ca merdouille et j'arrive pas à trouver pourquoi.

Je considère la courbe d'eq f(x) = 400*(x-200)^2/(200^2)
(en gros c'est une x^2 avec changement d'echelle et translation)
je pose ma balle par exemple en x=350, et je regarde comment elle suit la courbe (elle sârrete en 200, centre de la parabole).

Ce qui est chelou, c'est que j'ai un coefficient qui traine et qui est suspicieux.
En un point (x,f(x)) donné, je considère le poids P orienté vers le bas.
la réaction orthogonale à la courbe ,
le vecteur tangent unitaire
Leq de chais plus quoi me donne
somme des forces = m * a
avec somme des forces = , m la masse de la boule et l'accélération
J'ai donc
(en exprimant P en fonction de et , la composante sur s'envole pour conserver l'adhérence)
J'ai donc
et premier truc qui me titille,

g étant la gravité.
est-ce normal que la masse de la boule n'intervienne pas (même si ya pas de frottement) dans l'expression de l'accélération a?

Bon après plus rien ne métonne donc je passe à la suite en supposant que c'est correct.
Je décide de calculer x(t), la position de x à l'instant t de manière itérative.
Pour ca je considère que pendant un instant delta T, l'accélération est constante.
j'ai donc
a_n donné ci-dessus,


seulement ainsi, ca "diverge", cad la boule fait des mouvements de plus en plus grand.
En revanche en spécifiant 2+epsilone à la place de 1/2

la bille finit bien par s'arrêter en x=200


Quelqu'un a-t-il une idée?
Code: Tout sélectionner




#canvas{
  background-color:#eeeeee;
}


function f(x){
  return 400*Math.pow(x-200,2)/Math.pow(200,2);
}
function fp(x){
  return 400/Math.pow(200,2)*2*(x-200);
}
function toY(y){
  return -y+400;//400=canvas.height
}
function plotBall(ball, ctx){
  clearPlot(ctx);
  ctx.beginPath();
  var fpcx = fp(ball.x[0]);
  var factor= ball.R/Math.sqrt(fpcx*fpcx+1);
  var V=[-fpcx*factor, factor];
  ctx.arc(ball.x[0]+V[0], toY(ball.x[1]+V[1]), ball.R, 0, Math.PI*2, true);
  ctx.fill();
  ctx.closePath();
}
//cf mf post
function newPos(ball, deltaT){
  console.log(ball.toString());
  //fpcx=f'(x)
  var fpcx = fp(ball.x[0]);
  //c=1/m vec(P).vec(t)
  var c = -ball.gravity *fpcx/(1+fpcx*fpcx);
  //acceleration = c * [1, f'(x)]
  var a=[c, c*fpcx];
  var v=[ball.v[0]+ball.a[0]*deltaT,
         ball.v[1]+ball.a[1]*deltaT]; 
  //why is this fuckin 3 and not 1/2
  var x=[ball.v[0]*deltaT+2.5*ball.a[0]*deltaT*deltaT+ball.x[0],
         ball.v[1]*deltaT+2.5*ball.a[1]*deltaT*deltaT+ball.x[1]];
  //fishy, why keeping y make the ball fall
  x[1] = f(x[0]);
  ball.a = a;
  ball.v=v;
  ball.x=x;
  return ball;
}
function Ball(o){
  for(var i in o){
    this[i] = o[i];
  }
  var _that = this;
  this.toString=function(){
    var s = '';
    s+='x:'+_that.x;
    s+="\nv:"+_that.v;
    s+="\na:"+_that.a;
    return s;
  }
}
function clearPlot(ctx){
  ctx.clearRect ( 0 , 0 , 400 , 450 );
  ctx.beginPath();
  var dT=10;
  for(var x=0;x











(l40, modifier 2.5 par 1/2...)


Avec tes données, tu ne peux qu'avoir des problèmes si tu essaies de simuler.

Sans frottement, il n'y a aucune raison que la balle s'arrète en x = 200.
Elle doit descendre du point (350 ; 225) jusqu'au point (200 ; 0) ... mais en ce point la balle a une vitesse telle qu'elle va remonter de l'autre coté de la courbe ...
Elle remontera jusqu'au point (50 ; 225) où elle sera à vitesse nulle (car conservation de l'énergie mécanique de la balle).
De là, elle repartira dans l'autre sens, redescendant vers le point (200 ; 0) ... mais en ce point la balle aura une vitesse telle qu'elle va remonter vers le point de départ initial (350 ; 225) qu'elle atteindra à vitesse nulle.
Et puis repartira comme au début ...

Bref, la balle va osciller indéfiniment, sans amortissement (puisque pas de frottement) le long de la courbe entre les points de coordonnées (350 ; 225) et (50 ; 225)

Si tu essaies de simuler cela par des suites de mini variations, cela a beaucoup de chance de foirer car la somme des calculs nécessaires induit forcément des erreurs ne serait-ce que par les arrondis imposés par les nombres de chiffres max utilisés par le logiciel dans ses calculs. Si la moyenne de ces erreurs (aussi petite soit-elle) est d'un signe, les oscillations calculées vont grandir sans cesse, et si la moyenne des erreurs est de l'autre signe, les oscillations vont s'amortir et la balle va finir par s'arrêter ... Mais c'est faux dans les 2 cas.

Par contre, si on se contente, de calculer le trajet sur un simple aller retour, alors les résultats peuvent être considérés comme proches de la "réalité"... si on ne s'est pas planté dans l'écriture de l'algo bien entendu. Pareil pour un seul trajet pour les courbes avec looping comme proposées par Zepem.

Une autre remarque, beaucoup trop souvent "oubliée" dans de tel problème.
Si on tente de calculer la réaction du support le long de la trajectoire (comme demandé par Zepem)... elle n'est pas la même si on considère une boule qui roule sans glisser ou bien un mobile qui glisse sans rouler... et la différence peut être très sensible.

En effet, par exemple pour une boule pleine homogène de masse m , l'énergie cinétique de translation est Ec1 = 1/2 mv² et l'énergie cinétique de rotation (si la boule roule sans glisser) est Ec2 = (1/2).J.w² (avec J = (2/5)mR²) et donc Ec2² = (1/5) m.v² et donc l'énergie potentielle de pesanteur de la balle se transforme en énergie cinétique totale = (1/2).mv² + (1/5)mv² = 0,7.mv² (quel que soit le rayon de la boule).

La vitesse v de la boule qui est "descendue" d'une hauteur h depuis le point où on l'a lachée sans vitesse initiale est donc telle que : mgh = 0,7.m.v²

v = racinecarrée(g.h/0,7) (v est la vitesse de translation du centre d'inertie de la boule)

Alors que si le mobile en mouvement glisse sans rouler, on aurait trouvé v = racinecarrée(2.g.h)

Comme la réaction du support dépend (entre autres) de v² ... elle ne sera pas la même (partout où v n'est pas nul) si on a affaire à une boule qui roule sans glisser ou bien à une mobile qui glisse sans rouler.

:zen:

Black Jack

par Black Jack » 12 Mar 2012, 17:13

fatal_error a écrit:plop,

je up ce problème, j'ai essayé de me pencher dessus, mais ca merdouille et j'arrive pas à trouver pourquoi.

Je considère la courbe d'eq f(x) = 400*(x-200)^2/(200^2)
(en gros c'est une x^2 avec changement d'echelle et translation)
je pose ma balle par exemple en x=350, et je regarde comment elle suit la courbe (elle sârrete en 200, centre de la parabole).

Ce qui est chelou, c'est que j'ai un coefficient qui traine et qui est suspicieux.
En un point (x,f(x)) donné, je considère le poids P orienté vers le bas.
la réaction orthogonale à la courbe ,
le vecteur tangent unitaire
Leq de chais plus quoi me donne
somme des forces = m * a
avec somme des forces = , m la masse de la boule et l'accélération
J'ai donc
(en exprimant P en fonction de et , la composante sur s'envole pour conserver l'adhérence)
J'ai donc
et premier truc qui me titille,

g étant la gravité.
est-ce normal que la masse de la boule n'intervienne pas (même si ya pas de frottement) dans l'expression de l'accélération a?

Bon après plus rien ne métonne donc je passe à la suite en supposant que c'est correct.
Je décide de calculer x(t), la position de x à l'instant t de manière itérative.
Pour ca je considère que pendant un instant delta T, l'accélération est constante.
j'ai donc
a_n donné ci-dessus,


seulement ainsi, ca "diverge", cad la boule fait des mouvements de plus en plus grand.
En revanche en spécifiant 2+epsilone à la place de 1/2

la bille finit bien par s'arrêter en x=200


Quelqu'un a-t-il une idée?
Code: Tout sélectionner




#canvas{
  background-color:#eeeeee;
}


function f(x){
  return 400*Math.pow(x-200,2)/Math.pow(200,2);
}
function fp(x){
  return 400/Math.pow(200,2)*2*(x-200);
}
function toY(y){
  return -y+400;//400=canvas.height
}
function plotBall(ball, ctx){
  clearPlot(ctx);
  ctx.beginPath();
  var fpcx = fp(ball.x[0]);
  var factor= ball.R/Math.sqrt(fpcx*fpcx+1);
  var V=[-fpcx*factor, factor];
  ctx.arc(ball.x[0]+V[0], toY(ball.x[1]+V[1]), ball.R, 0, Math.PI*2, true);
  ctx.fill();
  ctx.closePath();
}
//cf mf post
function newPos(ball, deltaT){
  console.log(ball.toString());
  //fpcx=f'(x)
  var fpcx = fp(ball.x[0]);
  //c=1/m vec(P).vec(t)
  var c = -ball.gravity *fpcx/(1+fpcx*fpcx);
  //acceleration = c * [1, f'(x)]
  var a=[c, c*fpcx];
  var v=[ball.v[0]+ball.a[0]*deltaT,
         ball.v[1]+ball.a[1]*deltaT]; 
  //why is this fuckin 3 and not 1/2
  var x=[ball.v[0]*deltaT+2.5*ball.a[0]*deltaT*deltaT+ball.x[0],
         ball.v[1]*deltaT+2.5*ball.a[1]*deltaT*deltaT+ball.x[1]];
  //fishy, why keeping y make the ball fall
  x[1] = f(x[0]);
  ball.a = a;
  ball.v=v;
  ball.x=x;
  return ball;
}
function Ball(o){
  for(var i in o){
    this[i] = o[i];
  }
  var _that = this;
  this.toString=function(){
    var s = '';
    s+='x:'+_that.x;
    s+="\nv:"+_that.v;
    s+="\na:"+_that.a;
    return s;
  }
}
function clearPlot(ctx){
  ctx.clearRect ( 0 , 0 , 400 , 450 );
  ctx.beginPath();
  var dT=10;
  for(var x=0;x











(l40, modifier 2.5 par 1/2...)



y = 0,01*(x-200)²
Lacher sans vitesse initiale au point P350 ; 225)

E mécanique = mg*225

Conservation de l'énergie mécanique (puisque pas de frottement) : mgy + (1/2).mv² = 225 mg (en supposant que le mobile glisse sans rouler ... sinon remplacer le 1/2 par 0,7 si on a une boule pliene homogène qui roule sans glisser).

v² = 2g(225-y)

Composante de la vitesse suivant Ox: Vx = v.cos(alpha)
avec tg(alpha) = f '(x)

vx = +/- racinecarrée[2g(225-y)] * cos(arctg(0,02*(x-200)))

vx = +/- racinecarrée[2g(225- 0,01*(x-200)²)] * cos(arctg(0,02*(x-200)))

On peut donc calculer la composante Vx de la vitesse en fonction de l'abscisse x où se trouve le mobile. (et trouver les y correspondant).

On peut donc calculer par approximation "à l'envers", c'est à dire déduire le temps à partir de la vitesse suivant Ox.

On peut par exemple utiliser un tableur Exel où on décrémente x par petits pas à partir de 350, on calcule les vitesses correpondantes par vx = +/- racinecarrée[2g(225- 0,01*(x-200)²)] * cos(arctg(0,02*(x-200)))
(Au départ, c'est le signe - qui convient)
Et on calcule les delta t correspondant à chaque ligne par Delta t = delta x/vx
Et en les sommant, on à la durée depuis le lacher.

Attention que il faut s'arranger pour changer le signe de vx après un voyage "Aller" pour faire le "retour" ainsi que le signe des "delta x"

On trouve ce qu'il y a sur le dessin attaché, le temps en s est en abscisses et les coordonneés de l'objet sont en ordonnées (les x en bleu et les y en mauve).

Image

Toutes erreurs incluses.

:zen:

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 13 Mar 2012, 09:33

salut,

je doute pas de ta methode, simplement si javais juste, je devrais trouver la meme chose que toi, seulement ca mintrigue parce que dans ton expression de dx = vx*deltaT, on a vx qui ne depend pas de deltaT (mais que de la position de x), alors que dans mon expression, on a vx fonction de deltaT (le terme lie a lacceleration)

Peux-tu me dire si mon approche est correcte? ou sinon, ou est-ce que c'est faux.
Jai traite le cas ou ya pas de frottement et c'est du roulement
la vie est une fête :)

Black Jack

par Black Jack » 13 Mar 2012, 11:14

fatal_error a écrit:salut,

je doute pas de ta methode, simplement si javais juste, je devrais trouver la meme chose que toi, seulement ca mintrigue parce que dans ton expression de dx = vx*deltaT, on a vx qui ne depend pas de deltaT (mais que de la position de x), alors que dans mon expression, on a vx fonction de deltaT (le terme lie a lacceleration)

Peux-tu me dire si mon approche est correcte? ou sinon, ou est-ce que c'est faux.
Jai traite le cas ou ya pas de frottement et c'est du roulement


C'est tout à fait normal.

La vitesse instantanée du mobile ne dépend que de sa différence d'altitude par rapport au point de départ.
La conservation de l'énergie mécanique de l'objet (qui glisse sans rouler) permet d'écrire :

(1/2).m.Vo² + mg.ho = (1/2).m.V² + mg.h
(Si cela roule sans glisser, on doit remplacer les 1/2 de cette expression par 0,7, si la boule est pleine et homogène)

Avec Vo = 0 la vitesse du mobile au point de départ, ho "l'altitude" du point de départ.
V la vitesse du mobile en un point de la courbe dont l'altitude est h.

de là, il vient : (1/2).m.V² = mg(ho-h)
v = racinecarrée(2g(ho-h))

Le temps n'intervient pas dans cette relation, la vitesse ne dépend que de différence d'altitude du mobile par rapport au point de départ

On peut donc trouver la vitesse instantanée du mobile en chaque point de la courbe trajectoire sans connaître l'instant où il passera en ces points.

Connaissant v (vitesse instantanée) en un point de le courbe trajectoire, on peut facilement décomposer cette vitesse en sa composante suivant Ox (notée Vx) et si on le veut en sa composante suivant oy.
En effet, la vitesse instantanée est toujours tangentielle à la courbe trajectoire y = f(x) et on connait donc l'angle que fait v par rapport à l'axe Ox, v a la direction de la tangente à la courbe trajectoire et on peut donc (via f '(x)) trouver l'angle qu'a v par rapport à Ox (pour n'importe quels points de la courbe trajectoire) ... et comme on connait v et l'angle que fait v avec Ox, on peut calculer la composante Vx de la vitesse du mobile pour n'importe quel point de la courbe trajectoire y = f(x)

Il suffit donc de "découper" l'axe Ox en petits éléments (Delta x) et on peut calculer Vx (composante suivant Ox de la vitesse du mobile pour chacun des points).

On peut alors calculer pour chaque Delta x la durée (Delta t) qu'il a fallu au mobile pour le parcourir. (par Delta t = Delta x/Vx)

Et en sommant ces Delta x depuis le départ jusqu'à un point quelconque de la trajectoire, trouver la durée du trajet du mobile pour atteindre ce point.
******

Au lieu de faire "comme souvent" calculer les positions successives à partir d'incréments de temps, ici, on fait le contraire : On calcule les Delta t nécessaires pour passer d'un point d'abscisse X à un point d'abscisse X + Delta X.
Et en sommant ces Delta t calculés (et différents les uns des autres ici), on sait déterminer l'instant de passage du mobile en n'importe quel point de la trajectoire.

Mais au final, on a bien la correspondance entre le temps et la position du mobile... C'est ce qu'on voulait.
******

Naturellement, il ne faut pas s'arrêter là si on veut savoir si le mobile ne va pas "décoller" de la piste (pas de danger dans ton équation mais bien dans les loopings par exemple).

Pour chaque position du mobile (celles du tableur), on connait la vitesse, il faut ajouter une colonne avec le rayon de courbure calculé (et évidemment variable d'un point à l'autre) et on peut alors calculer la force centrifuge
agissant sur le mobile pour chacun des points (F = mv²/R avec V la vitesse tangentielle calculée (pas Vx) et R le rayon de courbure).
Il faut aussi calculer la composante du poids du mobile suivant la normale à la courbe trajectoire pour chacun des points (ce qui est sans difficulté).
Il faut sommer (En chaque point de la trajectoire) la force centrifuge et la composante du poids suivant la normale à la trajectoire ...
Et il reste à "tester" le signe de cette somme pour chacun des points de la trajectoire. Suivant la convention de signe adoptée, un signe (+ par exemple) indiquera que la réaction du support existe et que donc le mobile "reste en piste" et l'autre signe (- par exemple) indiquera que le mobile "décroche" de la piste ... Si cela arrive, le mobile n'ira pas plus loin sur la trajectoire du dessin, il décollera de la "piste".
***************

Remarque que dans mon approche, on calcule bien Vx (ou v) uniquement par la position ...
Mais c'est faux de dire que Vx (ou V) ne dépend pas du temps ... puisque pour arriver à un point quelconque de la courbe, il faut un "certain temps" qui est déterminé par cette méthode.
... Et donc, au final, on a bien V qui dépend du temps.

:zen:

Black Jack

par Black Jack » 13 Mar 2012, 14:49

J'ai refais, l'exercice par la méthode des incréments de temps.

a = -10 * SIN(ATAN(0,02*(x-200))) (accélération tangentielle avec g = 10 N/kg)

calcul de v par : v(n) = v(n-1) + a(n) * Delta t

calcul de dl par dl(n) = v(n) * delta t

calcul de x par : x(n) = x(n-1) * dl(n-1) * cos(atan(0,02(x(n-1) - 200)))

et y calculé par y(n) = 0,01*(x(n) - 200)²
*****
On arrive à ceci :

Image

Pas très différent de ce qu'on trouve par l'autre méthode ... aux imprécison dues aux calculs nombreux répétitifs du tableurs et de l'imprécison dues au delta t ou delta x non infinimentes petits.

Le temps en s est en abscisses et les coordonneés de l'objet sont en ordonnées (les x en bleu et les y en mauve).


:zen:

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 105 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite