Revenir
Revenir

Algorithme de seuil

la suite numérique définie pour tout 

Sommaire

Quelques rappels pour commencerCalcul d'un terme avec une formule expliciteCalcul à l'aide d'une formule de récurrence
Algorithme de seuilSuite croissante qui tend vers l'infiniCas d'une suite croissante tendant vers une limite finieCas d'une suite décroissante
Les perles du BACPolynésie 2022, sujet 1Polynésie 2022, sujet 2Asie, 2022Centres étrangers, 2022Polynésie, septembre 2022Amérique du Nord, 2023
Amérique du Sud, 2022

Quelques rappels pour commencer

Calcul d'un terme avec une formule explicite

Soit 
(u_n)
la suite numérique définie pour tout 
n\in \mathbb{N}
par 
u_n=(n-4)/(2n+1)
. Cette suite est définie à l'aide d'une formule explicite : on a directement 
u_n
en fonction de 
n
.
Nous allons donc programmer une fonctionterme_uqui prendra en argument un entiernet qui renverra le n-ième terme de cette suite. Exécuter le programme suivant.
def terme_u(n):
    return (n-4)/(2*n+1)
Dans ce fragment de programme,
  • le mot clédefpermet d'indiquer que l'on est en train de définir une fonction ;
  • cette fonction a pour nom terme_uet un seul argument que l'on appellen. Le nom de la suite est suivie de deux points ;
  • la suite de la fonction est décalée d'un cran vers la droite : c'est ce que l'on appelle l'indentation. Celle-ci est indispensable au bon fonctionnement du programme ;
  • le mot-cléreturnindique que la fonction renverra la valeur qui suit ce mot. Cette valeur pourra alors être stockée dans une variable ou affichée dans la console.
Pour calculer 
u_20
, on appelle la fonctionterme_uavec l'argument 20.
terme_u(20)
Exercice
1.Écrire une fonctionterme_vprenant un entiernen paramètre et renvoyant le n-ième terme de la suite définie pour tout 
n\in\mathbb{N}
par 
vn=3+(−1)nn+1v_n=\dfrac {3+(-1)^n}{n+1}vn​=n+13+(−1)n​
.
En Python : la puissance s'écrit **. Par exemple 
(−1)n(-1)^n(−1)n
s'écrit (-1)**n.
2. Utiliser cette fonction pour calculer le 
v10v_{10}v10​
.
3.En utilisant cette fonction, conjecturer la limite de 
vnv_nvn​
lorsque 
nnn
tend vers 
+∞+\infty+∞
.

Calcul à l'aide d'une formule de récurrence

Soit 
(wn)(w_n)(wn​)
la suite numérique définie par 
w0=5w_0=5w0​=5
et pour tout 
n∈Nn\in\mathbb{N}n∈N
par
wn+1=wn3+6w_{n+1}=\dfrac{w_n}{3}+6wn+1​=3wn​​+6
. Cette suite est définie par récurrence. Pour obtenir le termede rang10, il faut calculer le termede rang9, qui n'est calculable qu'en ayant le termede rang8, et ainsi de suite.
Pour ce faire, nous utilisons une boucle bornée (aussi appelée bouclefor). La fonction suivante renvoie le terme de rang 
n
pour un entier 
n∈Nn\in\mathbb{N}n∈N
passé en argument. Exécuter ce programme.
def terme_w(n):
    w = 5
    for i in range(n):
        w = w/3 + 6
    return w
Explications du programme
  • La variablewcontient les valeurs successives des termes de la suite.
  • On l'initialise ligne 2 en lui donnant la valeur 5.
  • La boucle for de la ligne 3 crée n répétitions de l'instruction de la ligne 4. On remarquer que la ligne 4 est encore indentée d'un cran pour bien signifier qu'elle fait partie de la boucle for.
  • Ligne 4 : la valeur du terme suivant de la liste est calculée à l'aide de la formule de récurrence et de la valeur précédente. Ce qui est à gauche du signe = désigne la nouvelle valeur, ce qui est à droite désigne l'ancienne. Cette nouvelle valeur est à nouveau enregistrée dans la variable w.
  • La dernière valeur calculée est renvoyée ligne 5. Attention à l'indentation (alignement) : le return doit être en dehors de la boucle, et donc au même niveau que le for.
