6.1. TP programmation python#

cours Méthodes numériques avancées master M2 Mécanique

%matplotlib inline
import sys,os
import numpy as np
import scipy as sp
import matplotlib
import matplotlib.pyplot as plt
from random import random
# initialisation
from validation.validation import info_etudiant, check_function, liste_functions, info_function
from IPython.display import display, Markdown, Latex
def printmd(string):
    display(Markdown(string))
# test si numero étudiant spécifier
try: NUMERO_ETUDIANT
except NameError: NUMERO_ETUDIANT = None 
if type(NUMERO_ETUDIANT) is not int :
    printmd("**ERREUR:** numéro d'étudiant non spécifié!!!")
    NOM,PRENOM,NUMERO_ETUDIANT = info_etudiant()
    #raise AssertionError("NUMERO_ETUDIANT non défini")
# parametres spécifiques
_uid_    = NUMERO_ETUDIANT
np.random.seed(_uid_)
printmd("**Etudiant {} {}  id={}**".format(NOM,PRENOM,NUMERO_ETUDIANT))
# recharge les modules
%load_ext autoreload

ERREUR: numéro d’étudiant non spécifié!!!

Etudiant Marc BUFFAT id=137764122

6.1.1. Consigne / JupyterLab#

L’objectif du TP est d’apprendre à programmer en Python sans utiliser l’interface graphique des notebooks !!!

C’est la méthode classique utilisée pour développer du code dans n’importe quel langage de programmation.

Elle nécessite :

  • un éditeur de texte

  • un interpréteur python

Nous allons utiliser l’éditeur de texte et l’interpréteur IPython de JupyterLab

Pour accéder à l’interface jupyerlab, entrée l’URL suivante dans le navigateur (ou cliquer sur le lien suivant)

  https://jupyter-exam.mecanique.univ-lyon1.fr/user/pxxxx/lab

où pxxxxx est votre numéro d’étudiant avec le premier chiffre remplacé par p (i.e. votre compte étudiant).

6.1.2. Utilisation du Notebook#

Pour ceux qui n’ont pas encore l’habitude de l’environnement Jupyter Lab, il est possible de résoudre les exercices dans le notebook, en se référent à la dernière section.

6.1.3. Sélection du répertoire de travail#

Dans la nouvelle interface JupyterLab, à gauche vous vous déplacez dans le répertoire du TP:

  • MGC2367MG1/TPI0_python ou MGC2367MG2/TPI0_python

C’est votre nouvel environnement de travail.

Avec cette interface, vous avez accès directement en ligne aux outils suivants (launcher)

  • les notebooks python

  • l’interpréteur python ipython

  • un éditeur de texte

  • un terminal Unix

6.1.3.1. Terminal#

  • permet d’executer des commandes unix avec un shell

  • exemple: utiliser les commandes Unix pour vous déplacer dans le répertoire de travail et lister les fichiers

    cd MGC2367MG1/TPI0_python
    ls
    

6.1.3.2. Interpreteur Ipython#

  • permet d’executer des instructions en python ou un programme python dans un fichier

  • pour executer une série d’instruction, il faut taper sur les touches shift + entrée

6.1.3.3. Editeur de texte#

  • permet de rentrer du code python dans un fichier texte

6.1.3.4. Notebooks#

  • permet d’afficher / ou executer un notebook

  • exemple: parmis les fichiers du répertoire à gauche, vous retrouvez le notebook que vous pouvez ouvrir (fermer dans ce cas la fenêtre du notebook Jupyter) en cliquant simplement sur le nom du fichier notebook TP01_ipynb.

6.1.4. Méthode de travail#

Accéder à l’interface jupyterlab, en remplacant tree par lab dans l’URL

https://jupyterM2.mecanique.univ-lyon1.fr/user/pxxxx/lab

6.1.4.1. Consignes#

  • ouvrir un terminal et se déplacer dans le dossier du TP:

     cd MGC2367M/TPI0_python
     ls
    

