Partage
  • Partager sur Facebook
  • Partager sur Twitter

Laser solveivp

    8 mars 2022 à 10:50:21

    Je veux réalisé un programme qui représente la trajectoire d'un satellite avec la Terre représentée par un cercle bleu avec solve_ivp :

    import numpy as np
    from math import sqrt
    from pylab import plot,show,linspace,Circle,gcf,figure,gca
    from scipy import integrate
    
    G, M_T, R_T,Cx = 6.67*10**(-11), 5.972e24, 6.4e6,0.47
    
    circle = Circle((0, 0), R_T, color='b')
    figure(figsize=(7,7))
    ax = gca()
    ax.cla()
    ax.add_artist(circle)
    temps = np.linspace(0, 8500,10000)
    
    def P(h):
        """
        argument : altitude en km : renvoie la masse volumique de l'air correspondant à l'altitude donnée en argument
        """
        val=np.array([[0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000],[1.29e-3,8.261e-7,5.173e-10,1.561e-12,1.583e-13,2.644e-14,5.63e-15,1.382e-15,3.868e-16,1.308e-16,5.704e-17,3.163e-17,2.045e-17,1.428e-17,1.034e-17,7.625e-18,5.691e-18,4.289e-18,3.263e-18,2.507e-18,1.945e-18]])
        m,M=[],0
        for k in range(0,21):
            m.append(abs(h-val[0][k])) #compare l'altitude donnée en argument avec la valeur la plus proche
        M=np.min(m)
        for k in range(0,21):
            if M==m[k]:
                return val[1][k]
    
    def f(temps,vecteur):
        """
        argument : une matrice colonne qui contient les CI de la position et de la vitesse en x et y et la fonction P : renvoie la dérivée et l'accélération selon x et y
        """
        Fx=-(G*M_T*vecteur[0])/((vecteur[0]**2+vecteur[1]**2)**(3/2)) #force de gravitation en x
        Fy=-(G*M_T*vecteur[1])/((vecteur[0]**2+vecteur[1]**2)**(3/2)) #force de gravitation en y
        Frx=((P(sqrt(vecteur[0]**2+vecteur[1]**2)))*0.58*Cx*sqrt(vecteur[2]**2+vecteur[3]**2)*vecteur[2])/2 #force de trainée en x
        Fry=((P(sqrt(vecteur[0]**2+vecteur[1]**2)))*0.58*Cx*sqrt(vecteur[2]**2+vecteur[3]**2)*vecteur[3])/2 #force de trainée en y
        return vecteur[2],vecteur[3],Fx+Frx/(43.6),Fy+Fry/(43.6)
    
    x = integrate.solve_ivp(f,temps,(400e3+R_T, 0,0,7.7e3))
    
    #plot(x,y)
    #show()

    Il y a un problème à la ligne 38 : too many values to unpack (expected 2).

    Je voudrais récupérer la liste des résultats pour représenter la trajectoire mais je ne sais pas comment faire.

    -
    Edité par Runhelm 8 mars 2022 à 10:50:40

    • Partager sur Facebook
    • Partager sur Twitter
      8 mars 2022 à 11:47:41

      Tu peux mettre le message Traceback complet; mais je pense que le paramètre temps que tu passes à la fonction solve_ivp; la fonction attend 2 valeurs  (les bornes de l'intervalle d'intégration) et non pas les 10000 valeurs de temps (https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html )

      x = integrate.solve_ivp(f,(0,8500),(400e3+R_T, 0,0,7.7e3))
      ou pour être plus générique
      x = integrate.solve_ivp(f,(temps[0],temps[-1]),(400e3+R_T, 0,0,7.7e3))


      Edit: je crois que j'ai laissé involontairement un t devant (0,8500) sur ma 1ère ligne, corrigé

      -
      Edité par umfred 21 mars 2022 à 11:58:41

      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2022 à 13:58:06

        J'ai essayé mais quand je rajoute x,y=sol.y pour représenter la trajectoire ça ne marche pas :too many values to unpack (expected 2).
        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2022 à 10:03:06

          Bonjour,

          x,y = sol.y

          tu es censé récupérer 2 valeurs : x et y

          mais sol.y c'est une seule valeur, non ?

          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2022 à 11:59:09

            c'est quoi sol.y ? il ne figure pas dans ton code initial.
            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2022 à 17:02:29

              J'ai vu cette commande dans des exemples https://www.youtube.com/watch?v=INBu1Pyj0Is.
              • Partager sur Facebook
              • Partager sur Twitter
                28 mars 2022 à 18:47:19

                dans la vidéo:
                sol=integrate.solve_ivp(.....)
                

                donc le sol de ta vidéo correspond au x de ton code initial

                Sinon, tu fournis 4 valeurs initiales (et f renvoie 4 valeurs) donc sol.y contient 4 tableaux (un pour chaque variable) donc tu dois recevoir 4 variables qui doivent correspondre à x,y (position) et Vx,Vy (vitesse)

                • Partager sur Facebook
                • Partager sur Twitter
                  29 mars 2022 à 10:37:11

                  Avec 

                  import numpy as np
                  from math import sqrt
                  from pylab import plot,show,linspace,Circle,gcf,figure,gca
                  from scipy import integrate
                  
                  G, M_T, R_T,Cx = 6.67*10**(-11), 5.972e24, 6.4e6,0.47
                  
                  circle = Circle((0, 0), R_T, color='b')
                  figure(figsize=(7,7))
                  ax = gca()
                  ax.cla()
                  ax.add_artist(circle)
                  temps = np.linspace(0, 8500,10000)
                  
                  def P(h):
                      """
                      argument : altitude en km : renvoie la masse volumique de l'air correspondant à l'altitude donnée en argument
                      """
                      val=np.array([[0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000],[1.29e-3,8.261e-7,5.173e-10,1.561e-12,1.583e-13,2.644e-14,5.63e-15,1.382e-15,3.868e-16,1.308e-16,5.704e-17,3.163e-17,2.045e-17,1.428e-17,1.034e-17,7.625e-18,5.691e-18,4.289e-18,3.263e-18,2.507e-18,1.945e-18]])
                      m,M=[],0
                      for k in range(0,21):
                          m.append(abs(h-val[0][k])) #compare l'altitude donnée en argument avec la valeur la plus proche
                      M=np.min(m)
                      for k in range(0,21):
                          if M==m[k]:
                              return val[1][k]
                  
                  def f(temps,vecteur):
                      """
                      argument : une matrice colonne qui contient les CI de la position et de la vitesse en x et y et la fonction P : renvoie la dérivée et l'accélération selon x et y
                      """
                      Fx=-(G*M_T*vecteur[0])/((vecteur[0]**2+vecteur[1]**2)**(3/2)) #force de gravitation en x
                      Fy=-(G*M_T*vecteur[1])/((vecteur[0]**2+vecteur[1]**2)**(3/2)) #force de gravitation en y
                      Frx=((P(sqrt(vecteur[0]**2+vecteur[1]**2)))*0.58*Cx*sqrt(vecteur[2]**2+vecteur[3]**2)*vecteur[2])/2 #force de trainée en x
                      Fry=((P(sqrt(vecteur[0]**2+vecteur[1]**2)))*0.58*Cx*sqrt(vecteur[2]**2+vecteur[3]**2)*vecteur[3])/2 #force de trainée en y
                      return vecteur[2],vecteur[3],Fx+Frx/(43.6),Fy+Fry/(43.6)
                  
                  x,y,dx,dy = integrate.solve_ivp(f,(temps[0],temps[-1]),(400e3+R_T, 0,0,7.7e3))
                  
                  plot(x,y)
                  show()

                  J'ai ValueError: too many values to unpack (expected 4).

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mars 2022 à 11:00:50

                    tu n'as pas suffisamment bien lu ma réponse: j'ai dit que sol.y était (ici) constitué de 4 éléments, sol étant le retour de la fonction integrate.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 avril 2022 à 10:24:34

                      Mais donc si j'écris

                      x = integrate.solve_ivp(f,(temps[0],temps[-1]),(400e3+R_T, 0,0,7.7e3))

                      x prend x,y,vx,vy comme valeur mais comment récupérer y pour l'afficher ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 avril 2022 à 12:54:02

                        Si tu utilises une variable nommé x alors que je l'ai nommé sol et que j'accède aux y de la solution avec sol.y, alors tu devrais pouvoir y accéder de la même façon à savoir x.y

                        c'est un peu la base de l'accès aux variables d'un objet
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 mai 2022 à 11:56:34

                          J'ai fait 

                          import numpy as np
                          from math import sqrt
                          from pylab import plot,show,linspace,Circle,gcf,figure,gca
                          from scipy import integrate
                           
                          G, M_T, R_T,Cx = 6.67*10**(-11), 5.972e24, 6.4e6,0.47
                           
                          circle = Circle((0, 0), R_T, color='b')
                          figure(figsize=(7,7))
                          ax = gca()
                          ax.cla()
                          ax.add_artist(circle)
                          temps = np.linspace(0, 8500,10000)
                           
                          def P(h):
                              """
                              argument : altitude en km : renvoie la masse volumique de l'air correspondant à l'altitude donnée en argument
                              """
                              val=np.array([[0,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000],[1.29e-3,8.261e-7,5.173e-10,1.561e-12,1.583e-13,2.644e-14,5.63e-15,1.382e-15,3.868e-16,1.308e-16,5.704e-17,3.163e-17,2.045e-17,1.428e-17,1.034e-17,7.625e-18,5.691e-18,4.289e-18,3.263e-18,2.507e-18,1.945e-18]])
                              m,M=[],0
                              for k in range(0,21):
                                  m.append(abs(h-val[0][k])) #compare l'altitude donnée en argument avec la valeur la plus proche
                              M=np.min(m)
                              for k in range(0,21):
                                  if M==m[k]:
                                      return val[1][k]
                           
                          def f(temps,vecteur):
                              """
                              argument : une matrice colonne qui contient les CI de la position et de la vitesse en x et y et la fonction P : renvoie la dérivée et l'accélération selon x et y
                              """
                              Fx=-(G*M_T*vecteur[0])/((vecteur[0]**2+vecteur[1]**2)**(3/2)) #force de gravitation en x
                              Fy=-(G*M_T*vecteur[1])/((vecteur[0]**2+vecteur[1]**2)**(3/2)) #force de gravitation en y
                              Frx=((P(sqrt(vecteur[0]**2+vecteur[1]**2)))*0.58*Cx*sqrt(vecteur[2]**2+vecteur[3]**2)*vecteur[2])/2 #force de trainée en x
                              Fry=((P(sqrt(vecteur[0]**2+vecteur[1]**2)))*0.58*Cx*sqrt(vecteur[2]**2+vecteur[3]**2)*vecteur[3])/2 #force de trainée en y
                              return vecteur[2],vecteur[3],Fx+Frx/(43.6),Fy+Fry/(43.6)
                           
                          sol = integrate.solve_ivp(f,(temps[0],temps[-1]),(400e3+R_T, 0,0,7.7e3))
                           
                          plot(sol.x,sol.y)
                          show()

                          Mais ça me dit AttributeError: x

                          -
                          Edité par Runhelm 22 mai 2022 à 11:57:37

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 mai 2022 à 13:24:07

                            où, dans la doc de solve_ivp, il est indiqué que ça renvoie une variable x ? (les abscisses ici sont un temps, donc ça s'appelle sol.t)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Laser solveivp

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown