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#
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
boucle sur les exercices (pour chaque exercise i de 0 à n-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, …)
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)
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.
passer à l’exercice suivant (aller en 2)
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]))