Sommation avec Python et autres outils

Les séries (sommes de suites) deviennent à la mode au bac
mardi 3 octobre 2017
par  Alain BUSSER

Voici un extrait de l’article « suites et séries » de l’Encyclopédie ou dictionnaire raisonné des sciences, des arts et des métiers de 1751 (article rédigé par d’Alembert) :

« se dit d’un ordre ou d’une progression de quantités, qui croissent, ou décroissent suivant quelques lois. Lorsque la suite va toujours en s’approchant de plus en plus de quelque quantité finie (...) on l’appelle une suite convergente, et si on la continue à l’infini, elle devient enfin égale à cette quantité.
Ainsi, 1/2,1/4,1/8,1/16,1/32,1/64, &c forment une suite qui s’approche toujours de la quantité 1, & qui lui devient enfin égale, quand cette suite est continuée à l’infini. »

On voit que d’Alembert considère que les termes d’une suite numérique ont vocation à être additionnés (d’où leur nom de « termes ») dans une série numérique, qui peut être convergente (exemples : suites géométriques, inverses des factorielles) ou divergente (exemples : le sujet du bac S USA de 2017 ci-dessous, la série harmonique). Or pour calculer la série à partir de la suite, on utilise cette formule récurrente :

sn+1 = sn+un+1

Cette formule peut se traduire par l’algorithme suivant :

s ← s+u

Malgré cette simplicité, l’algorithme est souvent difficile à mettre en place et la notion de série difficile à formaliser, probablement à cause de lacunes sur les suites, mais aussi sur la notion de récurrence.

Verbalisation

Imaginons une personne faisant ses courses munie d’un chèque repas (montant à ne pas dépasser mais à approcher quand même) et d’une petite calculatrice, portant les boutons suivants :

lit la mémoire ajoute à la mémoire efface la mémoire

Cette personne veut additionner les prix des articles se trouvant dans son chariot, et va naturellement effectuer les opérations suivantes :

  • MC pour ne pas additionner d’autres nombres que les prix en question ;
  • Entrer le prix du premier article ;
  • M+
  • Entrer le prix du second article ;
  • M+
  • etc jusqu’au dernier article ;
  • Le cas échéant, MR pour connaître le total.

Rédiger l’algorithme de sommation décrit dans cet article, c’est essentiellement verbaliser la suite d’opérations décrite ci-dessus. Le bouton M+ étant analogue à l’instruction augmenter de de Sofus, on peut aisément imaginer que cette verbalisation est plus aisée avec Sofus.

Hors-d’œuvre : Est-il nécessaire de passer par un algorithme ?

Sans somme

L’exercice 4 « obli » du sujet de Pondichéry 2017 commençait ainsi :

On considère deux suites (un) et (vn ) :
• la suite (un) définie par u0 = 1 et pour tout entier naturel n : un+1 = 2un − n + 3 ;
• la suite (vn) définie, pour tout entier naturel n, par vn = 2n.

Il ne s’agit pas de somme mais c’est l’occasion de comparer l’outil suites de la calculatrice avec l’outil de programmation. On se concentrera notamment sur la question :

B 3. Déterminer le rang du premier terme de la suite supérieur à 1 million.

Comme le suggère le titre de cet article, c’est la calculatrice Numworks qui a été choisie pour ce comparatif, puisqu’elle se programme en Python.

Suites

L’écran de la Numworks ressemble à celui d’un smartphone, avec des icônes, chacun menant à une page web. On navigue dans ces pages comme sur le smartphone. L’icône des suites se trouve en haut à droite :

Une fois atteint cet icône à l’aide des flèches du clavier, on appuie sur OK et on a la possibilité d’ajouter une suite à une liste de suites actuellement vide :

En appuyant sur OK, on a le choix entre suites explicite et récurrente :

On choisit la suite récurrente et on entre d’abord la formule :

L’appui sur OK montre qu’à l’édition la notation indicielle devient u(n). Ce qui permet d’entrer la formule :

Ensuite on entre, par une méthode similaire, le premier terme :

Et on ajoute une nouvelle suite, celle-ci de type explicite :

On utilise le bouton xy pour entrer le chapeau :

Et voilà, il n’y a plus qu’à naviguer vers l’onglet « tableau » :

Le tableau donne les mêmes informations que celui de l’énoncé (obtenu lui par un tableur, c’est un peu nouveau au bac S) :

