3.3. Exercices Numpy : Algèbre linéaire#

Marc BUFFAT, dpt mécanique, Université Lyon 1

vous devez écrire les fonctions dont le nom est fixé, mais dont vous devez spécifier les arguments en fonction de la question posée.

Chaque fonction avec l’algorithme, les tests et la validation rapporte des points

Attention il faut exécuter les cellules suivantes pour afficher votre nom !!

# bibliotheque
import os,sys
import numpy as np
import matplotlib.pyplot as plt
from validation.validation import check_function,liste_functions,info_function, info_etudiant, bib_validation
from validation.valide_markdown import test_markdown, test_code, test_algorithme
from IPython.display import Markdown, display
plt.rc('font', family='serif', size='16')
# bibliotheque
bib_validation('cours','MGC2028L')
def printmd(string):
    display(Markdown(string))
try: NUMERO_ETUDIANT
except NameError: NUMERO_ETUDIANT = None 
# test si numero étudiant spécifier
if type(NUMERO_ETUDIANT) is not int :
    NOM, PRENOM, NUMERO_ETUDIANT = info_etudiant()
# parametres spécifiques
_uid_    = NUMERO_ETUDIANT 
_precis_ = 1.0e-5
printmd("## Etudiant {} {}  id={}".format(NOM,PRENOM,NUMERO_ETUDIANT))
S=['S0', 'S10', 'S20', 'S050', 'S50']
Exos=liste_functions(S,_uid_)
from bases import Base, BaseOrtho
try:
    printmd("### INITIALISATION OK!")
    print("liste des exos: ",Exos)
except:
    print("Erreur vous n'avez pas executée la cellule précédente !")
    print("Votre Notebook n'est pas initialisé correctement !")

3.3.1. Compte rendu#

  1. éditer le fichier CompteRendu.md, puis géner la sortie html avec la commande ci-dessous

     # génération de la version html du CR
     !genereTPhtml CompteRendu
    
  2. visualiser le fichier CompteRendu.html

3.3.2. Un exemple d’exercise (solution donnée en TP)#

On vous donne tout d’abord la définition de la fonction à écrire avec ces paramêtres et le résultat attendu

printmd("### Exercise test: écrire une fonction func t.q.")
nom = "exo5"
info_function(nom)

3.3.2.1. Analyse#

écrire l’analyse, l’algorithme et le test de validation dans le fichier CompteRendu.md

La fonction a écrire doit s’appeler Moyenne

Comment la précision sur les calculs intervient-elle lors de la vérification ?

3.3.2.2. Programmation#

#rentrer votre code pour la fonction Moyenne
### BEGIN SOLUTION
### END SOLUTION

3.3.2.3. Vérification#

on choisit des valeurs ou on connait la solution pour tester

printmd("### Verification: appel de la fonction")
### BEGIN SOLUTION
# remarque calcul approchée on ne trouve pas 4 !
### END SOLUTION

3.3.2.4. Validation#

une fois la fonction testée on peut passer à l’étape de validation, qui sert aussi à noter le travail

# test verification
assert(test_code('TP_exos1_numpy.ipynb','cell-verif','Moyenne('))
# test de validation
assert(check_function(Moyenne,nom))

3.3.3. Décomposition de vecteurs sur une base#

3.3.3.1. base de \(R^n\)#

Soient n vecteurs \({\vec{e}^k}\) de \(\mathcal{R}^n\) données par leurs composantes dans \(\mathcal{R}^n\) :

\[\begin{split} \vec{e^k } = \begin{bmatrix} e^k_1 \\ e^k_2 \\ \vdots \\ e^k_n \end{bmatrix} \end{split}\]

on veut déterminer les composantes de tout vecteur v de \(\mathcal{R}^n\) dans cette base. Pour cela on demande d’écrire les fonctions suivantes:

  • composantes(U,LB): fonction qui calcule les composantes du vecteur U de \(\mathcal{R}^n\) dans une base LB, qui est une liste de n vecteurs libres

  • test_libre(L): fonction qui teste si les n vecteurs de la liste L forment une famille libre

on écrira aussi une fonction vecteur qui calcul les coordonnées dans \(\mathcal{R}^n\) d’un vecteur dont on donne les composantes dans la base LB

  • vecteur(X,LB): calcul vecteur U comme combinaison linéaire (de coefficients X) des vecteurs de la base LB

3.3.3.2. analyse#

On écrira dans le fichier CompteRendu.md le principe des méthodes utilisés dans chacune de ces 2 fonctions en utilisant la bibliothéque linalg de numpy:

  • calcul du produit scalaire en utilisant la fonction np.linalg.dot ou l’opérateur @

  • mise sous forme matricielle du problème et résolution du système linéaire \(A X = B\) en vérifiant que le système admet une solution (calcul du déterminant) et en calculant cette solution en utilisant la fonction solve

        X = np.linalg.solve(A,B)
    
  • attention à la précision des calculs sur ordinateur. On choisira une précision \(\epsilon = 1. 10^{-8}\)

