You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
6.2 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

import numpy as np
np.set_printoptions(suppress=True) # (pour mieux arrondir à 0 lors des print)
import math
from numpy.polynomial.polynomial import polyval
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} )
#################################################################################################
###
### EXERCICE 2 : représenter graphiquement l'approximation affine d'une courbe paramétrée
###
#################################################################################################
#################################################################################
# Rappel de la séance du TP2
#################################################################################
#
# Une *courbe paramétrée* est un ensemble de points de la forme
# Point(t) = (f(t), g(t))
# lorsque la variable t parcourt un certain intervalle donné.
#
# - La variable "t" s'appelle le **paramètre** de la courbe.
# - Chaque valeur de t définit UN point, dont l'abscisse vaut f(t) et l'ordonnée vaut g(t).
# - La courbe est obtenue en représentant les points associés à TOUTES les valeurs de t.
#################################################################################
print('''Représentez la courbe paramétrée
(f(t),g(t))
associée aux fonctions polynômiales
f(t) = 1 -4.t + 2.t^2 + 2.t^3
g(t) = 2 +7.t + t^2 - t^3 - t^4
pour le paramètre t dans l'intervalle [-2,2].''')
# Discrétisation de l'intervalle [-2,2] sur 200 points :
t = np.linspace(-2,2,200)
# Calcul de f(t), g(t) aux points correspondants :
ft = 1 -4*t + 2*t**2 + 2*t**3
gt = 2 +7*t + t**2 - t**3 - t**4
# Représentation de la courbe paramétrée :
plt.figure()
plt.plot(ft,gt)
# ou
# t = np.linspace(-2,2,200) deja defini en haut
f=[1,-4,2,2]
g=[2,7,1,-1,-1]
ftt=polyval(t,f)
gtt=polyval(t,g)
plt.figure()
plt.plot(ftt,gtt)
stop_ici() # ---------- Supprimez cette ligne une fois que le code précédent fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
#################################################################################
# Approximation affine pour une courbe paramétrée
#################################################################################
#
# L'approximation affine de la courbe paramétrée au point t s'écrit
#
# f(t+h) ~= f(t) + h.f'(t) [en abscisses]
# g(t+h) ~= g(t) + h.g'(t) [en ordonnées]
#
# On va représenter cette approximation affine par une FLÈCHE.
#
# - La flèche démarre du point "t" sur le graphe
# Point(t) = ( f(t) , g(t) )
#
# - La flèche a des longueurs (en abscisses et en ordonnées) de valeurs respectives
# fleche = ( h.f'(t) , h.g'(t) )
#
# 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".
#
# Graphiquement, "fleche" est tangente à la courbe au point "t", et sa longueur
# représente la quantité d'évolution de la courbe du point "t" au point "t+h".
#################################################################################
print('''(Question papier) Trouvez l'expression des fonctions dérivées f'(t) et g'(t) de la question précédente.''')
stop_ici() # ---------- Supprimez cette ligne une fois que le code précédent fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Déduisez-en la valeur des 4 nombres f(1), g(1), f'(1), g'(1), et rentrez-les ci-dessous.''')
f1 = TODO()
g1 = TODO()
fprime1 = TODO()
gprime1 = TODO()
stop_ici() # ---------- Supprimez cette ligne une fois que le code précédent fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Le code ci-dessous trace la flèche associée aux 4 valeurs que vous avez calculées à la question précédente.
Déterminez graphiquement si la flèche est bien à l'endroit et dans la direction où elle devrait.
Si la flèche n'est pas là où elle devrait, c'est que votre calcul de f(1),g(1),f'(1) ou g'(1) était faux. Dans ce cas, corrigez-le et relancez le code. ''')
plt.plot(f1,g1,marker='o',color='blue') # marque le point de paramètre "t" avec un cercle
h = 0.5 # écart "h" de l'approximation affine (fixe la proportionnalité gobale de la flèche)
myfleche(f1, g1, h*fprime1, h*gprime1) # trace la flèche
stop_ici() # ---------- Supprimez cette ligne une fois que le code précédent fonctionne ------------------
# --------------------------------------------------------------------------------------
print("-"*80)
print('''Calculez de même les approximations affines pour la courbe aux points
t = -2, -1.5, -1, ...., 1.5, 2
et représentez-les par autant de flèches.''')
for t in TODO():
TODO() # (plusieurs lignes)
print('''Vérification: toutes les flèches rouges sont-elles bien *tangentes* à la courbe ?
Si oui, passez à la suite.
Si non, qu'avez-vous oublié ?
''')