Problème d'animation avec Mathematica
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Problème d'animation avec Mathematica



  1. #1
    invitee495456e

    Problème d'animation avec Mathematica


    ------

    Voici ce que je désire: pouvoir animer une course entre quatre courbes commençant en (0,0) et terminant en (L,-1).

    Les 4 courbes sont comme suit: une ligne droite, une parabole dont la dérivée en 0 est de -1/10, une parabole de sommet (L,-1) et une cycloïde. Si j'élimine la cycloïde de l'animation, l'animation fonctionne mais lorsque j'y ajoute la cycloïde, tout foire. Quels sont les problèmes dans ce mur de code? (désolé pour l'expression)
    Code:
    L = 3;
    cadre = Graphics[{Thickness[0.001], 
        Line[{{-0.4, 0.4}, {L + 0.4, 
           0.4}, {L + 0.4, -2.4}, {-0.4, -2.4}, {-0.4, 0.4}}]}];
    xdroite[s_] := s; xprimedroite[s_] := 1;
    ydroite[s_] := s/L; yprimedroite[s_] := 1/L;
    s0 = 0; sF = L;
    integrantdroite[s_] = 
      Sqrt[(xprimedroite[s]^2 + yprimedroite[s]^2)/
         2/(ydroite[s] - ydroite[s0])];
    tempsdroite[s_] := NIntegrate[integrantdroite[v], {v, s0, s}];
    nTable = 100; ds = N[(sF - s0)/nTable];
    sdroite = Table[s0 + i *ds, {i, 0, nTable}];
    tempsdroitefonctiondes = Map[tempsdroite, sdroite];
    tabledroite = Transpose[{tempsdroitefonctiondes, sdroite}];
    sdroitefonctiondetemps = Interpolation[tabledroite];
    xpositiondroite[t_] := 
      If[xdroite[sdroitefonctiondetemps[t]] > L, L, 
       xdroite[sdroitefonctiondetemps[t]]];
    ypositiondroite[t_] := 
      If[ydroite[sdroitefonctiondetemps[t]] > 1, 1, 
       ydroite[sdroitefonctiondetemps[t]]];
    t0 = tempsdroitefonctiondes[[1]];
    tF1 = tempsdroitefonctiondes[[nTable]];
    rayon = 0.15;
    billedroite[t_] := 
      Graphics[{Red, Thick, 
        Circle[{xpositiondroite[t], rayon - ypositiondroite[t]}, rayon]}];
    rampedroite = Graphics[{Blue, Line[{{0, 0}, {L, -1}}]}];
    yparabole1[s_] := s^2 ((1 - L/10)/L^2) + s/10;
    yprimeparabole1[s_] := D[yparabole1, s];
    integrantparabole1[s_] := 
      Sqrt[(xprimedroite[s]^2 + yprimeparabole1[s]^2)/
         2/(yparabole1[s] - ydroite[s0])];
    tempsparabole1[s_] := NIntegrate[integrantparabole1[v], {v, s0, s}];
    tempsparabole1fonctiondes = Map[tempsparabole1, sdroite];
    tableparabole1 = Transpose[{tempsparabole1fonctiondes, sdroite}];
    sparabole1fonctiondetemps = Interpolation[tableparabole1];
    xpositionparabole1[t_] := 
      If[xdroite[sparabole1fonctiondetemps[t]] > L, L, 
       xdroite[sparabole1fonctiondetemps[t]]];
    ypositionparabole1[t_] := 
      If[yparabole1[sparabole1fonctiondetemps[t]] > 1, 1, 
       yparabole1[sparabole1fonctiondetemps[t]]];
    tF2 = tempsparabole1fonctiondes[[nTable]];
    billeparabole1[t_] := 
      Graphics[{Red, Thick, 
        Circle[{xpositionparabole1[t], rayon - ypositionparabole1[t]}, 
         rayon]}];
    rampeparabole1 = 
      Show[ParametricPlot[{s, -s^2 ((1 - L/10)/L^2) - s/10}, {s, 0, L}]];
    yparabole2[s_] := -(s/L)^2 + 2 s/L;
    yprimeparabole2[s_] := D[yparabole2, s];
    integrantparabole2[s_] = 
      Sqrt[(xprimedroite[s]^2 + yprimeparabole2[s]^2)/
         2/(yparabole2[s] - ydroite[s0])];
    tempsparabole2[s_] := NIntegrate[integrantparabole2[v], {v, s0, s}];
    tempsparabole2fonctiondes = Map[tempsparabole2, sdroite];
    tableparabole2 = Transpose[{tempsparabole2fonctiondes, sdroite}];
    sparabole2fonctiondetemps = Interpolation[tableparabole2];
    xpositionparabole2[t_] := 
      If[xdroite[sparabole2fonctiondetemps[t]] > L, L, 
       xdroite[sparabole2fonctiondetemps[t]]];
    ypositionparabole2[t_] := 
      If[xdroite[sparabole2fonctiondetemps[t]] > L, 1, 
       yparabole2[sparabole2fonctiondetemps[t]]];
    tF3 = tempsparabole2fonctiondes[[nTable]];
    billeparabole2[t_] := 
      Graphics[{Red, Thick, 
        Circle[{xpositionparabole2[t], rayon - ypositionparabole2[t]}, 
         rayon]}];
    rampeparabole2 = 
      Show[ParametricPlot[{s, -(-(s/L)^2 + 2 s/L)}, {s, 0, L}]];
    cycle2[L_] := NSolve[L == ((s - Sin[s])/(1 - Cos[s])), s, Reals];
    ampli[L_] := L/(s - Sin[s]) /. cycle2[L][[1]];
    xcycloide[s_] := ampli[L][[1]]*(s - Sin[s]);
    ycycloide[s_] := ampli[L][[1]]*(1 - Cos[s]);
    xprimecycloide[s_] := D[xcycloide, s];
    yprimecycloide[s_] := D[ycycloide, s];
    integrantcycloide[s_] = 
      Sqrt[(xprimecycloide[s]^2 + yprimecycloide[s]^2)/
         2/(ycycloide[s] - ydroite[s0])];
    dk = N[(cycle2[L] - s0)/nTable];
    scycloide = Table[s0 + i *dk, {i, 0, nTable}];
    tempscycloide[s_] := NIntegrate[integrantcycloide[v], {v, 0, s}];
    tempscycloidefonctiondes = Map[tempscycloide, scycloide];
    tablecycloide = Transpose[{tempscycloidefonctiondes, scycloide}];
    scycloidefonctiondetemps = Interpolation[tablecycloide];
    xpositioncycloide[t_] := 
      If[xcycloide[scycloidefonctiondetemps[t]] > L, L, 
       xcycloide[scycloidefonctiondetemps[t]]];
    ypositioncycloide[t_] := 
      If[xcycloide[scycloidefonctiondetemps[t]] > L, 1, 
       ycycloide[scycloidefonctiondetemps[t]]];
    tF4 = tempscycloidefonctiondes[[nTable]];
    billecycloide[t_] := 
      Graphics[{Red, Thick, 
        Circle[{xpositionparabole2[t], rayon - ypositionparabole2[t]}, 
         rayon]}];
    rampecycloide = 
      Show[ParametricPlot[{ampli[L][[1]]*(s - Sin[s]), 
         ampli[L][[1]]*(1 - Cos[s])}, {s, 0, cycle2[L][[1]]}]];
    tF = Max[tF1, tF2, tF3, tF4];
    Animate[Show[cadre, rampedroite, rampeparabole1, rampeparabole2, 
      rampecycloide, billedroite[temps], billeparabole1[temps], 
      billeparabole2[temps], billecycloide[temps]], {temps, t0, tF}, 
     AnimationRunning -> False]

    -----
    Dernière modification par JPL ; 17/04/2013 à 14h13. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    JPL
    Responsable des forums

    Re : Problème d'animation avec Mathematica

    Rappel de la charte du forum :

    La courtoisie est de rigueur sur ce forum : pour une demande de renseignements bonjour et merci devraient être des automatismes.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  3. #3
    azad

    Re : Problème d'animation avec Mathematica

    Salut

    Je me suis amusé à remplacer la cycloïde par une troisième parabole, et ça marche aussi.
    J' ai juste relevé une erreur d'affectation dans votre code . A savoir
    billecycloide[t_] := Graphics[{Red, Thick, Circle[{xpositionparabole2[t], rayon - ypositionparabole2[t]}, rayon]}];
    qui devrait-être
    billecycloide[t_] := Graphics[{Red, Thick, Circle[{xpositioncycloide[t], rayon - ypositioncycloide[t]}, rayon]}];

    Et Mathematica indique comme message d'erreur à la ligne
    tempscycloide[s_] := NIntegrate[integrantcycloide[v], {v, 0, s}];

    que les limites d'intégration ne sont pas correctes.
    Donc revoir 0 et s dans {v, 0, s}

    Sinon, si vous souhaitez connaître le résultat de la course : c'est la cycloïde, qui devrait gagner !

Discussions similaires

  1. Un problème d'animation
    Par invite506e7316 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 24/08/2011, 05h46
  2. Probleme d'animation en ActionScript 3
    Par Bonnes perspectives dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 29/11/2010, 22h04
  3. Problème avec Mathematica
    Par inviteed367030 dans le forum Mathématiques du supérieur
    Réponses: 22
    Dernier message: 26/06/2009, 14h10
  4. Petit probleme avec mathematica
    Par Olorin dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 24/01/2008, 16h09
  5. problème de maximisation avec mathematica
    Par inviteea3b743c dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 04/07/2007, 21h36