6.1.4.2. Algorithme de réussite#

  1. editer le fichier python

    • éditer le fichier python mon_pge.py en cliquant dessus pour appeler l’éditeur

    • dans la fenetre d’édition, ouvrir un interpréteur ipython en cliquant une fois dans la fenetre

  2. boucle sur les exercices (pour chaque exercise i de 0 à n-1):

    1. programmation d’un exercise:

    • sur un papier, choisir un example pour comprendre ce qui est demandé, puis écrire l’algorithme.

    • pour chaque exercise i écrire la fonction funci() en spécifiant les arguments et la valeur de retour.

    • attention au type des arguments (tableaux d’entiers, réeel, …)

    1. vérification

    • à la fin du fichier dans la section :

      if __name__ == '__main__' :
      

      appeller la fonction funci() avec un jeux d’arguments pour vérifier son execution.

    • Puis dans la console ipython executer le programme avec :

      run mon_pge.py
      
    • ou dans un terminal

      pyhon3 mon_pge.py
      

      pour vérifier.

    • En cas d’erreur reboucler sur la programmation (phase A)

    1. validation si la vérification (phase B) est bonne

    • utiliser la fonction valide_exo pour passer les tests de validation:

    (uniquement si aucune erreur de syntaxe et si la phase de vérification est faîte)

       valide_exo  -m MGC2367M_TP1 exoxx funci
    

    en cas d’erreur reboucler sur A.

    1. passer à l’exercice suivant (aller en 2)

  3. finalisation

    • à la fin du TP, rendre le devoir en appuyant sur le bouton submit (dans l’onglet assignement)

S=['exo51', 'S50', 'S50', 'S60', 'S60', 'S70', 'S70', 'S80', 'S80', 'S90']
Func=['func','func1','func2','func3','func4','func5', 'func6', 'func7', 'func8','func9']
Exos=liste_functions(S,_uid_)
printmd("**Exercices à **")
print("nbre d'exercices = ",len(Exos))
Note_exos = [0]*len(Exos)
print(Exos)
print("Nom des fonctions à ecrire")
print(Func)
Note_exos = [0]*(len(Exos))

**Exercices à **

nbre d'exercices =  10
['exo51', 'exo56', 'exo50', 'exo68', 'exo65', 'exo70', 'exo71', 'exo81', 'exo88', 'exo93']
Nom des fonctions à ecrire
['func', 'func1', 'func2', 'func3', 'func4', 'func5', 'func6', 'func7', 'func8', 'func9']

6.1.5. Exemple: ecrire une fonction tq#

  • exo51

Given integers n and k, return a numpy array of length n containing 0 1 2 … k-1 0 1 2 … k-1 …

  • func0

implementation dans une fonction nommée func0

# solution
def func0(n,k):
    """Given integers n and k, return a numpy array of length n containing 0 1 2 ... k-1 0 1 2 ... k-1 ..."""
### SOLUTION
    L = np.zeros(n,dtype=int)
    K = np.arange(k,dtype=int)
    for i in range(0,n,k):
        if (i+k) > n :
            L[i:n]   = K[0:n-i]
        else :
            L[i:i+k] = L[0:k]
    return L
### SOLUTION

6.1.5.1. test de verification func#

  • func0(7,3) renvoie

      [0 1 2 0 1 2 0]
    
  • func0(6,2) renvoie

      [0 1 0 1 0 1]
    

6.1.5.2. test de validation#

dans le terminal tapez la commande suivante

     test_exo mon_pge.py exo51 func

6.1.6. Liste des exos à valider#

Pour chaque exercice (i de 1 à 9)

  • écrire la fonction funci correspondant à l’exercice exoxx avec l’éditeur dans le fichier mon_pge.py

  • dans le terminal, tapez la commande

     test_exo mon_pge.py exoxx funci
    
printmd("**Exercices à valider**")
# definition des fonctions
for k in range(1,len(Exos)):
    printmd("**Exercise {} fonction à écrire {}**".format(Exos[k],Func[k]))
    info_function(Exos[k])

Exercices à valider

Exercise exo56 fonction à écrire func1

Given a numpy array of integers, find the shortest distance between two consecutive elements
    

Exercise exo50 fonction à écrire func2

Given an integer n, return a numpy array of length n containing 1 -1 1 -1 ...
    

Exercise exo68 fonction à écrire func3

 Given an array of integers and an integer n, give the largest sum of n consecutive elements.
    

