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

Calcul scientifique Python Discussion :

Problème de boucle programme python


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème de boucle programme python
    Bonjour à tous je suis nouveau sur le forum donc je ne sais pas trop comment ça fonctionne.
    Je suis en galère sur un programme python en effet je cherche à modéliser la trajectoire d'une balle de golf sans frottements, je suis donc parti dans l'idée de la modéliser sous la forme d'une successions de paraboles donc l'angle de départ serait toujours le même mais la vitesse initiale de chaque parabole serait égale à la vitesse finale de la parabole précédente. Cependant dans mon programme python ne m'affiche que la première parabole et je n'arrive pas à résoudre ce problème. J'espère avoir été clair et si une âme charitable voudrait bien m'aider je suis preneur.
    Voila mon programme:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import numpy as np
    from math import pi
    import matplotlib.pyplot as plt
     
    g=9.81
    z=0
    nbr=2000
    t=np.linspace(0,200,nbr)
     
    def sansfrottements(t,a,v):   #a=angle alpha en degrés  v=vitesse initiale
        a=a*pi/180
        L=[]
        c=0
        d=0
        e=0
        w=0
        v1=0
        for k in range(nbr):
            if (-1/2)*g*(t[k]/(np.cos(a)*v))**2+(np.sin(a)/np.cos(a))*t[k]>0:
                c+=1
                L.append((-1/2)*g*(t[k]/(np.cos(a)*v))**2+(np.sin(a)/np.cos(a))*t[k])
                w=L[-1]
            v1=-g*(1/((v**2)*((np.cos(a))**2)))*w+(np.sin(a)/np.cos(a))
            if (-1/2)*g*((t[k]-t[c])/(np.cos(a)*v1))**2+(np.sin(a)/np.cos(a))*(t[k]-t[c])>0:
                L.append((-1/2)*g*((t[k]-t[c])/(np.cos(a)*v1))**2+(np.sin(a)/np.cos(a))*(t[k]-t[c]))
                d+=1
        return L
        print(L)
     
     
     
    def tracefct(a,v):
        Y=sansfrottements(t,a,v)
        plt.figure(1)
        plt.plot(Y)
        plt.title("tracé d'une trajectoire sans frottements")
        plt.show()
    Ou avec une approche différente:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    import numpy as np
    from math import pi
    import matplotlib.pyplot as plt
     
    g=9.81
    z=0
    nbr=200
    t=np.linspace(0,200,nbr)
    c=0
     
    def sansfrottements(t,a,v):   #a=angle alpha en degrés  v=vitesse initiale
        a=a*pi/180
        L=[]
        v1=0 
        for k in range(nbr):
            if (-1/2)*g*(t[k]/(np.cos(a)*v))**2+(np.sin(a)/np.cos(a))*t[k]>=0:
                L.append((-1/2)*g*(t[k]/(np.cos(a)*v))**2+(np.sin(a)/np.cos(a))*t[k])
                c+=1
        w=L[-1]
        v1=-g*(1/((v**2)*((np.cos(a))**2)))*w+(np.sin(a)/np.cos(a))        
        for k in range(len(L),nbr):
            if (-1/2)*g*((t[k]-t[c])/(np.cos(a)*v1))**2+(np.sin(a)/np.cos(a))*(t[k]-t[c])>0:
                L.append((-1/2)*g*(t[k]/(np.cos(a)*v1))**2+(np.sin(a)/np.cos(a))*t[k])
        return L
     
     
     
     
     
     
    def tracefct(a,v):
        Y=sansfrottements(t,a,v)
        plt.figure(1)
        plt.plot(Y)
        plt.title("tracé d'une trajectoire sans frottements")
        plt.show()
    Merci à tous

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour

    Il manque la manière dont vous faites appel à vos fonctions...
    J'ai essayé avec au hasard
    Et en retour la liste est vide...


    En attendant que vous répondiez à cette question pour que moi ou qqn d'autre puisse vous aider, je peux déjà commenter votre code :
    - numpy c'est bien à utiliser dans ce genre de cas. Mais du coup traiter TOUS les tableaux comme ca serait bien. Plutot que d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    L=[]
    for k in range(nbr):
        L.append(...)
    Il est mieux d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    L=np.zeros(nbr)
    for k in range(nbr):
        L[nbr]=...
    Matplotlib fonctionnant avec numpy, c'est une raison de plus pour l'utiliser.

    - Numpy est très puissant et en général permet d'éviter les boucles (vous faites les opérations sur les tableaux entiers directement). Il faut essayer d'utiliser cela aussi pour éclaircir le code (sans compter de multiples autres avantages comme la performance)

    -Là ca print rien du tout, vu que votre fonction arrive à la fin avant à cause du return. Il faut donc inverser ces 2 instructions si vous voulez voir qqch.

    - Il y a des variables globales, d'autres qui sont passées en paramètres, d'autres qui sont un peu des deux (comme t par exemple). Il faudrait harmoniser tout ca.

    - Eviter de calculer plusieurs fois la même chose. Par exemple si vous mettez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        cos_a = np.cos(a)
        tan_a = np.sin(a)/cos_a  ### ou directement np.tan(a)
    au début de votre fonction vous n'aurez pas à recalculer à chaque fois ces quantités.
    De même, plutôt que d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if blabla_long_calcul > 0 :
           L.append( blabla_long_calcul )
    Ecrivez plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    val = blabla_long_calcul ### qui ne sera calculer qu'une seule fois (et que vous n'écrirez qu'une fois aussi d'ailleurs)
    if val > 0 :
           L.append( val )

  3. #3
    Membre régulier Avatar de fifafou
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 173
    Points : 92
    Points
    92
    Par défaut
    sinon,tu utilise un vecteur de vélocité horizontale,que tu décrémente et que t'inverse au rebonds,mais c'est pas aussi précis

Discussions similaires

  1. problème de programme python
    Par grobient dans le forum Général Python
    Réponses: 6
    Dernier message: 01/05/2017, 14h09
  2. Problème programme Python 3 sous Tkinter
    Par vbvero dans le forum Tkinter
    Réponses: 2
    Dernier message: 05/02/2017, 17h35
  3. problème dans un programme python
    Par finelame13 dans le forum Général Python
    Réponses: 3
    Dernier message: 10/06/2015, 11h31
  4. [Débutant] Problème de boucle dans un programme
    Par Nicolampion dans le forum MATLAB
    Réponses: 3
    Dernier message: 24/04/2008, 18h57
  5. Réponses: 2
    Dernier message: 05/06/2006, 16h53

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