ajout des tp de maths

master
antoine.perederii 2 years ago
parent 6dd90cc088
commit 5eb72589b3

@ -0,0 +1,48 @@
-- DROP TABLE IF EXISTS FAIRE, INTERVENTION, REPARATION, TECHNICIEN, CLIENT CASCADE;
DROP TABLE FAIRE;
DROP TABLE INTERVENTION;
DROP TABLE REPARATION;
DROP TABLE TECHNICIEN;
DROP TABLE CLIENT;
CREATE TABLE CLIENT (
noClient numeric PRIMARY KEY,
nom varchar(30) NOT NULL,
prenom varchar(30) NOT NULL,
rue varchar(30) NOT NULL,
codePostal char(5) NOT NULL,
ville varchar(30) NOT NULL,
noTelephone char(10) NOT NULL
);
CREATE TABLE TECHNICIEN (
noEmploye numeric PRIMARY KEY,
nom varchar(30) NOT NULL,
prenom varchar(30) NOT NULL
);
CREATE TABLE INTERVENTION (
noIntervention numeric PRIMARY KEY,
date date NOT NULL,
noClient numeric NOT NULL REFERENCES CLIENT(noClient),
noEmploye numeric NOT NULL REFERENCES TECHNICIEN(noEmploye)
);
CREATE TABLE REPARATION (
codeReparation numeric PRIMARY KEY,
designation varchar(30) NOT NULL,
prix numeric(6,2) NOT NULL
);
CREATE TABLE FAIRE (
noIntervention numeric NOT NULL REFERENCES INTERVENTION(noIntervention),
codeReparation numeric NOT NULL REFERENCES REPARATION(codeReparation),
PRIMARY KEY (noIntervention, codeReparation)
);
INSERT INTO CLIENT VALUES (1, 'DUPONT', 'Jean', 'Rue des Lilas', '75001', 'Paris', '0123456789');
INSERT INTO CLIENT VALUES (2, 'DURAND', 'Marie', 'Rue des Roses', '63002', 'Clermont-Ferrand', '0234567890');
INSERT INTO CLIENT VALUES (3, 'DUPOND', 'Pierre', 'Rue des Marguerites', '63003', 'Clermont-Ferrand', '0345678901');
SELECT * FROM CLIENT WHERE ville='Clermont-Ferrand' ORDER BY noTelephone;

@ -0,0 +1,127 @@
import numpy as np
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
# --------------------------------------------------------------------------------------
# Fonction de "fin temporaire" pendant l'avancée du TP. Attend une frappe Entrée, puis quitte le script.
def stop_ici():
input()
exit()
# --------------------------------------------------------------------------------------
# Tous les passages indiqués "TODO()" sont à remplacer par vos soins
def TODO():
print("à vous!")
stop_ici()
#################################################################################################
###
### EXERCICE 1 : Résolution de systèmes linéaires avec Numpy
###
#################################################################################################
print("Bonjour et bonne année ! Pour ce TP vous aurez également besoin d'une feuille et d'un stylo.")
print("Merci à vous aussi !!! Ah, il va donc falloir que je le sorte de mon sac ?!?!? Vous vous rendez ompte de cet effort productif !!!")
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print("Veuillez s'il-vous-plaît compléter et signer le texte suivant.")
declaration = '''
Je déclare par la présente disposer d'une feuille et d'un stylo, et décharger mon enseignant de math de toute incompréhension relative à l'absence de l'un ou l'autre de ces deux objets.
Fait à Aubière le XX/XX [dater] en un exemplaire, et signé par l'étudiant.e
XXX [signature]
'''
print(declaration)
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("Merci, j'en prends bonne note :)")
print("-"*80)
# Numpy permet de résoudre des systèmes linéaires, par exemple en calculant des MATRICES INVERSES.
A = np.array( [ [1,-4,2] , [3,3,6] , [-2,-1,0] ] )
M = np.linalg.inv(A) # nota : "linalg" signifie "algèbre linéaire" (le vrai nom de la théorie des matrices)
print("A=\n",A)
print("M=\n",M)
# Vérification :
print("A*M=\n",A.dot(M))
print("M*A=\n",M.dot(A))
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
# Des agriculteurs conditionnent leurs légumes sous la forme de quatre "paniers" destinés à différentes préparations culinaires.
# Voici les contenus de chaque panier :
# Panier : "Pot-au-feu" "Potée" "Boeuf bourguignon" "Chou farci"
# Patates (kg) 0 1 2 0
# Chou (unités) 0 0.5 0 1
# Carottes (kg) 1 1 1 0
# Oignons (kg) 0.25 0.25 0.25 0.25
# Question : Les agriculteurs ont récolté 540 kg de patates, 220 choux, 340 kg de carottes et 130 kg d'oignons. Afin d'écouler toute leur production, combien doivent-ils préparer de panier de chaque type ?
print('''(Question papier) Montrez que le problème des agriculteurs constitue un système linéaire, de la forme
A * v = b
A est la matrice des coefficients
b est le vecteur du second membre
v est le vecteur des inconnues
Précisez le contenu de la matrice A et du vecteur b''')
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
# On va à présent résoudre ce système avec Numpy.
print("Rentrez les paramètres du système linéaire (A et b), sous forme de np.array")
A = np.array( [ [0 , 1, 2, 0] , [0, 0.5, 0, 1] , [1, 1, 1, 0] , [0.25, 0.25, 0.25, 0.25]] )
b = np.array( [ [540] , [220] , [340] , [130]] )
print("A=\n",A)
print("b=\n",b.reshape(-1,1))
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print("Trouvez avec Numpy la solution du système.")
v = np.linalg.inv(A).dot(b) # .dot() est le produit matriciel
print("v=\n",v.reshape(-1,1))
# Vérification:
if not np.allclose (A.dot(v), b):
print('Erreur, v n''est la solution du système A*v=b')
# stop_ici()
print(f'''Conclusion : les agriculteurs doivent préparer:
{v[0]} paniers \"pot-au-feu\"
{v[1]} paniers \"potée\"
{v[2]} paniers \"boeuf bourguignon\"
{v[3]} paniers \"chou farci\"''')
# Voilà pour la mise en jambes !
# Pour la suite, retenez bien comment on résout un système linéaire avec Numpy.