La base de vecteur à utiliser sera donnée dans une cellule ci-dessous dans la variable LB. Attention la base change chaque fois que vous exécutez la cellule

Ecrire votre analyse dans le fichier CompteRendu.md au format markdown

3.3.3.3. Exemple d’analyse:#

3.3.3.4. solution algorithmique#

# test le compte rendu
assert(test_markdown('CompteRendu.md',None,60,0.3))

3.3.3.5. écriture des fonctions#

PRECIS = 1.e-8
def vecteur(X,LB):
    """calcul du vecteur de composante X dans la base LB"""
## BEGIN SOLUTION
## END SOLUTION

def composantes(U,LB):
    """calcul les composantes de U dans la base LB"""
## BEGIN SOLUTION
## END SOLUTION

def test_libre(LB):
    """test si les vecteurs dans liste LB sont indépendants"""
    global PRECIS
## BEGIN SOLUTION
## END SOLUTION

printmd("### Verification: appel de la fonction")
### BEGIN SOLUTION
### END SOLUTION

# test de validation
LB = Base(5)
assert(test_libre(LB))
X  = np.ones(5)
U  = vecteur(X,LB)
XX  = composantes(U,LB)
print("Base:",LB)
print("vecteur U=",U)
print("composante X=",X)
assert(np.linalg.norm(XX - X)<1.e-10)

3.3.3.6. application avec une base orthonormée#

Quelles sont les propriétés de ce type calcul dans le cas d’une base orthogonales.

On ferra des tests de vérifications en utilisant la base orthogonale générée dans la cellule suivante?

LB = BaseOrtho(4)
## BEGIN SOLUTION
# calcul par projection
## END SOLUTION

3.3.4. Liste des exercices à faire#

Dans la suite, pour chaque exercise vous aurez:

  • une cellule avec la définition de la fonction, ses arguments et le résultat à fournir.

  • une cellule de code (programmation) où vous aurez à définir en Python la fonction en spécifiant les bons arguments mais sans changer le nom de la fonction,

  • une cellule (test) où vous aurez à tester vous même la fonction (avant la validation)

  • une cellule (validation) pour valider la fonction (et noter votre travail)

L’analyse algorithmique de chaque fonction sera décrite dans le fichier CompteRendu.md avec le test de validation

printmd("## Exercices à valider")
print(Exos)
printmd("## Details des exercices")
for i,nom in enumerate(Exos):
    printmd("### Exercise {}".format(i))
    info_function(nom)

3.3.4.1. Exercise 0#

printmd("### Exercise 0: écrire une fonction func0 t.q.")
nom = Exos[0]
info_function(nom)
#rentrer votre code pour func0
### BEGIN SOLUTION
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION
### END SOLUTION
# test de validation
assert(test_code('TP_exos1_numpy.ipynb','cell-verif0','func0('))
assert(check_function(func0,Exos[0]))

3.3.4.2. Exercise 1#

printmd("### Exercise 1: écrire une fonction func1 t.q.")
nom = Exos[1]
info_function(nom)
#rentrer votre code pour func1
### BEGIN SOLUTION
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION
### END SOLUTION
# test de validation
assert(test_code('TP_exos1_numpy.ipynb','cell-verif1','func1('))
assert(check_function(func1,Exos[1]))

3.3.4.3. Exercise 2#

printmd("### Exercise 2: écrire une fonction func2 t.q.")
nom = Exos[2]
info_function(nom)
#rentrer votre code pour func2
### BEGIN SOLUTION
### END SOLUTION
print("Test de Verification: appel de la fonction")
### BEGIN SOLUTION
### END SOLUTION
# test verification
assert(test_code('TP_exos1_numpy.ipynb','cell-verif2','func2('))
# test validation
assert(check_function(func2,Exos[2]))

3.3.4.4. Exercise 3#

printmd("### Exercise 3: écrire une fonction func3 t.q.")
nom = Exos[3]
info_function(nom)
# entrer le code de la fonction func3
### BEGIN SOLUTION
### END SOLUTION
print("Verification: appel de la fonction")
### BEGIN SOLUTION
### END SOLUTION
# test verification
assert(test_code('TP_exos1_numpy.ipynb','cell-verif3','func3('))
# test validation
assert(check_function(func3,Exos[3]))

3.3.4.5. Exercise 4#

printmd("### Exercise 4: écrire une fonction func4 t.q.")
nom = Exos[4]
info_function(nom)
# entrez le code pour func4
### BEGIN SOLUTION
### END SOLUTION
print("Verification: appel de la fonction")
### BEGIN SOLUTION
### END SOLUTION
# test verification
assert(test_code('TP_exos1_numpy.ipynb','cell-verif4','func4('))
# test validation
assert(check_function(func4,Exos[4]))

3.3.5. Bilan de votre compte rendu#

# génération de la version html du CR
!genereTPhtml CompteRendu
# test le compte rendu
assert(test_markdown('CompteRendu.md',None,100,0.25))

3.4. FIN#

# version
from platform import python_version,uname,platform
print("Systeme       :",uname())
print("OS            :",platform())
print("version python:",python_version())
print("version numpy :",np.__version__)