Pour répondre à la question B3, il suffit (après avoir redéfini le rang), de naviguer un peu dans ce tableau :

Ce serait bien que la navigation puisse être rendue automatique par une option de la calculatrice, mais pour l’instant ce n’est pas le cas, la priorité allant à la version Python (ci-contre).

Par contre on a aussi le graphique, moins facile à faire avec Python :

La navigation dans le nuage de points se fait avec les flèches.

Python

L’application permettant de programmer est tout à droite, en bas :

En la sélectionnant, on a (après un message prévenant qu’il s’agit d’une version beta) le choix entre « éditer » et « exécuter » le programme Python (il n’y en a qu’un mais pour une calculatrice destinée à être utilisée en mode examen c’est plutôt logique). On choisit d’abord « éditer » et on entre ce programme :

indentation

Il faut du temps pour programmer en Python, parce qu’on écrit lettre après lettre. Conseil : Appuyer deux fois sur « alpha », pour verrouiller le mode alpha et ne pas avoir à réappuyer sans arrêt sur cette touche !

L’indentation s’entre sous forme d’un certain nombre d’espaces, par exemple 4 à chaque niveau [1]. Le script ci-dessus donne ceci :

u=1
for n in range(1,12):
    u=2*u-n+4
    v=2**n
    print(n,u,v)

Comme on commence par 1, on a un décalage et c’est 4 qu’on additionne, et non 3. Avec le bouton « OK » on peut exécuter ce programme ce qui a pour effet d’afficher n, u et v :

Partie 3

Pour la troisième partie, on ne peut utiliser pour l’instant que le programme Python, parce que pour l’instant, on ne peut pas définir de récurrence croisée dans l’outil des suites. Mais avec Python c’est facile, il suffit d’afficher u/v au lieu d’afficher u et v :

Pour ceux qui veulent tester ce script sur une autre version de Python :

u=1
for n in range(1,12):
    u=2*u-n+4
    v=2**n
    print(u/v)

La conjecture sur la limite de u/v se fait avec l’affichage obtenu :

Pour la question B3, on modifie le programme Python en changeant le style de boucle :

Le script

u=1
n=0
while u<1e6:
    u=2*u-n+4
    n=n+1
print(n)

L’exécution de ce script répond à la question 3B :

Algorithme de sommation au bac

Énoncé

L’exercice 3 du sujet Amérique du Nord 2017 était basé sur des égalités entre sommes et produits, ce qui lui donne un intérêt mathématique certain :

Le but de cet exercice est d’étudier les suites de termes positifs dont le premier terme u0 est strictement supérieur à 1 et possédant la propriété suivante : pour tout entier naturel n>0, la somme des n premiers termes consécutifs est égale au produit des n premiers termes consécutifs.
On admet qu’une telle suite existe et on la note (un). Elle vérifie donc trois propriétés :
• u0 > 1,
• pour tout n > 0, un > 0,
• pour tout n > 0, u0 +u1 +··· +un−1 = u0 ×u1 ×··· ×un−1.

Sommation

1. On choisit u0 = 3. Déterminer u1 et u2.

Cette question avait le double mérite de vérifier les connaissances des candidats en équations du premier degré, et de montrer le principe de la suite de l’exercice : Le fait qu’il y a égalité entre produit et somme aboutit à ce que le terme suivant de la suite u est solution d’une équation du premier degré, une fois les termes précédents connus, et on le trouve alors par une relation de récurrence :

2. Pour tout entier n > 0, on note sn = u0+u1 +··· +un−1 = u0×u1 ×··· ×un−1.
On a en particulier s1 = u0·
a. Vérifier que pour tout entier n > 0, sn+1 = sn+un et sn > 1.
b. En déduire que pour tout entier n > 0,
un = sn/(sn −1).
c. Montrer que pour tout n > 0, un > 1.

Le c se démontre évidemment par récurrence, et le b est la même question que la 1, mais dans le cas général : On résout l’équation du a. Mais le point ici est le a :

sn+1 = sn+un

Cette formule de récurrence, apparemment censée être connue des élèves de terminale S, est à la base de l’algorithme de sommation suivant :

  • on initialise la variable s à 0 ;
  • après chaque mise à jour de la variable u, on additionne celle-ci à s, avec le s ← s+u de rigueur : C’est une traduction algorithmique de la formule récurrente ci-dessus.

Algorithme