@ -0,0 +1,300 @@
import numpy as np
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
import matplotlib.pyplot as plt
# On active le "mode interactif" de pyplot. Ainsi, les plt.show() ne sont plus nécessaires.
plt.ion()
# --------------------------------------------------------------------------------------
# Fonction de "fin temporaire" pendant l'avancée du TP. Attend une frappe Entrée, puis quitte le script.
def stop_ici():
plt.pause(0.1) # nécessaire pour que matplotlib ait le temps d'afficher les figures
input()
exit()
# --------------------------------------------------------------------------------------
# Tous les passages indiqués "TODO()" sont à remplacer par vos soins
def TODO():
print("à vous!")
stop_ici()
#################################################################################################
###
### EXERCICE 2 : Interpolation polynômiale en 1D
###
#################################################################################################
### Mise en jambes : afficher le graphe d'un polynôme
#####################################################
# Aux TPs précédents, vous avez vu comment Numpy permet facilement d'appliquer une fonction directement
# à l'ensemble d'un tableau de valeurs
print('''On considère le polynôme P(X)=3-X+X^2.
Utilisez Numpy pour calculer P(t) aux points t=0, 0.5, 1, 1.5, ..., 4''')
t = np.linspace(0,4,9)
print("t=\n",t)
Pt = 3-t+t**2
print("P(t)=\n",Pt)
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
# Toutefois, dans ce TP, on va calculer les valeurs P(t) avec une autre méthode, encore plus puissante,
# basée directement sur les coefficients du polynôme. Le principe est le suivant:
# * Un polynôme P(X) de degré N-1 peut être représenté par une liste "p" de taille N, contenant ses N coefficients.
# Les coefficients doivent être stockés en commençant par le plus petit ordre (= le terme constant).
# Par exemple, le polynôme 1+3X-7X^2 est représenté par la liste p=[1,3,-7]
# * Le module numpy.polynomial.polynomial possède ensuite une fonction intitulée "polyval"
# qui permet d'évaluer directement un polynôme de coefficients "p" aux valeurs de la variable données par "t"
from numpy.polynomial.polynomial import polyval
print('''Définissez une liste "p" représentant le polynôme
P(X) = 3 -X +X^2
''')
p = [3, -1, 1]
Pt = polyval(t,p) # La ligne importante !
print("p (coefficients)=\n",p)
print("t=\n",t)
print("P(t)=\n",Pt)
# Vérification : dans P(t) vous devez retrouver exactement les mêmes valeurs qu'à la question précédente !
# Si c'est bien le cas, vous pouvez passer à la suite.
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''En utilisant la fonction polyval, représentez le graphe du polynôme
P(X) = 2 -3X -4X^2 +X^3
sur l'intervalle [-5,5]''')
# Coefficients du polynôme P(X)
p = [2, -3, -4, 1]
# Discrétisation de l'intervalle [-5,5] en 200 points
t = np.linspace(-5,5,200)
# Calcul de P(t) pour chacune des valeurs dans le tableau t
Pt = polyval(t,p)
# Création d'une figure, et représentation de la courbe (t,P(t)) sur l'intervalle [-5,5]
plt.figure()
plt.plot(t,Pt)
plt.grid()
# stop_ici() # --------------- Supprimez cette ligne pour passer à la suite -------------
# --------------------------------------------------------------------------------------
print("-"*80)
### Interpolation polynômiale quadratique (= de degré 2)
########################################################
#
# On arrive maintenant dans le vif du sujet : l'INTERPOLATION polynômiale
# (c'est-à-dire le calcul d'un polynôme qui passe par un ensemble de points donnés).
#
### On définit 3 points "cible"
# Abscisses (t) des 3 cibles
ts = 1,2,3
# Ordonnées (y) des 3 cibles
ys = 4,-1,0
# Représentation graphique des points cible
plt.figure()
plt.plot(ts,ys,linestyle='none',marker='o')
plt.grid()
plt.title("Problème d'interpolation")
# stop_ici() # --------------- Supprimez cette ligne pour passer à la suite -------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''(Question papier) On cherche un polynôme P(X) de degré 2
P(X) = u + v.X + w.X^2
qui INTERPOLE ces 3 points, c'est-à-dire qui vérifie
P(t)=y
pour chacun des 3 points cible. Soit, ici :
P(1) = 4
P(2) = -1
P(3) = 0
Montrez que ces 3 équations constituent un *système linéaire* sur les 3 coefficients inconnus (u,v,w).
Précisez la matrice de ce système (appelons-la A), et le vecteur du second membre (appelons-le b).
''')
A = np.array([[1,1,1],[1,2,4],[1,3,9]])
b = np.array([4,-1,0])
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print("Résolvez ce système linéaire, c'est-à-dire trouvez la valeur des coefficients (u,v,w) recherchés.")
p = np.linalg.solve(A,b)
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print("Dans la même figure que précédemment, représentez le graphe du polynôme P. Vérifiez qu'il INTERPOLE bien les 3 points imposés.")
plt.figure()
plt.plot(ts,ys,linestyle='none',marker='o')
t = np.linspace(0,4,200)
Pt = polyval(t,p)
plt.plot(t,Pt)
plt.grid()
plt.title("Problème d'interpolation")
# stop_ici() # --------------- Supprimez cette ligne pour passer à la suite -------------
# --------------------------------------------------------------------------------------
print("-"*80)
### Interpolation polynômiale quelconque (= de degré N)
########################################################
# On considère maintenant les abscisses
# t=1,2,3,...,N
# et on se donne N valeurs 'cible' en ordonnées :
# y1,y2,...,yN
ys = np.array([ 3,1,2,-2,-4 ])
N = len(ys) # (Ici, N=5, mais votre code doit être robuste si cette valeur change)
plt.figure()
plt.plot(range(1,N+1),ys,linestyle='none',marker='o')
plt.grid()
plt.title("Problème d'interpolation")
# stop_ici() # --------------- Supprimez cette ligne pour passer à la suite -------------
# --------------------------------------------------------------------------------------
print("-"*80)
# On peut montrer qu'il existe toujours un UNIQUE polynôme INTERPOLATEUR de degré N-1 qui vérifie
#P(1) = y1
#P(2) = y2
#...
#P(N) = yN
# Nota : en réalité l'interpolation marcherait pour n'importe quel choix de N nombres "ti" en abscisses (tant qu'ils sont deux à deux différents). Dans ce TP, on choisit que les abscisses "ti" soient 1,2,...,N pour simplifier.
print('''(Question papier) On cherche un polynôme P(X) de degré 4
P(X) = u + v.X + w.X^2 + z.X^3 + r.X^4
qui INTERPOLE les 5 points yi donnés en entrée, c'est-à-dire qui vérifie
P(i)=yi
pour i allant de 1 à 5.
(Soit dans notre exemple, concrètement:
P(1)=3
P(2)=1
P(3)=2
P(4)=-2
P(5)=-4)
Montrez que ces 5 équations constituent un *système linéaire* sur les 5 coefficients inconnus (u,v,w,z,r).
Précisez la matrice de ce système (appelons-la A), et le vecteur du second membre (appelons-le b).
''')
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Complétez le code suivant, définissant la matrice A.
(Remarque: l'intérêt de cette écriture est qu'elle reste valide lorsqu'on change le nombre de points N à interpoler.''')
A = np.array( [ [ i**j for j in range(N) ] for i in range(1,N+1) ] )
print("A=\n",A)
# stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Trouvez les coefficients du polynôme interpolateur P recherché.
Puis tracez son graphe sur l'intervalle [1,N].
Vérifiez qu'il interpole bien les N ordonnées imposées.''')
p = np.linalg.solve(A,ys)
plt.figure()
plt.plot(range(1,N+1),ys,linestyle='none',marker='o')
t = np.linspace(1,N,200)
Pt = polyval(t,p)
plt.plot(t,Pt)
plt.grid()
plt.title("Problème d'interpolation")
# stop_ici() # --------------- Supprimez cette ligne pour passer à la suite -------------
# --------------------------------------------------------------------------------------
print("-"*80)
### Une fonction d'interpolation polynômiale
############################################
print('''Encapsulez votre code des questions précédentes dans une fonction, qui:
- prend en entrée une liste d'ordonnées ys=[y1,y2,...,yN] (le nombre pouvant varier)
- renvoie l'unique polynôme interpolateur de degré N-1 tel que
P(1) = y1
...
P(N) = yN
''')
def interpol(ys):
N = len(ys)
A = np.array( [ [ i**j for j in range(N) ] for i in range(1,N+1) ] )
p = np.linalg.solve(A,ys)
return p
# Test :
ys = np.array( [ 6,-1,4,3,0,2,1,1,1] )
p = interpol(ys)
plt.figure()
plt.plot(range(1,len(ys)+1),ys,linestyle='none',marker='o')
t = np.linspace(1,len(ys),200)
plt.plot(t,polyval(t,p))
plt.grid()
plt.title("Problème d'interpolation")
# Remarque : copiez votre fonction "interpol", elle ressert dans l'exo 3
stop_ici()

