4.2. Exercices Numpy: étude de fonction en Python#

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=['S050', 'S50', 'S60', 'S60','S70']
Exos=liste_functions(S,_uid_)
from Fonction import Poly3,Rationnel2
_p3_ = Poly3(NUMERO_ETUDIANT)
_p3_ = Poly3(NUMERO_ETUDIANT+1)
_r2_ = Rationnel2(NUMERO_ETUDIANT)
try:
    printmd("### INITIALISATION OK!")
    print("liste des exos: ",Exos)
    print("Fonctions à étudier: {} et {}".format(str(_r2_),str(_p3_)))
except:
    print("Erreur vous n'avez pas executée la cellule précédente !")
    print("Votre Notebook n'est pas initialisé correctement !")

4.2.1. Compte rendu#

  1. éditer le fichier CompteRendu.md (menu fichier->ouvrir), 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

4.2.2. Etude de la fonction poly3#

pour la fonction poly3 donnée ci-dessous, écrire les fonctions suivantes:

  • fonction poly3(x) qui calcule la valeur de la fonction au point x

  • fonction deriv_poly3(x) qui calcule la valeur de la dérivée de la fonction poly3 au point x

  • fonction racines_deriv_poly3() qui calcule les racines de la dérivée de poly3 (renvoie un tableau numpy)

  • fonction racines_entieres_poly3() qui calcule les racines entières de la fonction poly3 comprise en -10 et 10 (renvoie un tableau numpy et attention aux erreurs d’arrondie)

A l’aide de ces fonctions, faire l’étude de la fonction entre sa plus grande et sa plus petite racine, qui sont des entiers compris entre -10 et 10, en calculant en particulier son minimum et maximum sur l’intervalle.

On tracera la fonction et sa dérivée sur cet intervalle avec un titre et des légendes avec la bibliothèque matplotlib. On sauvegardera la figure sur un fichier avec la fonction

    plt.savefig('mafigure.png')

Le bilan de l’étude de la fonction sera décrite dans le fichier CompteRendu.md dans laquelle on inclura la figure en la commentant

    ![caption (description de la figure)](mafigure.png)
print("fonction à étudier: poly3(x) = {}".format(str(_p3_)))
# fonction a écrire
def poly3(x):
def deriv_poly3(x):
def racines_deriv_poly3():
def racines_entieres_poly3():
# test de validation
assert(_p3_.test1(poly3))
assert(_p3_.test2(deriv_poly3))
assert(_p3_.test3(racines_entieres_poly3()))
assert(_p3_.test4(racines_deriv_poly3()))
# etude de la fonction: calcul des racines, de la dérivée, détermination des maximum et minimum
# et tracer de la fonction et de sa dérivée
### BEGIN SOLUTION
# tracer
#plt.savefig('mafigure.png')
### END SOLUTION
# test de vérification
assert(test_code('TP_exos2_numpy.ipynb','cell-verif02',
    ['poly3','deriv_poly3','racines_entieres_poly3','racines_deriv_poly3','plt.plot','plt.title','plt.xlabel']))
# test le compte rendu
assert(test_markdown('CompteRendu.md',None,60,0.3))

4.2.3. Etude de la fonction frac2#

pour la fonction frac2 donnée ci-dessous, écrire les fonctions suivantes:

  • fonction frac2(x) qui calcule la valeur de la fonction au point x

  • fonction deriv_frac2(x) qui calcule la valeur de la dérivée de la fonction frac2 au point x

  • fonction racines_deriv_frac2() qui calcule les racines de la dérivée de frac2 (renvoie un tableau numpy)

  • fonction racines_entieres_frac2() qui calcule les racines entières de la fonction frac2 comprise en -10 et 10 (renvoie un tableau numpy et attention aux erreurs d’arrondie)

A l’aide de ces fonctions, faire l’étude de la fonction entre sa plus grande et sa plus petite racine, qui sont des entiers compris entre -10 et 10, en calculant en particulier son minimum et maximum sur l’intervalle.

On tracera la fonction et sa dérivée sur cet intervalle avec un titre et des légendes avec la bibliothèque matplotlib. On sauvegardera la figure sur un fichier avec la fonction

    plt.savefig('mafigure.png')

Le bilan de l’étude de la fonction sera décrite dans le fichier CompteRendu.md dans laquelle on inclura la figure en la commentant

    ![caption (description de la figure)](mafigure.png)
