Traitement des listes en Python

Exemple scientifique

tir horizontalIl ne manque pas beaucoup d'éléments techniques pour nous lancer dans la programmation d'une vraie application empruntée au cours de sciences.

Nous partirons du code-source ci-dessous. Seules quelques petites nouveautés doivent être expliquées. Les notions scientifiques sous-jacentes sont considérées connues et bien maîtrisées.

Il s'agit d'un tir horizontal (d'un canon, un largage par avion,...). On indique la vitesse initiale du tir horizontal et l'altitude à laquelle se déroule le tir.

L'objectif sera de visualiser la trajectoire pour différentes vitesses et différentes altitudes.

Dites tout ce que vous voulez, mais toutes ces lignes qui commencent par # sont quand même bizarres.

Pas d'angoisse. Ces lignes sont précisément prévues pour expliquer le contenu du code. Tout ce qui suit le signe # est ignoré par l'interpréteur Python. On y écrit donc ce que l'on veut.

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

# vitesse initiale en m/s
vitesse = 300

# altitude du tir en m
altitude = 2000

# la valeur de delta t dans les calculs en s
# si dt = 1, on calcule toutes les secondes
dt = 0.1

g = 9.81                # accélération de gravitation

# valeurs initiales des positions
x0 = 0
y0 = altitude

# initialisation de la liste pour contenir
# les positions successives du projectile
positions = []

t = 0
xt = x0
yt = y0
while yt > 0:                 # tant que l'altitude du projectile est positive
    # calculs des vitesses
    vx = vitesse              # cette vitesse ne change jamais
    vy = -g * t**2 / 2        # cette vitesse doit être recalculée à tout instant
   
    # calculs des positions
    xt = x0 + (vitesse * t)
    yt = y0 + (vy * t)
   
    # mise en mémoire des positions successives calculées
    positions.append([xt, yt])

    # on fait avancer le chronomètre
    t = t+dt        # dt secondes se sont passées

# -----------------------------------------------------------
# sortie des résultats

for p in positions:
    print p[0],p[1]

Mais c'est un peu figé, votre programme. Je voudrais faire calculer des trajectoires pour différentes vitesses initiales et pour différentes altitudes. Faudra donc chaque fois mettre les mains dans le code?

Il ne tient qu'à vous de remplacer les affectations figées de l'altitude et de la vitesse par des "input()".

# vitesse initiale en m/s
vitesse = input ("Vitesse initiale? ")

# altitude du tir en m
altitude = input ("Altitude du tir? ")

Réalise les modifications ci-dessus dans le programme et relance-le.

Encore un détail, n'y aurait pas moyen de conserver une trace des résultats? Histoire d'en tirer des diagrammes, par exemple.

Il serait possible de faire un copier/coller vers un tableur. Mais c'est encore plus simple d'envoyer les résultats dans un fichier.

fichier = open('tir.txt','w')     # la lettre 'w' indique que le fichier doit être ouvert                                  # en écriture (to Write, en anglais)
for p in positions:
    print >>fichier, p[0], p[1]   # les signes >> indiquent qu'il faut envoyer les résultats vers le fichier

Réalise les modifications ci-dessus dans le programme et relance-le.

Vous allez dire que j'abuse, mais on ne pourrait pas choisir les noms de fichiers? Si je veux faire 10 simulations, il me faut 10 fichiers...

Aucun problème: il sufft de demander à l'utilisateur quel nom de fichier il choisit.

La seule petite nouveauté, lorsqu'il s'agit de faire entrer une chaîne de caractères dans une variable, par l'intermédiaire d'une interaction avec l'utlisateur, on ne peut utiliser la fonction input() qui est réservée aux valeurs numériques.

Pour une invite permettant d'introduire une chaîne de caractères, il faut utiliser la fonction raw_input().

# vitesse initiale en m/s
vitesse = input ("Vitesse initiale? ")

# altitude du tir en m
altitude = input ("Altitude du tir? ")

# nom du fichier de sortie
nomFichier = raw_input ("Fichier de sortie? ");

Et, on remplace le nom du fichier "en dur" 'tir.txt' par la variable nomFichier.

fichier = open(nomFichier,'w')
for p in positions:
    print >>fichier, p[0], p[1]

Il ne reste plus qu'à mettre tout ça dans de beaux diagrammes...

Facile, avec Gnuplot, par exemple

Gnuplot 

Dernière modification 18/08/2016 Test dans /info ...