@ -0,0 +1,244 @@
import numpy as np
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
from numpy.polynomial.polynomial import polyval
import math
import matplotlib.pyplot as plt
# On active le "mode interactif" de pyplot. Ainsi, les plt.show() ne sont plus nécessaires.
plt.ion()
# --------------------------------------------------------------------------------------
# Fonction de "fin temporaire" pendant l'avancée du TP. Attend une frappe Entrée, puis quitte le script.
def stop_ici():
plt.pause(0.1) # nécessaire pour que matplotlib ait le temps d'afficher les figures
input()
exit()
# --------------------------------------------------------------------------------------
# Tous les passages indiqués "TODO()" sont à remplacer par vos soins
def TODO():
print("à vous!")
stop_ici()
#################################################################################################
###
### EXERCICE 3 : Interpolation polynômiale en 2D
###
#################################################################################################
### Mise en jambes : afficher une courbe paramétrée polynomiale
###############################################################
# Rappel de la séance du TP2 :
#
# Une *courbe paramétrée polynômiale* est une courbe paramétrée
# (P(t), Q(t))
# dont les 2 fonctions de coordonnées sont polynômiales.
#
# - La variable "t" s'appelle le **paramètre** de la courbe.
# - Chaque valeur de t définit UN point, dont l'abscisse vaut P(t) et l'ordonnée vaut Q(t).
# - La courbe est obtenue en représentant les points associés à TOUTES les valeurs de t.
# Cas particulier : Lorsque P et Q sont des polynômes de degré <=2, la courbe résultante est une parabole:
p = [1,1,1]
q = [-3,2,4]
t = np.linspace(-5,5,200)
Pt = polyval(t,p)
Qt = polyval(t,q)
plt.figure()
plt.plot(Pt,Qt)
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
# Lorsque le degré est >=3, par contre, la courbe peut ressembler un peu à n'importe quoi :
print('''Représentez la courbe paramétrée polynômiale
(P(t),Q(t))
associée aux polynômes
P(X) = 1 -4X + 2X^2 + X^3
Q(X) = 2 +7X + 2X^2 - X^4
pour le paramètre t dans l'intervalle [-2,2].''')
TODO()
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Représentez la courbe paramétrée polynômiale
(P(t),Q(t))
associée aux polynômes
P(X) = 7 - 3X + X^3
Q(X) = 12X -9X^2 + 2X^3
pour le paramètre t dans l'intervalle [-1,3].''')
TODO()
# Nota : Remarquez que cette courbe présente une particularité : un POINT DE REBROUSSEMENT.
# Cette situation survient lorsque les dérivées des 2 fonctions de coordonnées s'annulent *en même temps* : P'(t)=0 et Q'(t)=0.
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
### Interpolation polynômiale en 2D
###################################
# On se donne un certain nombre de points cibles **en 2D**.
# Pour être plus lisible, on donne maintenant ces points comme des COUPLES successifs de la forme (x,y)
cibles = (1,3), (4,-1), (0,2)
N = len(cibles) # (ici, N=3, mais votre code doit être robuste si cette valeur change)
print('''Fabriquez
-une liste "x" contenant les ABSCISSES de tous les points cible,
-une liste "y" contenant les ORDONNÉES de tous les points cible.''')
# (suggestion, utilisez la syntaxe "spéciale python" x = [ ..... for c in cibles ] )
x = TODO()
y = TODO()
print("x=\n",x,"\ny=\n",y)
# On peut maintenant afficher les points cibles:
plt.figure()
plt.plot(x,y,linestyle='none',marker='o')
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
# L'INTERPOLATION POLYNÔMIALE EN 2D consiste à fabriquer une courbe polynômiale
# (P(t),Q(t))
# qui **passe par tous les points cibles**, à certaines valeurs imposées du paramètre t.
# Dans notre cas, on décide que les valeurs imposées du paramètre sont
# t=1, t=2, ..., t=N
# C'est-à-dire que nos polynômes P et Q doivent vérifier
# t=1 -> point cible (x1,y1) -> P(1)=x1 et Q(1)=y1
# t=2 -> point cible (x2,y2) -> P(2)=x2 et Q(2)=y2
# ...
# t=N -> point cible (xN,yN) -> P(N)=xN et Q(N)=yN
print('''Trouvez
- l'unique polynôme P de degré N-1 qui interpole les N abscisses x, aux temps t=1,2,...,N.
- l'unique polynôme Q de degré N-1 qui interpole les N ordonnées y, aux temps t=1,2,...,N.
''')
# Indice : utilisez la fonction interpol définie à l'exercice 2
TODO()
p = TODO()
q = TODO()
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Dans la même figure que précédemment, tracez la courbe paramétrée
(P(t),Q(t))
lorsque le paramètre t varie sur l'intervalle [1,N].
Vérifiez que vous interpolez correctement les 3 points cibles.
''')
# Remarque : ici, N=3 points cibles s'interpolent par des polynômes P et Q de degré 2.
# La courbe résultante est donc une parabole.
TODO()
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Encapsulez votre code des questions précédentes dans une fonction, qui:
- prend N points en entrée (sous la forme d'une liste "cibles" contenant les N couples (xi,yi) à interpoler)
- calcule l'unique courbe polynômiale interpolatrice de degré N-1 telle que
P(1)=x1, Q(1)=y1
...
P(N)=xN, Q(N)=yN
- TRACE la courbe résultante, pour le pramètre t dans l'intervalle [1,N].
''')
# Remarque: votre fonction doit uniquement tracer la courbe résultante, pas marquer les points à interpoler (car en général on ne veut pas les voir).
def trace_interpol(cibles):
N = TODO()
TODO() # (plusieurs lignes)
plt.plot(TODO())
### Test de votre fonction :
# N points à interpoler (aux temps t=1,2,...,N)
cibles = (1,3),(4,-1),(0,2),(-1,-3),(0,0)
plt.figure()
# Représentation graphique des points...
plt.plot([c[0] for c in cibles],[c[1] for c in cibles],linestyle='None',marker='o')
# ...et de leur interpolation polynômiale :
trace_interpol(cibles) # (la fonction que vous venez d'écrire)
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Modifiez votre fonction "trace_interpol" précédente avec l'astuce suivante:
def trace_interpol(cibles,**kwargs)
......
......
plt.plot(....,**kwargs)
Cette astuce permet de passer à la fonction "trace interpol" n'importe quel argument clé/valeur (du genre linestyle='truc') et de le transmettre à la fonction plt.plot. Ainsi, vous pourrez par exemple appeler
trace_interpol(cibles, color='red', linestyle='dashed')
''')
### Test de votre fonction modifiée (sur les mêmes cibles que précédemment) :
plt.figure()
plt.plot([c[0] for c in cibles],[c[1] for c in cibles],linestyle='None',marker='o')
# Interpolation polynômiale avec le style modifiable :
trace_interpol(cibles, color='red',linestyle='dashed')
stop_ici() # -------------- Supprimez cette ligne pour passer à la suite --------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Et voilà, la partie 1 est presque finie !
Votre fonction "trace_interpol" vous offre maintenant un moyen concret de tracer des courbes en 2D, en les "contrôlant" à l'aide de quelques points de passage dont vous spécifiez les coordonnées.
Pour terminer le TP, utilisez votre fonction "trace_interpol" et essayez de reproduire l'une des figures données dans le sujet pdf. (À moins que vous préfériez inventer votre propre dessin!)''')
plt.close('all')
TODO()
stop_ici()

