Résultats / CC1 / Results

Résultats / CC1 / Results

by Wozniak Herve -
Number of replies: 0

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