I'm a bit lazy about translating these notes into English, so just copy + paste them into an automatic translator, or ask me by email! Thanks a lot.
Remarque globale : lisez attentivement ce qui suit. Oui, je sais, c'est
long et ce n'est pas de la vidéo, donc cela demande un effort de
concentration :)
1/ testez les programmes que vous rendez. Car il
arrive que votre programme ne marche pas au moment de la correction.
Soit que vous ayez ajouté une ligne de commande sans exécuter à nouveau votre code, soit que certaines variables soient encore stockées en mémoire dans votre session (et
agissent comme des variables globales).
2/ testez également vos
fonctions avec des valeurs remarquables (x=0, +1, -1 sont des tests
basiques pour un polynôme). Vous détecteriez des erreurs triviales (par
ex., un = à la place d'un +=, un oubli d'initialisation, une erreur de signe dans un coefficient).
Exercice 1 :
-
ce n'est pas parce qu'une formule fait intervenir une fonction de type
factorielle, qu'il faut impérativement utiliser une fonction des modules
math ou numpy, ou écrire sa propre fonction. 3! et 5!
sont ici des CONSTANTES qui se calculent mentalement et s'écrivent
respectivement 6 et 120. Sans grand effort, on peut même en faire le
produit avec le coefficient 2 qui précède V-. .
Je n'ai pas enlevé de points à celles et ceux, trop nombreux, qui ont utilisé une fonction.
-
x est une variable muette. Comparer sin(π x) et le développement de
sin(π x/2) nécessite donc un petit changement de variable qui
s'opère au moment de l'appel à l'approximant : il suffit de calculer
l'approximation pour 2 x au lieu de x.
- vous êtes
nombreux à ne pas avoir réussi à reproduire la bonne approximation entre
x=-0.5 et x=+0.5, sans pour autant que cela
motive un commentaire de votre part. L'erreur provient le plus souvent
du changement de variable, mais parfois également du calcul des Cn.
Vous êtes pourtant guidés par le graphique. Alors prenez le temps de
vérifier à la main que vos calculs sont corrects. Sinon, Apollo n'aurait jamais atterri sur la Lune…
- en python,
comme dans de nombreux autres langages (et même sur ma calculatrice),
1/2*3 et 1/(2*3) ne donnent pas le même résultat. Donc /2*m.factorial(5)
ne donne pas le même résultat que /(2*m.factorial(5)).
Et on ne
s'étonne pas que l'approximant soit faux, car on n'a pas, non plus,
vérifié le résultat avec une calculatrice, ou avec la console python.
-
un graphique sans label sur un axe, sans légende, ou avec des min/max
mal choisis (y variant entre -2000 et +2000 pour un sinus !), ce n'est
pas digne d'une physicienne ou d'un physicien. Vous avez perdu 1 point bêtement.
-
certains aiment bien les multiplications par 1. Oui, car ils ne savent
pas que 1 est élément neutre pour la multiplication... 8-). Là non plus
je n'ai pas enlevé des points pour absurdité, malgré la tentation.
Exercice 2 :
- le premier constat est que plusieurs d'entre vous ne savent pas dériver un polynôme. No comment.
- certains ont codé le membre de droite de l'équation (8), sans s'étonner
que l'on corrige une dérivée exacte par une erreur… quel est donc l'intérêt de calculer une correction de 5e ordre si on connaît f' de
façon exacte ?
dfd1() est la fonction qui calcule
(4*dfd(h/2)-dfd(h))/3, ce qui représente l'approximation de Richardson.
Elle approche f' avec une erreur d'ordre 5...
- en python, 1/2*3
et 1/(2*3) ne donnent pas le même résultat (rebelote). Donc /2*h ou
/(2*h) ne sont pas équivalents. Vous êtes beaucoup trop nombreux à vous
être trompés sur le calcul de la dérivée dfd(), formule (1).
-
les coefficients du polynômes sont 2, 1, -6, -2, 2.5 et 1, dans cet
ordre, si on veut qu'ils correspondent aux puissances 0, 1, etc... dans
ce même ordre. On peut choisir d'inverser l'ordre des coefficients et des puissances. Mais certains ont pris les coefficients du polynôme à l'envers
par rapport aux puissances : les puissances ne peuvent alors plus
servir d'indice dans la liste des coefficients… pas très malin,
surtout que vous avez déjà rencontré le cas avec l'automate
cellulaire…
- si on veut 10 valeurs de h entre 0 et 1, rien ne
dit selon quelle distribution. Ainsi, prendre h=0 n'a pas grand sens
pour calculer une dérivée, sauf à vouloir gérer des divisions par 0 dans
dfd().
- Enfin, un point davantage compliqué : pour calculer la valeur d'un polynôme, si vous voulez à
la fois utiliser le broadcasting et la fonction numpy.sum(), vous
obtenez naïvement un nombre flottant, ce qui vous oblige à construire itérativement la liste
des valeurs à tracer. Why not. Mais, pour que la fonction f(d,x) soit vectorisée, donc
accepte x comme étant un ndarray, il faut écrire (par exemple, d'autres
solutions plus élégantes existent) :
def f(d, x):
# une seule construction des puissances pour toutes les valeurs de x
N = np.arange(len(d))
return np.sum(np.tile(x,(len(d),1)).T**N * d, axis=1)
(V-.) alors que :
def f(d, x):
s = 0. # pour le cas d.size == 0
for n in range(d.size):
s += d[n]*(x**n)
return s
fonctionne très bien si x est un ndarray. Mais cette solution n'utilise pas numpy.sum().
Notes
Prénom | Nom de famille | CC1 |
Lucas | Ait Oulahyane | 16 |
Ines | Amrouni | 2 |
Remi | Baye | 6 |
Yassin | Belhaouari | 10 |
Ryma | Benslimane | 4 |
Santiago | Bernal Bulla | 13 |
Sam | Blivet | 6 |
Sophias | Boko | 9 |
Sofian | Boughebri | 8 |
Pierre | Boujard | 20 |
Adnan | Bouta | 8 |
Hugo | Chaffre | 7 |
Clement | Charbonnier | 7 |
Clement | Chave | ABI |
Tom | Chiesura | 10 |
Paul | Crespin | 16 |
Wenceslas | Decochereaux | 8 |
Adama | Diop | 6 |
Lucile | Fromentin | 9 |
Oceana | Gautier | ABI |
Tillian | Hallouin | 18 |
Nour El Houda | Houimli | 4 |
Lea | Houzelle | 8 |
Basile | Le Goff | 9 |
Paula | Mallor Garcia | 14 |
Verdiane | Mogaing Feusi | 6 |
Emilie | Nardy | 17 |
Pape Babacar | Ndao | 13 |
Juliana | Nespoulous | 16 |
Maria | Omari | 9 |
Ouafa | Ouadah | 6 |
David | Roblin | 8 |
Tom | Sampieri | 17 |
Shareen | Saphores | 19 |
Alex | Thiry | ABI |
Ramzi | Ziriat | ABI |