@ -0,0 +1,168 @@
import numpy as np
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
from numpy.polynomial.polynomial import polyval
import math
import matplotlib.pyplot as plt
# On active le "mode interactif" de pyplot. Ainsi, les plt.show() ne sont plus nécessaires.
plt.ion()
# --------------------------------------------------------------------------------------
# Fonction de "fin temporaire" pendant l'avancée du TP. Attend une frappe Entrée, puis quitte le script.
def stop_ici():
plt.pause(0.1) # nécessaire pour que matplotlib ait le temps d'afficher les figures
input()
exit()
# --------------------------------------------------------------------------------------
# Tous les passages indiqués "TODO()" sont à remplacer par vos soins
def TODO():
print("à vous!")
stop_ici()
# --------------------------------------------------------------------------------------
# Cette petite fonction sert à tracer les flèches avec une syntaxe un peu plus intuitive que le code matplotlib de base.
# - xdepart, ydepart : coordonnées du point d'attache de la flèche
# - xfleche, yfleche : longueurs de la flèche en x et en y
def myfleche(xdepart, ydepart, xfleche, yfleche):
plt.annotate("", (xdepart+xfleche,ydepart+yfleche) , (xdepart,ydepart),
arrowprops={'color':'red','shrink': 0,'width':0.02}, annotation_clip=False)
#################################################################################################
###
### EXERCICE 4 : Interpolation d'Hermite en 1D
###
#################################################################################################
# Comme expliqué dans le sujet pdf, le but est de trouver un polynôme qui passe par des points imposés
# (==> c'est ça, l'interpolation) mais avec la contrainte additionnelle que le polynôme doit aussi
# respecter des **valeurs imposées pour sa dérivée** aux mêmes points.
# Pour le moment, on se donne uniquement 2 points d'interpolation, aux abscisses t=1 et t=2.
### Cibles (aux points t=1,2)
ys = 2,5 # ordonnées
ds = 4,-3 # nombres dérivés
# Affichage du problème à résoudre : 2 points cible, ainsi que leurs *dérivées* cible:
plt.close('all')
plt.figure()
plt.title("Le problème d'interpolation à résoudre")
plt.xlabel('t')
plt.ylabel('P(t)')
for i in range(0,2):
plt.plot(i+1,ys[i],marker='o',color='blue')
h = 0.2 # écart h de l'approximation affine (détermine la longueur de la flèche)
myfleche(i+1, ys[i], h, h*ds[i])
plt.axis('equal') # (essayer aussi avec cette ligne commentée, parfois le résultat est mieux)
print('''(Question papier) On cherche un polynôme P(X) de degré 3
P(X) = u + v.X + w.X^2 + z.X^3
qui INTERPOLE ces 2 points ET les 2 dérivées correspondantes, c'est-à-dire qui vérifie
P(t)=y et P'(t)=d
pour chacun des 2 points cible. Soit, ici :
P(1) = 2
P(2) = 5
P'(1) = 4
P'(2) = -3
Montrez que ces 4 équations constituent un *système linéaire* sur les 4 coefficients inconnus (u,v,w,z).
Précisez la matrice de ce système (appelons-la A), et le vecteur du second membre (appelons-le b).
''')
A = TODO()
b = TODO()
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print("Trouvez le polynôme P (c'est-à-dire, les coefficients u,v,w,z) recherchés.")
p = TODO()
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print("Dans la même figure que précédemment, représentez le graphe du polynôme P. Vérifiez qu'il INTERPOLE bien les 2 points imposés avec les 2 valeurs de dérivée imposées.")
# Discrétisation de l'intervalle [1,2] en 200 points, puis représentation de P(t) sur cet intervalle:
TODO()
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Testez votre code avec d'autres valeurs pour les cibles "ys" et "ds" choisies
plus haut (mais toujours avec 2 points uniquement, car vous n'avez pas encore
implémenté la version générale).
Vérifiez que votre interpolation fonctionne bien à chaque fois.
(Indice si cela ne fonctionne pas : définissez-vous le vecteur b de manière suffisamment générique ?)''')
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
### Une fonction d'interpolation d'Hermite (pour seulement 2 points)
####################################################################
print('''Encapsulez votre code des questions précédentes dans une fonction, qui:
- prend en entrée une liste d'ordonnées ys=[y1,y2] et une liste de dérivées ts=[t1,t2]
- renvoie l'unique polynôme interpolateur de degré 3 tel que
P(1) = y1
P(2) = y2
P'(1) = t1
P'(2) = t2
''')
def interpol_hermite(ys,ds):
TODO()
return p
# Test de votre fonction:
### Cibles (aux instants t=1,2)
ys = 3,5 # ordonnées
ds = -4,-3 # nombres dérivés
plt.close('all')
plt.figure()
plt.title("Test de la fonction interpol_hermite")
for i in range(0,2):
plt.plot(i+1,ys[i],marker='o',color='blue')
h = 0.2 # écart h de l'approximation affine (détermine la longueur de la flèche)
myfleche(i+1, ys[i], h, h*ds[i])
t = np.linspace(1,2,200)
p = interpol_hermite(ys,ds)
plt.plot(t,polyval(t,p))
plt.axis('equal') # (essayer aussi avec cette ligne commentée, parfois le résultat est mieux)
plt.xlabel('t')
plt.ylabel('P(t)')
########################################
input()

@ -0,0 +1,287 @@
import numpy as np
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
from numpy.polynomial.polynomial import polyval
import math
import matplotlib.pyplot as plt
# On active le "mode interactif" de pyplot. Ainsi, les plt.show() ne sont plus nécessaires.
plt.ion()
# --------------------------------------------------------------------------------------
# Fonction de "fin temporaire" pendant l'avancée du TP. Attend une frappe Entrée, puis quitte le script.
def stop_ici():
plt.pause(0.1) # nécessaire pour que matplotlib ait le temps d'afficher les figures
input()
exit()
# --------------------------------------------------------------------------------------
# Tous les passages indiqués "TODO()" sont à remplacer par vos soins
def TODO():
print("à vous!")
stop_ici()
# --------------------------------------------------------------------------------------
# Cette petite fonction sert à tracer les flèches avec une syntaxe un peu plus intuitive que le code matplotlib de base.
# - xdepart, ydepart : coordonnées du point d'attache de la flèche
# - xfleche, yfleche : longueurs de la flèche en x et en y
def myfleche(xdepart, ydepart, xfleche, yfleche):
plt.annotate("", (xdepart+xfleche,ydepart+yfleche) , (xdepart,ydepart),
arrowprops={'color':'red','shrink': 0,'width':0.02}, annotation_clip=False)
#################################################################################################
###
### Rappels des TP2 et TP3 : courbe paramétrée et approximation affine
###
#################################################################################################
# Une *courbe paramétrée polynômiale* est une courbe paramétrée de la forme
# (P(t), Q(t))
# dont les 2 fonctions de coordonnées sont polynômiales.
#
# - La variable "t" s'appelle le **paramètre** de la courbe.
# - Chaque valeur de t définit UN point, dont l'abscisse vaut P(t) et l'ordonnée vaut Q(t).
# - La courbe est obtenue en représentant les points associés à TOUTES les valeurs de t.
#################################################################################
# Approximation affine pour une courbe polynômiale
#################################################################################
#
# L'approximation affine de la courbe polynômiale au point t s'écrit
#
# P(t+h) ~= P(t) + h.P'(t) [en abscisses]
# Q(t+h) ~= Q(t) + h.Q'(t) [en ordonnées]
#
# On représente cette approximation affine par une FLÈCHE.
#
# - La flèche démarre du point "t" sur le graphe
# Point(t) = ( P(t) , Q(t) )
#
# - La flèche a des longueurs (en abscisses et en ordonnées) de valeurs respectives
# fleche = ( h.P'(t) , h.Q'(t) )
# (Concrètement, la valeur choisie pour h détermine donc la mise à l'échelle de la flèche.)
# Avec ces notations, l'approximation affine ci-dessus peut se réécrire
# Point(t+h) ~= Point(t) + fleche
# c'est-à-dire que "fleche" représente l'évolution (approximative) de la courbe
# lorsque le point d'intérêt passe du paramètre "t" à "t+h".
#################################################################################
#################################################################################################
###
### EXERCICE 5 : Interpolation d'Hermite en 2D
###
#################################################################################################
# Il s'agit exactement du même problème qu'à l'exercice 4, mais pour une courbe polynômiale en 2D.
# On impose un certain nombre de points de passage en 2D, chacun associé à une flèche (= dérivée).
# Le but est de trouver une courbe polynômiale qui passe par ces points, et dont la dérivée à ces points
# soit donnée par les flèches : c'est-à-dire que la courbe doit être tangente à chaque flèche, et évoluer
# d'autant plus "fort" que la flèche est grande.
#
#
# Pour illustrer cela, on a implémenté une petite GUI (fenêtre interactive).
# - les points de passage eux-mêmes sont fixés à une position imposée
# - par contre, les clicks utilisateur permettent de définir la flèche (=dérivée) associée à chaque point
# - au dernier click, la courbe interpolatrice est calculée puis affichée.
print('''Complétez le code de la GUI ci-dessous, afin de calculer et tracer la courbe interpolatrice.''')
plt.close('all') # ferme les fenêtres précédentes, pour y voir plus clair
##############################################################
# Nombre de points à interpoler (laisser à 2 pour l'instant)
N = 2
##############################################################
# Position des N points cible (fixes, le long d'un polygone régulier à N sommets) :
# Elles sont stockées dans le np.array "point", sous le format suivant :
# - point[0,k] renvoie l'abscisse du point cible numéro k
# - point[1,k] renvoie l'ordonnée du point cible numéro k
# - point[0,:] renvoie toutes les abscisses des points cible
# - point[1,:] renvoie toutes les ordonnées des points cible
theta = np.pi - np.arange(0, 2*np.pi, 2*np.pi/N)
point = np.array([np.cos(theta),np.sin(theta)])
# La figure + les points cible :
fig = plt.figure()
limits = (-2,2) # limites de représentation (en x et en y)
ax = fig.add_subplot(111, xlim=limits, ylim=limits)
ax.plot(*point,linestyle='none',marker='o',color='blue')
# Dérivées imposées à chaque point cible (vont être définies par les clicks successifs) :
deriv = np.zeros((2,N))
# Une fois définies, elles seront stockées dans le np.array "deriv", sous le format suivant :
# - deriv[0,k] renvoie l'abscisse de la dérivée cible numéro k
# - deriv[1,k] renvoie l'ordonnée de la dérivée cible numéro k
# - deriv[0,:] renvoie toutes les abscisses des dérivées cible
# - deriv[1,:] renvoie toutes les ordonnées des dérivées cible
# Fonction d'interpolation (recopiée de l'exercice 4)
def interpol_hermite(ys,ds):
TODO()
# La fonction de callback de la GUI (sera appelée à chaque click)
nclick = -1
def onclick(event):
global clickpos, nclick, deriv, ax
clickpos = np.array([event.xdata, event.ydata]) # position du click
nclick = (nclick+1) % (N+2) # incrémente nclick (modulo N+2)*
# Récupère l'objet "axe" associé à la figure. Les commandes graphiques devront être
# appelées directement sur cet objet : "ax.ma_commande(...)" et non pas "plt.ma_commande(...)"
ax = fig.get_axes()[0]
if nclick < N:
### Trace la flèche associée à chaque point
fleche = clickpos - point[:,nclick]
myfleche(*(point[:,nclick]),*fleche)
ax.set(xlim=limits, ylim=limits)
# Écart h de l'approximation affine (fixe la proportionnalité gobale des flèches)
h = 0.2
# stocke la valeur imposée de dérivée correspondante (! en divisant par h !)
deriv[:,nclick] = fleche/h
elif nclick == N:
### au (N+1)ème click, on calcule la courbe interpolatrice et on l'affiche
# --> À VOUS !
# Calcule les poolynômes P(X) et Q(X) par interpolation
p = TODO()
q = TODO()
# Discrétisation de l'intervalle [1,N] en 200 points
t = TODO()
# Trace la courbe
ax.plot(TODO())
else:
### au (N+2)ème click, on nettoie pour pouvoir recommencer le cycle
ax.clear()
ax.plot(*point,linestyle='none',marker='o',color='blue')
ax.set(xlim=limits, ylim=limits)
# La commande ci-dessous "active" la GUI, en connectant la figure "fig" à la fonction de callback "onclick"
cid = fig.canvas.mpl_connect('button_press_event', onclick)
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
# Jusqu'à présent, la fonction "interpol_hermite" que vous avez écrite
# n'est capable d'interpoler que 2 points (avec leurs 2 dérivées associées).
#
# Dans ces dernières questions du TP, on vous guide pour réécrire la fonction afin
# qu'elle interpole N points (avec leurs N dérivées associées), pour n'importe
# quelle valeur de N.
print('''(Question papier).
Écrivez la matrice "A" et le second membre "b" du système si vous deviez
interpoler 3 points (et leurs 3 dérivées associées) :
P(1) = y1
P(2) = y2
P(3) = y3
P'(1) = d1
P'(2) = d2
P'(3) = d3
par un polynôme P de degré 5 (c'est-à-dire, avec 6 coefficients inconnus).''')
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''(Question papier).
Même question dans le cas général vous devez interpoler N points (et leurs
N dérivées associées). Trouvez la *formule générale* donnant la valeur de
l'élément de la matrice A en position (i,j).
Indice :
- pour les N premières lignes de A (contrainte de passer par un point yi),
vous avez déjà trouvé cette formule à la séance précédente (partie 1,
interpolation de Lagrange).
- pour les N dernières lignes (contrainte de vérifier une dérivée di), à
vous de jouer!
''')
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Complétez la nouvelle fonction "interpol_hermite(ys,ds)" (ébauche de code ci-dessous),
dans laquelle "ys" et "ds" peuvent maintenant être des tableaux de n'importe quelle taille N.
Enfin testez votre fonction en modifiant le paramètre N de la GUI plus haut (celui qui
valait 2 jusqu'à présent).
''')
### Fonction d'interpolation. Renvoie l'unique polynôme P de degré 2N-1 tel que
# P(1) = y1
# ...
# P(N) = yN
# P'(1) = d1
# ...
# P'(N) = dN
def interpol_hermite(ys,ds):
N = len(ys)
# les N premières lignes de la matrice A
A1 = [ [ TODO() for j in range(2*N) ] for i in range(1,N+1) ]
# les N dernières lignes de la matrice A
A2 = [ [ TODO() for j in range(2*N) ] for i in range(1,N+1) ]
# la matrice A entière
A = TODO()
# le second membre du système linéaire à résoudre
b = TODO()
# la solution du système
p = TODO()
return p
# Remarque : pas besoin d'effacer l'ancienne fonction 'interpol_hermite(ys,ds)'
# que vous avez écrite plus haut. Au moment où vous définissez la nouvelle version
# interpol_hermite(ys,ds), Python la "remplace" purement et simplement (exactement
# comme lorsqu'on redéfinit une variable, du genre v=v+4).
# En Python, les fonctions ne sont rien d'autre que des "variables qu'on peut appeler".
#
# Et puisque vous clickerez dans la GUI *après* avoir défini à Python la nouvelle
# version, la GUI fera naturellement appel à la nouvelle version :)
stop_ici() # ---------- Supprimez cette ligne une fois que le code avant fonctionne ------------------
########################################
# Vous avez tout fini ??? Bravo !!!
# Une fois arrivé ici, si vous vous ennuyez, modifiez le code de la GUI précédente pour
# que les clicks permettent également de définir la *position* des N points de passage.
# Il y aura donc un total de 2*N clicks : une position + une flèche pour chaque point de passage.
# Vous obtiendrez ainsi une GUI permettant de tester la version la plus générale de
# l'interpolation de Hermite (positions+flèches).
input()
Loading…
Cancel
Save