Exercise exo65 fonction à écrire func4

Given an array of integers and two values a and b, return the sum of all 
elements that are at least a and at most b
    

Exercise exo70 fonction à écrire func5

Ecrire une fonction qui calcule la matrice de VanderMonde pour un vecteur X d'ordre n, qui contient dans chaque colonne  j (j de 1 a n): X^(j-1) .
    

Exercise exo71 fonction à écrire func6

Ecrire une fonction qui calcule la matrice symetrique de Toeplitz pour un vecteur X d'ordre n: i.e. telle que A[i,j]=X[j-i]  pour j>=i (i,j de 0 a n-1)
    

Exercise exo81 fonction à écrire func7

ecrire une fonction qui teste si 2 nombres reels a et b  sont égaux avec une précision eps donnée.
    

Exercise exo88 fonction à écrire func8

    ecrire une fonction qui teste si 2 vecteurs X et Y sont colinéaires avec une precision  eps donnée sur leur produit scalaire
    

Exercise exo93 fonction à écrire func9

On a chessboard, fields are marked with a letter between a and h for the column and a number between 1 and 8 
for the row. Given a position string (p.e. c4), return the color of the field (string "white" or "black").
    

6.1.7. Résolution des exercices dans le notebook#

6.1.7.1. Exercise : écrire une fonction func1#

printmd("### Exercise : écrire une fonction func0 t.q.")
nom = Exos[1]
info_function(nom)

Exercise : écrire une fonction func0 t.q.

Given a numpy array of integers, find the shortest distance between two consecutive elements
    
#rentrer votre code pour func1
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
Test de Verification: appel de la fonction
# test de validation
assert(check_function(func1,Exos[1]))
validation:  exo56 
Given a numpy array of integers, find the shortest distance between two consecutive elements
    
ERREUR lors de l'execution de <function func1 at 0x7f750368a0e0> pour le test exo56
func1() takes 0 positional arguments but 1 was given
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
/tmp/ipykernel_519652/2328288488.py in <cell line: 2>()
      1 # test de validation
----> 2 assert(check_function(func1,Exos[1]))

AssertionError: 

6.1.7.2. Exercise : écrire une fonction func2#

printmd("### Exercise: écrire une fonction func2 t.q.")
nom = Exos[2]
info_function(nom)
#rentrer votre code pour func2
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func2,Exos[2]))

6.1.7.3. Exercise : écrire une fonction func3#

printmd("### Exercise: écrire une fonction func3 t.q.")
nom = Exos[3]
info_function(nom)
#rentrer votre code pour func3
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func3,Exos[3]))

6.1.7.4. Exercise : écrire une fonction func4#

printmd("### Exercise: écrire une fonction func4 t.q.")
nom = Exos[4]
info_function(nom)
#rentrer votre code pour func4
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func4,Exos[4]))

6.1.7.5. Exercise : écrire une fonction func5#

printmd("### Exercise: écrire une fonction func5 t.q.")
nom = Exos[5]
info_function(nom)
#rentrer votre code pour func5
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func5,Exos[5]))

6.1.7.6. Exercise : écrire une fonction func6#

printmd("### Exercise: écrire une fonction func6 t.q.")
nom = Exos[6]
info_function(nom)
#rentrer votre code pour func6
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func6,Exos[6]))

6.1.7.7. Exercise : écrire une fonction func7#

printmd("### Exercise: écrire une fonction func7 t.q.")
nom = Exos[7]
info_function(nom)
#rentrer votre code pour func7
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func7,Exos[7]))

6.1.7.8. Exercise : écrire une fonction func8#

printmd("### Exercise: écrire une fonction func8 t.q.")
nom = Exos[8]
info_function(nom)
#rentrer votre code pour func8
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func8,Exos[8]))

6.1.7.9. Exercise : écrire une fonction func9#

printmd("### Exercise: écrire une fonction func9 t.q.")
nom = Exos[9]
info_function(nom)
#rentrer votre code pour func9
### BEGIN SOLUTION
def func1():
    return
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION

### END SOLUTION
# test de validation
assert(check_function(func9,Exos[9]))

6.1.8. FIN#