Pour calculer
w10w_{10}w10​
, on appelle la fonction terme_w avec l'argument 10.
terme_w(10)
Exercice
1.Écrire ci-dessous une fonction terme_t prenant un entiernen paramètre et renvoyant le terme de rangnde la suite définie par 
t0=2t_0=2t0​=2
et pour tout 
n∈Nn\in\mathbb{N}n∈N
par 
tn+1=0,8tn+4t_{n+1}=0,8t_n+4tn+1​=0,8tn​+4
.
2.Utiliser la fonction ainsi construite pour calculer 
t_10
.
3.Conjecturer la limite de cette suite.

Algorithme de seuil

Suite croissante qui tend vers l'infini

Soit 
(mn)(m_n)(mn​)
la suite définie par
m0=4m_0=4m0​=4
et, pour tout
n∈Nn \in \mathbb{N}n∈N
, par
mn+1=2mn+3m_{n+1}=2m_n+3mn+1​=2mn​+3
. On admettra que cette suite est croissante et que
(mn)(m_n)(mn​)
tend vers
+∞+\infty+∞
.
Cela signifie que, pour tout réel
SSS
, il existe un rang 
NNN
à partir duquel, pour tout
n⩾Nn \geqslant Nn⩾N
, on a
un⩾Su_n \geqslant Sun​⩾S
.
La question est, étant donné un seuil
SSS
, quel est ce rang 
NNN
?
Lorsque l'on souhaite répéter un nombre de fois indéterminé une action, on utilisera une boucle non bornée (ou boucle while). Cette boucle se répétera tant que la condition souhaitée n'est pas réalisée.
Dans notre cas, nous souhaitons déterminer à partir de quel rang les termes de la suite sont supérieurs où égaux à
SSS
. Nous allons donc calculer les termes de la suite et continuer tant que les termes sont inférieurs à
SSS
.
Soit un réel
SSS
. La fonction suivante renvoie le rang 
nnn
à partir duquel
mn⩾Sm_n \geqslant Smn​⩾S
.
def seuil(S):
    # On initialise les valeurs de la suite ainsi que de n. Le terme de rang 0 vaut 4.
    m = 4
    n = 0
    # On souhaite savoir quand les termes de la suites dépasseront\(S\).
    # On va donc continuer de calculer les termes de cette suite tant que les termes sont inférieursà\(S\).
    while m < S:
        m = 2 * m + 3
        n = n + 1
    # Une fois que cette boucle est terminée (si elle termine...), on sait que u_n est supérieur ou égal à S.
    # On renvoie donc le rang n correspondant.
    return n
Testons cette fonction pour un seuil de 1 000 000 :
seuil(1000000)
>>> 18
Cela signifie que, à partir du rang 18, tous les termes de la suite sont supérieurs ou égaux à 1 000 000. 
Exercice
On considère la suite
(bn)(b_n)(bn​)
définie par 
b0=2b_0=2b0​=2
pour tout entier naturel 
nnn
, par
bn+1=1,02bn+1b_{n+1}=1,02b_n+1bn+1​=1,02bn​+1
. On admet que la suite 
(bn)(b_n)(bn​)
est croissante et que 
lim⁡n→+∞bn=+∞\displaystyle\lim_{n \to + \infty} b_n = +\inftyn→+∞lim​bn​=+∞
.
1.Écrire une fonctionseuil2prenant un réelaen paramètre et renvoyant le rang 
nnn
à partir duquel
bn⩾ab_n\geqslant abn​⩾a
. 
2.Appeler la fonction pouraégal à 
101510^{15}1015
.

Cas d'une suite croissante tendant vers une limite finie

Le cas d'une suite ayant une limite finie est similaire : si une suite tend vers
lll
, alors pour tout 
ε>0\varepsilon > 0ε>0
, l'intervalle 
[l−ε,l+ε][l-\varepsilon ,l+\varepsilon ][l−ε,l+ε]
contiendra tous les termes de la suite à partir d'un certain rang.
En particulier, si la suite est monotone, il est pratique de déterminer le rang à partir duquel cette condition est vérifiée.
Par exemple, soit
(kn)(k_n)(kn​)
la suite numérique définie par
k0=1k_0=1k0​=1
et, pour tout
n∈Nn\in\mathbb{N}n∈N
, par
kn+1=0,5kn+2k_{n+1}=0,5k_n+2kn+1​=0,5kn​+2
.
On admet que 
(kn)(k_n)(kn​)
est une suite croissante qui tend vers 4. (Le démontrer est un bon exercice !)
Ainsi, pour tout réel 
a<4a<4a<4
, il existe un rang 
NNN
tel que, tout 
n⩾Nn \geqslant Nn⩾N
, on a  
kn⩾ak_n \geqslant akn​⩾a
.
La fonction suivante prend en entrée un réel a et renvoie le premier rang N de la suite
(kn)(k_n)(kn​)
à  partir duquel, pour tout 
n⩾Nn \geqslant Nn⩾N
, on a 
kn⩾ak_n \geqslant akn​⩾a
.
def seuil_k(a) :
    k = 1
    n = 0
    while k < a :
        k = 0.5 * k + 2
        n = n + 1
    return n