À l’aide de l’algorithme, on veut calculer le terme un pour une valeur de n donnée.
a. Recopier et compléter la partie traitement de l’algorithme.
b. Le tableau ci-dessous donne des valeurs arrondies au millième de un pour différentes valeurs de l’entier n :

n 0 5 10 20 30 40
un 3 1,140 1,079 1,043 1,030 1,023

Quelle conjecture peut-on faire sur la convergence de la suite (un) ?

La suite de l’exercice visait à prouver la conjecture, en passant par le fait que sn diverge (on montre par récurrence qu’elle est minorée par n) et que du coup, un converge. Mais voyons un peu l’algorithme :

Les scripts ci-dessous ont été obtenus à l’aide de cet outil en ligne.

Dans la nouvelle notation, il n’y a plus que « la partie traitement » et l’algorithme se rédige ainsi :

s ← u
Pour i allant de 1 à n 
    u ← ...
    s ← ...
Fin Pour

Le source Python donne cette variante :

u ← 3
s ← u
pour i allant de 0 à n-1
        u ← s/(s-1)
        s ← s+u

Le source étant

u = 3
s = u
for i in range(n)
        u = s/(s-1)
        s = s+u

Mais aussi, cette variante permet d’avoir un code plus sofusien :

u = 3
s = u
for i in range(n)
        u = s/(s-1)
        s += u

Le résultat :

u ← 3
s ← u
pour i allant de 0 à n-1
        u ← s/(s-1)
        augmenter s de  u

En général, la série se calcule à partir de la suite avec l’algorithme de sommation. Mais ici la suite n’est pas définie indépendamment de la série.

On remarque que dans ce cas, il est possible de calculer les termes successifs de un parce qu’on dispose de l’expression de u en fonction de s : Les suites u et s sont définies par une récurrence croisée. L’abondance d’exercices au bac S 2017 sur les récurrences croisées explique probablement que celles-ci sont reconnues depuis peu par la Ti 83 Premium CE (mais pas encore par la Numworks à ce jour, bien que la demande en ait été faite).

Voilà donc où en est la situation au niveau du bac :

  • L’algorithme s ← s+u donnant une somme est basé sur la définition récurrente sn+1 = sn+un+1 donc pas vraiment si simple que ça ;
  • malgré cela, il est parfois vu en 2nde, avec un taux de succès très variable, comme on peut l’imaginer.
  • Au bac S, on est censé le connaître, à en croire le sujet corrigé ci-dessus.
  • Au bac STI2D, on n’est pas obligé de le connaître, puisqu’on n’a à sommer que des suites géométriques, mais dans ce cas il faut connaître une formule pas très simple non plus et le passage en mode examen empêche de se servir de la calculatrice comme mémoire additionnelle. L’algorithme fait donc partie des outils possibles pour répondre à des questions sur les suites géométriques...

La situation se prête donc admirablement à une évaluation en début de BTS, sur la connaissance que peuvent avoir des bacheliers tout frais sur la sommation. Deux activités s’y prétaient :

  1. Découverte de e (nombre) [2] comme somme des inverses des factorielles ;
  2. Ressemblance entre la série harmonique et le logarithme népérien [3].

TP sur e

L’avantage de ce sujet est qu’il élargit le contexte, puisqu’on additionne les inverses des factorielles et que, sans les nommer, on les définit par un algorithme de produit similaire à celui de sommation.

Algorithme

Le calcul itératif d’une factorielle se fait ainsi en Python (ici on se contente de 10 termes) :

p = 1
for k in range(1,11):
    p = p*k
    print(p)
    

Ce qui donne ce pseudocode (p est la variable contenant la suite des factorielles) :

p ← 1
pour k allant de 1 à 10
    p ← p×k
fin du Pour

Sommation

Pour additionner les inverses des factorielles, il suffit alors de faire pareil avec la variable additionnelle s, à laquelle on ajoute au fur et à mesure les 1/p :

p ← 1
s ← 1
pour k allant de 1 à 10
    p ← p×k
    s ← s+1/p
fin du Pour

Version Python

p = 1
s = 1
for k in range(1,11):
    p = p*k
    s = s+1/p
    print(s)

Avec Sofus, cet algorithme se programme ainsi :

Et SofusPy permet, à partir de ce programme, d’engendrer automatiquement le code Python qui sera peut-être présent dans le sujet de BTS.

On pouvait aussi, assez facilement, faire le TP avec un tableur, en mettant dans la première colonne les valeurs de n, dans la seconde celles des factorielles (formule du genre =B1*A2 à copier vers le bas) et dans la troisième, les valeurs de la suite (formule du genre =C1+1/B2).

