Somme des premiers termes d’une suite avec Python

Sur cette page, nous allons voir comment déterminer la somme des premiers termes d’une suite numérique à l’aide de Python, et ce à travers plusieurs exemples.

Nous avons vu sur cette page comment calculer les premiers termes d’une suite. Nous allons fortement nous inspirer des codes en les complétant.

Principe algorithmique pour le calcul de la somme des premiers termes d’une suite

Le principe algorithmique est simple : on initialise une variable, par exemple S, à 0 et on fait une boucle dans laquelle on calcule les termes successifs de la suite, que l’on additionne à S.

Bon, dit comme ça, c’est vrai, c’est pas clair alors on va détailler:

  • initialisation : S = 0;
  • on calcule \(u_0\) et on dit que S devient S + \(u_0\);
  • ensuite, on calcule \(u_1\) et S devient S + \(u_1\). Ainsi, à cette étape, depuis le début, on a : \(S = u_0 + u_1\);
  • après, on passe à \(u_2\) : on le calcule et on affecte à S la valeur S + \(u_2\). Donc là, à ce stade, \(S = u_0+u_1+u_2\);
  • on continue ainsi jusqu’au rang que l’on souhaite.

Un premier exemple

On considère la suite \((u_n)\) définie par:$$\begin{cases}u_0=2\\u_{n+1}=\frac{1}{2}u_n+5\end{cases}$$On souhaite calculer:$$S_{100}=\sum_{k=0}^{100}u_k=u_0+u_1+\cdots+u_{99}+u_{100}.$$ On peut alors utiliser le script suivant:

u = 2 # 1er terme de la suite
S = 2 # S = 0 + u(0)
for k in range(100): # k varie de 0 à 99, donc 100 termes après u(0)
    u = 0.5 * u + 5 # calcul de u(k+1)
    S += u # la nouvelle somme est égale à l'ancienne + la valeur de u(k+1) calculée
    
print(S)

Voyons pas à pas à travers un tableau ce qui se passe:

kuSCommentaires
22Avant d’entrer dans la boucle
0\(0,5\times2+5=6\)2 + 6 = 8On entre dans la boucle
1\(0,5\times6+5=8\)8 + 8 = 16
2\(0,5\times8+5=9\)16 + 9 = 25
3\(0,5\times9+5=9,5\)25 + 9,5 = 34,5
99\(0,5\times u_{99}+5\approx10\)984 + 10 = 994Fin de la boucle

Je pense que la plus grande difficulté réside dans la variable k : elle varie de 0 à 99 (c ‘est une particularité de la fonction range(100) qui représente la liste:

[0, 1, 2, ..., 97, 98, 99]

Cette liste contient 100 nombres.

Comme S contient déjà la valeur de \(u_0\) par initialisation (ligne 2), il n’y a plus qu’à calculer \(u_1,\ u_2,\ \ldots,\ u_{100}\), donc les 100 termes suivants, d’où la boucle à 100 valeurs de k.

Dans cette boucle itérative, u reçoit la valeur 0.5u + 5, c’est-à-dire 0,5 fois la valeur contenu dans u (donc 0,5 fois le terme précédent) augmenté de 5; on calcule donc le terme suivant, que l’on ajoute ensuite à S (remarque de syntaxe : écrire “S += u” revient au même que d’écrire : “S = S + u”).

À l’issue de cette boucle, on aura donc ajouté tous les termes de la suite de \(u_0\) à \(u_{100}\).

Deuxième exemple

Vous allez un peu travailler pour cet exemple (ben oui… faut bien s’entraîner!). On considère la suite \((v_n)\) définie par:$$\begin{cases} v_0=7\\v_{n+1}=\displaystyle\sum_{k=0}^n\frac{1}{k+1}v_k\end{cases}$$Ouais, elle est pas fastoche celle-là ! On souhaite écrire un programme Python afin qu’il affiche le résultat de:$$S_{50}=v_0+v_1+v_2+\cdots+v_{49}+v_{50}.$$

La première chose à faire, à mon avis, est d’exprimer \(v_{n+1}\) autrement; en effet, on constate que:$$\begin{cases}v_{n+1}=v_0+\frac{1}{2}v_1+\frac{1}{3}v_2+\cdots+\frac{1}{n+1}v_n\\ v_{n+2}=v_0+\frac{1}{2}v_1+\frac{1}{3}v_2+\cdots+\frac{1}{n+1}v_n + \frac{1}{n+2}v_{n+1}\end{cases}$$On peut donc écrire la relation de récurrence suivante:$$v_{n+2}=v_{n+1}+\frac{1}{n+2}v_{n+1}=\left(1+\frac{1}{n+2}\right)v_{n+1}.$$

On peut alors écrire la relation:$$v_{n+1}=\left(1+\frac{1}{n+1}\right)v_n.$$Le code devient alors bien plus simple car il ressemble au précédent:

v = 7
S = 7
for k in range(1,51):
    v = ( 1 + 1/(k+1) ) * v
    S += v
    print(v,S)

J’ai tout de même décidé de faire une boucle sur k variant de 1 à 50 pour plus de clarté dans le code car dans ce cas, il suffit de s’inspirer de la relation de récurrence de la suite pour la ligne 4.

Et n’oubliez pas que si vous avez des difficultés en mathématiques, je peux vous aider par webcam !