En particulier, l'appel de la fonction seuil_k(3.999) renvoie le premier rang à partir duquel les termes de la suite 
(kn)(k_n)(kn​)
sont au-dessus de 3,999.
Attention !
L'appel de la fonction précédente utilisant une entrée supérieure ou égale à 4 provoquera une boucle infinie. En effet, si l'on demande par exemple seuil_k(5), le programme continuera de faire des calculs tant que les termes de la suite n'atteigneront pas la valeur 5... Ce qui est toujours le cas !
Il est donc indispensable d'avoir des informations sur la suite avant de se lancer dans ce genre d'algorithme !
Exercice
Soit
(pn)(p_n)(pn​)
la suite numérique définie par
p0=0,7p_0=0,7p0​=0,7
et, pour tout
n∈Nn\in\mathbb{N}n∈N
, par
pn+1=0,8pn+16p_{n+1}=0,8p_n+16pn+1​=0,8pn​+16
. On admet que 
(pn)(p_n)(pn​)
est une suite croissante qui tend vers 80.
1.Écrire une fonction seuil_p prenant un réelaen paramètre et renvoyant le rang n à partir duquel 
pn⩾ap_n \geqslant apn​⩾a
.
2.Appeler la fonction pouraégal à 79,9999 et interpréter le résultat dans le contexte de l'exercice.

Cas d'une suite décroissante

Le cas des suites décroissantes est tout à fait similaire au cas des suites croissantes.
La seule différence réside dans le sens de l'inégalité contenue dans la boucle while. En effet, lorsque l'on a une suite décroissante, on souhaite déterminer le plus petit entier à partir duquel les termes de la suite sont inférieurs à un certain réel donné. On continuera donc de calculer les termes de la suite tant que ceux-ci seront supérieurs à la valeur seuil recherchée.
Exercice
Soit 
(rn)(r_n)(rn​)
la suite numérique définie par 
r0=20r_0=20r0​=20
et, pour tout
n∈Nn\in\mathbb{N}n∈N
, par
rn+1=0,2rn+8r_{n+1}=0,2r_n+8rn+1​=0,2rn​+8
.
On admet que
(rn)(r_n)(rn​)
est une suite décroissante qui tend vers 10.
1.Écrire ci-dessous une fonctionseuil_rprenant un réela en paramètre et renvoyant le rang n à partir duquel
rn⩽ar_n \leqslant arn​⩽a
. Attention au sens de l'inégalité !
2.Déterminer le plus petit entier N tel que, pour tout entier 
n⩾Nn\geqslant Nn⩾N
, on a
rn⩽10,0001r_n \leqslant 10,0001rn​⩽10,0001
.

Les perles du BAC

Polynésie 2022, sujet 1

Une action est cotée à 57 euros. Sa valeur augmente de 3 % tous les mois. Parmi les 4 fonctions suivantes, quelle est celle qui renvoie le nombre de mois à attendre pour que sa valeur dépasse 200 euros ?
#Fonction 1
def seuil1() :
    m=0
    v=57
    while v < 200 :
        m=m+1
        v = v*1.03
    return m
#Fonction 2
def seuil2() :
    m=0
    v=57
    while v > 200 :
        m=m+1
        v = v*1.03
    return m
#Fonction 3
def seuil3() :
    v=57
    for i in range (200) :
        v = v*1.03
    return v
#Fonction 4
def seuil4() :
    m=0
    v=57
    if v < 200 :
        m=m+1
    else :
        v = v*1.03
    return m

Polynésie 2022, sujet 2

On considère la suite
(un)(u_n)(un​)
définie par
u0=40u_0=40u0​=40
 et, pour tout entier naturel