Rapports de TP

Le TP n’a duré qu’une heure et ce n’est pas tout le monde qui a trouvé le temps d’améliorer la rédaction à la maison. Outre des rapports jamais déposés sur Moodle, il y a eu certains assez incomplets :

largement inachevé hostile au texte écrit amateurs de pseudocode choix de Sofus

Ce rapport témoigne du choix d’Algobox pour programmer les algorithmes (ce qui est une très bonne idée) mais aussi de celui de se contenter d’en faire une copie d’écran (mauvaise idée, c’est tout flou donc peu lisible) au lieu d’exporter la version textuelle pour ensuite l’incorporer au document :

Ces copies d’écran floues ne sont pas caractéristiques des utilisateurs d’Algobox, ceux de CoffeeScript aussi :

Ce rapport montre un travail de mise en forme et en couleurs, hélas pas assorti de rédaction de textes :

Celui-là est entaché d’une erreur : Au lieu d’incorporer le fichier svg dans le traitement de texte, a été choisi un simple lien vers l’original, ce qui allège l’odt mais ne permet pas d’afficher la figure dans le pdf exporté :

Le svg est bien affiché dans celui-là mais là encore, peu de texte :

Il y avait quand même plusieurs (très) bons rapports de TP ; leur description ci-dessous indique ce qu’il leur manque :

critique définition de e critique critique conclusion rien (parfait)

Voici le corrigé, avec son source au format odt :

corrigé en pdf source en odt

Sans algo

La calculatrice Numworks permet, rien qu’avec son application Sequence, de calculer la somme de termes, en choisissant les indices de départ et d’arrivée [4].

Une fois dans l’application des suites, il faut trouver la factorielle : C’est encore la partie la plus difficile :

Oui, le bouton à appuyer est celui qui ressemble à une boîte aux lettres, le deuxième en partant de la droite ci-dessus : En fait il représente une boîte à outils, et parmi ces outils se trouve le nombre de manières de permuter r objets parmi n, ici en prenant r=n on a la factorielle...

Après cela, la suite des inverses de factorielles se dessine directement :

Le tableau de valeurs montre qu’il n’y a que 10 valeurs calculées :

Mais en allant tout en haut de ce tableau, on voit un régler l’intervalle qui permet d’aller plus loin, par exemple jusqu’à 40 :

Ensuite, en réaffichant le nuage de points, on voit un bouton OK en bas à droite de l’écran. Il donne envie d’appuyer sur la touche OK et là, divine surprise, est proposé de calculer la somme des termes :

Le choix de cette option réaffiche le nuage de points avec la possibilité de naviguer avec les flèches du clavier mais cette fois-ci c’est pour choisir l’indice du premier terme à additionner ; on va jusqu’à l’abscisse 0 et on appuie sur OK puis est demandé l’indice du dernier terme à additionner (ici provisoirement 9) :

En allant jusqu’à 20 on voit en bas à gauche que la Numworks est prête à additionner les 21 premiers termes :

L’appui sur la touche OK permet alors d’avoir une valeur approchée de e sans avoir eu à programmer le moindre algorithme :

Après avoir découvert expérimentalement le nombre e, les étudiants ont vu son carré, son cube et plus généralement les exponentielles de tous les réels, puis le cours a assez naturellement porté sur le logarithme népérien, et la représentation graphique de celui-ci a mené à un autre TP sur les sommes : Celles des inverses des entiers successifs.

Intégrales

Hors programme, le sujet est intéressant par sa démonstration graphique : On calcule ln(n) comme intégrale, entre 1 et n, de la fonction 1/x ; puis on approche l’aire sous l’hyperbole par un histogramme (rectangles de largeur 1 et de hauteur 1/n). Plutôt que représenter les deux suites sur un même graphique pour constater leur décalage, il a été préféré de représenter carrément leur différence. Peu d’étudiants ont su conjecturer la convergence de cette différence sur la représentation graphique. Cela témoigne d’un manque d’expérience sur les représentations graphiques des suites.

Le calcul intégral n’a d’ailleurs pas encore été abordé en cours.

Rapports

Ces deux rapports sont un plaidoyer pour l’utilisation du tableur à la place des algorithmes. Sur la forme ce plaidoyer n’est pas très réussi, on voit même une copie d’écran de toute la feuille du tableur juste pour montrer la formule utilisée :