print("fonction à étudier: frac2(x) = {}".format(str(_r2_)))
# fonction a écrire
def frac2(x):
def deriv_frac2(x):
def racines_deriv_frac2():
def racines_entieres_frac2():
# test de validation
assert(_r2_.test1(frac2))
assert(_r2_.test2(deriv_frac2))
assert(_r2_.test3(racines_entieres_frac2()))
assert(_r2_.test4(racines_deriv_frac2()))
# etude de la fonction: calcul des racines, de la dérivée, détermination des maximum et minimu
# et tracer de la fonction et de sa dérivée
### BEGIN SOLUTION
# tracer
#plt.savefig('mafigure.png')
### END SOLUTION
# test de vérification
assert(test_code('TP_exos2_numpy.ipynb','cell-verif00',
    ['frac2','deriv_frac2','racines_entieres_frac2','racines_deriv_frac2','plt.plot','plt.title','plt.xlabel']))
# test le compte rendu
assert(test_markdown('CompteRendu.md',None,60,0.3,_r2_.test7(),0.8))

4.2.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)

4.2.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 verification
assert(test_code('TP_exos2_numpy.ipynb','cell-verif0','func0('))
# test de validation
assert(check_function(func0,Exos[0]))

4.2.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 verification
assert(test_code('TP_exos2_numpy.ipynb','cell-verif1','func1('))
# test de validation
assert(check_function(func1,Exos[1]))

4.2.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_exos2_numpy.ipynb','cell-verif2','func2('))
# test validation
assert(check_function(func2,Exos[2]))

4.2.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_exos2_numpy.ipynb','cell-verif3','func3('))
# test validation
assert(check_function(func3,Exos[3]))

4.2.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_exos2_numpy.ipynb','cell-verif4','func4('))
# test validation
assert(check_function(func4,Exos[4]))

4.2.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,200,0.3))

4.2.6. Partie optionnelle: étude numérique de la fonction p3#

pour la fonction p3 donnée ci-dessous, écrire les fonctions suivantes:

  1. fonction deriv_nump3(X) qui calcule les valeurs numériques approchées de la dérivée de p3(x) à partir des valeurs de p3 aux points X (X tableau numpy de coordonnées données en argument)

La valeur numérique \(f'_k\) de la dérivée est calculée sur chaque intervalle k : \([x_{k-1}, x_k]\) par approximation:

\[ f'_k = \frac{p3(x_k)-p3(x_{k-1})}{x_k - x_{k-1}} \]

La foncton renvoie le tableau numpy des valeurs numériques \(f'_k\)

  1. fonction integrale_nump3(X) qui calcule la valeur numérique de l’intégrale de p3(x) à partir des valeurs de p3 aux points X (X tableau numpy de coordonnées données en argument)

La valeur numérique de l’intégrale In utilise l’approximation par somme de Rieman (méthode des trapézes) de l’intégrale :

\[ In = \sum_{k=1}^n \frac{1}{2}\left(p3(x_k)+p3(x_{k-1})\right) (x_k - x_{k-1}) \]

A l’aide de ces fonctions, calculer l’approximation de la dérivée de p3(x) entre -5 et 5, ainsi que son intégrale numérique:

\[ I_{10} = \int_{-5}^{+5} p3(x)\,dx \]

On tracera la dérivée sur cet intervalle avec un titre et des légendes avec la bibliothèque matplotlib. On sauvegardera la figure sur un fichier avec la fonction

    plt.savefig('mafigure1.png')

Le bilan de l’étude de la fonction sera décrite dans le fichier CompteRendu.md dans laquelle on inclura la figure en la commentant

    ![caption (description de la figure)](mafigure1.png)
print("fonction à étudier: p3(x) = {}".format(str(_p3_)))
# fonctions à écrire
def deriv_nump3(X):
    
def integrale_nump3(X):
# test de validation
X = np.linspace(-10,10,21)
assert(_p3_.test5(X,deriv_nump3(X)))
assert(_p3_.test6(X,integrale_nump3(X)))
# calcul dérivée et intégrale entre -5 et 5
# et tracer de la dérivée
### BEGIN SOLUTION
# calcul integrale
# tracer
# attention calcul de la dérivée au mileiu
#plt.savefig('mafigure1.png')
### END SOLUTION
# test de vérification
assert(test_code('TP_exos2_numpy.ipynb','cell-verif01',
    ['deriv_nump3','integrale_nump3','plt.plot','plt.title','plt.xlabel']))
# génération de la version html du CR
!genereTPhtml CompteRendu
# test le compte rendu
assert(test_markdown('CompteRendu.md',None,60,0.3))

4.3. 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__)