nnn
, par
un+1=0,008un(200−un)u_{n+1}=0,008u_n(200-u_n)un+1​=0,008un​(200−un​)
.
On admet que la suite 
(un)(u_n)(un​)
est croissante et tend vers 75.
On considère la fonction suivante.
L’exécution de seuil(100) ne renvoie aucune valeur. Expliquer pourquoi à l’aide des données sur la suite.
def seuil(p) :
    n=0
    u = 40
    while u < p :
        n = n + 1
        u = 0.008 * u * (200-u)
    return (n+2021)

Asie, 2022

On considère la suite
(un)(u_n)(un​)
définie par 
u0=1u_0=1u0​=1
et, pour tout entier naturel
nnn
, par
un+1=0,9un+0,25u_{n+1} = 0,9u_n + 0,25un+1​=0,9un​+0,25
.
On admet que la suite 
(un)(u_n)(un​)
est croissante et tend vers 2,5.
Cette suite modélise l'évolution d'une quantité de médicament dans le sang d'un patient sous perfusion.
1.On estime que le médicament est réellement efficace lorsque sa quantité dans le sang du patient est supérieure ou égale à 1,8 mg. Compléter le script écrit en langage Python suivant de manière à déterminer au bout de combien de périodes de 30 minutes le médicament commence à être réellement efficace.
def efficace():
    u=1
    n=0
    while ......:
        u=......
        n = n+1
    return n
2.Quelle est la valeur renvoyée par ce script ? Interpréter ce résultat dans le contexte de l’exercice.

Centres étrangers, 2022

On considère la suite
(un)(u_n)(un​)
définie par
u0=0u_0=0u0​=0
et, pour tout entier naturel
nnn
, par
un+1=1+un−exp⁡(0,5un−2)u_{n+1} =1 + u_n - \exp(0,5u_n-2)un+1​=1+un​−exp(0,5un​−2)
.
On admet que
(un)(u_n)(un​)
est croissante et tend vers 4.
En utilisant la fonction ci-dessous, l'instruction valeur(3.99) renvoie la valeur 12. Interpréter ce résultat dans le contexte de l'exercice.
from math import exp
def valeur (a) :
    u = 0
    n = 0
    while u <= a:
        u = 1 + u - exp(0.5*u - 2)
        n = n + 1
    return n

Polynésie, septembre 2022

On considère la suite
(un)(u_n)(un​)
définie par 
u0=0,25u_0=0,25u0​=0,25
et, pour tout entier naturel
nnn
, par
un+1=0,5un(1−un)u_{n+1} = 0,5 u_n (1-u_n)un+1​=0,5un​(1−un​)
.
On admet que
(un)(u_n)(un​)
est décroissante et tend vers 0.
On considère la fonction Pythonalgo(p)où p désigne un entier naturel non nul. Expliquer pourquoi, pour tout entier naturel non nul p, la boucle while ne tourne pas indéfiniment, ce qui permet à la commande algo (p) de renvoyer une valeur.
def algo(p) :
    u = 1/4
    n = 0
    while u > 10**(-p):
        u = 1/2 * u * (1 - u)
        n = n + 1
    return n 

Amérique du Nord, 2023

On considère la suite
(an)(a_n)(an​)
définie par
a0=1 700a_0=1\,700a0​=1700
et, pour tout entier naturel
nnn
, par
an+1=0,75an+300a_{n+1} =0,75a_n+300an+1​=0,75an​+300
.
Cette suite modélise le nombre de membres d'un club de sport à l'année 2023 +
nnn
.
On admet que la suite 
(an)(a_n)(an​)
est décroissante et tend vers 1200.
Recopier et compléter le programme Python ci-dessous afin qu’il renvoie la plus petite valeur de n à partir de laquelle le nombre de membres du club est strictement inférieur à 1 280.
def seuil() :
    n = 0
    A = 1 700
    while ... :
        n = n + 1
        A = ...
    return...
Déterminer la valeur renvoyée lorsqu’on appelle la fonction seuil.

Amérique du Sud, 2022

On considère la suite
(un)(u_n)(un​)
définie par
u0=2000u_0=2000u0​=2000
et, pour tout entier naturel
nnn
, par
un+1=0,9un+100u_{n+1} =0,9u_n + 100un+1​=0,9un​+100
.
On admet que 
(un)(u_n)(un​)
est décroissante et tend vers 1000.
Compléter ce programme afin qu’il retourne le rang 
nnn
à partir duquel la suite passe en dessous du seuil S.
def population(S) :
    n = 0
    u = 2000
    while ...... :
        u = ...
        n = ...
    return ...