trop concis très bon !

Ce rapport cherche à montrer l’intérêt d’Algobox ; sans grand succès en raison du flou rendant illisible l’algorithme [5] :

Les rapports de TP suivants se terminent par l’émission d’une conjecture non prévue : La décroissance (à partir du rang 2) de la suite ; c’était la convergence qui était attendue :

plutôt décroissante devient décroissante et n’est plus croissante

Les rapports de TP suivants méritent à eux seuls la lecture de cet article, en effet ils témoignent à la fois du progrès réalisé depuis le TP précédent, et des difficultés à conjecturer la convergence [6], et surtout à la verbaliser :

conjecture mal verbalisée γ=0 γ=0,5 γ=0,599

Voici le corrigé du TP, fait avec alcoffeethmique :

corrigé en pdf source en odt

En résumé, ces TP faits en une heure (mais avec la possibilité de fignoler le rapport à la maison), montrent l’intérêt technique que présente alcoffeethmique combiné avec Libre Office Writer, de par l’export des algorithmes (y compris en pseudocode) et des figures. Mais ils montrent aussi

  • l’intérêt des post-bac pour le pseudocode
  • les lacunes sur les suites et en particulier leur représentation graphique
  • une préférence pour le tableur, chez certains étudiants
  • une certaine peur du choix de l’outil (la plupart préfèrent l’outil du prof, par confort, et une étudiante ayant déjà une certaine expérience de Python, a exprimé une réelle peur de choisir cet outil)
  • un certain manque de la culture des TP, assorti d’un manque d’habitude en écriture...

Mais surtout, ils montrent que ce fameux algorithme de sommation, est encore considéré comme difficile après le bac...

Sommes et intégrales

La suite de l’histoire, c’est le calcul d’intégrales par la méthode des rectangles : Comme on additionne des expressions du type f(x)×dx, on a là une occasion supplémentaire de réutiliser ce fameux algorithme de sommation. Le TP a été traité en 2 heures en terminale STI2D (il s’agissait de montrer constructivement l’existence de ln(2) ) et en une heure en BTS. Voici quelques rapports de TP, visiblement dans l’état où ils étaient à la fin du TP, ou presque :

« faire tourner l’algorithme » « effectuer le programme » notions d’algorithme et de limite description de l’algorithme
distinction algorithme/Python, notion de limite notion de suite de Cauchy critique de Python confusion algo/programme

Les meilleurs pour la fin :

aisance avec les outils notion de limite définition d’un algorithme excellente présentation

Et le corrigé :

version pdf source en odt

[1alcoffeethmique est un assez bon entraînement.

[2inconnu des bacheliers ST2S

[3lui aussi inconnu des bacheliers ST2S

[4sans oublier que c’est possible aussi avec une expression parenthésée directement dans l’application de calcul

[5Algobox permet d’exporter l’algorithme sous un format textuel, que l’on peut ensuite incorporer au document, préservant ainsi sa légèreté et sa qualité graphique ; cette possibilité n’intéresse pas ceux qui trouvent plus facile de faire une copie d’écran...

[6question pourtant fréquente au bac


Documents joints

OpenDocument Text - 183.9 kio

Commentaires

Logo de Parisse
mardi 10 octobre 2017 à 06h31 - par  Parisse

Je pense qu’il y a une erreur pour la reponse au sujet de bac, car la relation de recurrence n’est pas la bonne.
Il serait a mon avis plus naturel d’utiliser le code suivant (desole, je n’arrive pas a gerer l’indentation)
def f() :
u=1
for n in range(10000) :
u=2u-n+3
if u>=1e6 :
return n+1
return -1
print(f())
sans changer la nature de la boucle et avec une fonction, sinon utiliser Python n’apporte rien par rapport a un langage de calculatrice populaire. Personnellement, lorsqu’il y a un indice qui augmente a chaque iteration, je conseille toujours d’utiliser des boucles for avec arret premature par break ou return plutot que des while car cela permet d’eviter les boucles infinies et cela evite d’oublier l’incrementation de n.

Sinon, il n’est a mon avis pas utile d’etre trop indulgent avec la Numworks si on veut qu’elle progresse, je ne vois pas en quoi le mode examen peut etre une excuse a ne pouvoir editer qu’un seul programme ! Je pense que l’equipe de Numworks va corriger cela, mais il faut les inciter a le faire et non le contraire !