Algorithmes et Suites en Python

Exercices pour maîtriser la définition et le calcul des suites avec Python.

⚠ Si l'algorithme est défini à l'aide d'une fonction, ouvrez la console Trinket pour exécuter et tester le code.

Ouvrir la console Trinket

Suites Définies par Algorithme

Exercice 1 : Exploration de la fonction Devine(n)

Question 1 :
Exécuter la fonction Python Devine(n) pour différentes valeurs de $n$ (par exemple, $n=5, 10, 20$). Que remarquez-vous concernant les valeurs retournées lorsque $n$ augmente ?


def Devine(n):
    u = 1
    for k in range(n):
        u = (1 + 1/(k + 1)) * u
    return u
                            

Question 2 :
Modifier la fonction Devine(n) pour qu'elle affiche à chaque étape de la boucle la valeur de k et la valeur correspondante de u. Cela vous aide-t-il à comprendre comment la valeur de retour est construite ?
Question 3 :
La suite calculée par Devine(n) a-t-elle une limite lorsque $n$ tend vers l'infini ? Si oui, quelle est cette limite approximativement ? (Vous pouvez tester avec de très grandes valeurs de $n$, par exemple $n=1000$).

Exercice 2 : Étude de la Suite Récurrente $U_n$

Question 1 :
Écrire un algorithme Python, sous forme d'une fonction SuiteU_n(n), qui prend en entrée un entier naturel 𝑛 et retourne le terme 𝑢𝑛 de la suite (𝑢𝑛) définie par : $ \begin{cases} u_0 = \frac{1}{2} \\ u_{n+1} = \frac{2u_n}{1+u_n} \end{cases} $
Question 2 :
Calculer et afficher les 10 premiers termes de la suite $(u_n)$ en utilisant la fonction SuiteU_n(n). Observer l'évolution des valeurs de la suite. Que conjecturez-vous ?
Question 3 :
Modifier l'algorithme pour qu'il retourne non pas un terme unique, mais la liste des $n+1$ premiers termes de la suite, de $u_0$ à $u_n$.
Question 4 :
Tester votre algorithme modifié et vérifier la cohérence des premiers termes calculés.

Somme des Termes et Problèmes de Seuil

Exercice 3 : Exploration des fonctions Somme et Seuil

Question 1 :
Calculer, à la main, les premières valeurs de la suite $(u_n)$ définie par $u_0 = 20$ et $u_{n+1} = 0.8 \times u_n + 50$. Quelles sont les valeurs de $u_0, u_1, u_2, u_3$ ?
Question 2 :
Utiliser la fonction Python Somme(u0, n) pour calculer les sommes $S_5$, $S_{10}$ et $S_{15}$ pour la suite $(u_n)$ définie dans l'exemple, avec $u_0 = 20$. Comment la somme évolue-t-elle quand $n$ augmente ?


def Somme(u0, n):
    U = u0
    S = 0
    for i in range (n + 1):
        S = S + U
        U = 0.8*U + 50
    return S
                            

Question 3 :
Modifier la fonction Somme(u0, n) pour qu'elle affiche à chaque étape de la boucle la valeur du terme courant U et la somme cumulée S. Que remarquez-vous de l'évolution de $U$ et $S$ ?
Question 4 :
Utiliser la fonction Proche(e) pour déterminer le premier entier $N$ tel que $|U_N - 3| < e$ pour différentes valeurs de précision $e$ (par exemple, $e=0.1, 0.01, 0.001$). Comment l'indice $N$ varie-t-il avec la précision $e$ ?

def Proche(e):
    N=0
    U=2.5
    while abs(U-3) >= e:
        N = N+1
        U= -U**2 + 5*U - 3
    return N
                            

Suite de Syracuse

Exercice 4 : Exploration de la Suite de Syracuse

Définition de la suite de Syracuse :
La suite de Syracuse est définie pour un entier de départ $u_0$ de la manière suivante :

    - Si $u_n$ est pair, alors $u_{n+1} = \frac{u_n}{2}$

    - Si $u_n$ est impair, alors $u_{n+1} = 3u_n + 1$

On répète ce processus pour générer les termes successifs de la suite.
Question 1 :
Calculer à la main les 10 premiers termes de la suite de Syracuse en partant de $u_0 = 7$. Détaillez vos calculs.
Question 2 :
Utiliser la fonction Python Syracuse(debut) pour vérifier vos calculs de la question 1 et afficher la suite complète jusqu'à la valeur 1.

def Syracuse(debut):
    u = debut
    L = [u]
    n = 1
    while u > 1:
        if u != 2 * (u//2) :
            u= 3 * u + 1
        else :
            u = u//2
        L.append (u)
        n = n + 1
    return n , L
                            

Question 3 :
Modifier la fonction Syracuse(debut) pour afficher à chaque étape si le terme suivant est calculé par la règle "paire" (division par 2) ou "impaire" (multiplication par 3 et ajout de 1).
Question 4 :
Tester la fonction Syracuse(debut) avec d'autres valeurs de départ (par exemple, 27, 50, 100). Observer et commenter les temps de vol et altitudes maximales obtenus.

Exercice 5 : Valeur Moyenne de la Suite de Syracuse

Question 1 :
En utilisant la fonction Syracuse(debut) de l'exercice précédent, calculez et affichez la liste des termes de la suite de Syracuse pour debut = 15. Observez les valeurs. La suite oscille-t-elle autour d'une valeur moyenne ?
Question 2 :
Écrire une nouvelle fonction Python, Syracuse_Moyenne(debut, nombre_termes), qui calcule et retourne la moyenne des nombre_termes premiers termes de la suite de Syracuse, en partant de debut.
Question 3 :
Tester la fonction Syracuse_Moyenne(debut, nombre_termes) pour debut = 15 et différentes valeurs de nombre_termes (par exemple, 10, 100, 1000). Comment la moyenne évolue-t-elle lorsque nombre_termes augmente ? Converge-t-elle vers une valeur particulière ?
Question 4 (Plus difficile):
Modifier la fonction Syracuse_Moyenne(debut, nombre_termes) pour qu'elle affiche aussi, à chaque étape, la moyenne cumulée des termes calculés jusqu'à présent. Cela vous aide-t-il à visualiser la convergence (ou non-convergence) de la moyenne ?

Algorithme de Dichotomie

Exercice 6 : Recherche de Zéro par Dichotomie

Question 1 :
La fonction Python dicho_croiss(a, b, p) implémente la dichotomie pour trouver un zéro d'une fonction croissante. Exécutez-la avec la fonction $f(x) = x^3 + 2x^2 - 4x - 1$, sur l'intervalle $[1, 2]$ avec une précision $p=0.1$. Vérifiez que l'intervalle retourné contient bien une solution de $f(x)=0$.


def f(x):
    return x**3 + 2 * x**2 - 4 * x - 1

def dicho_croiss(a, b, p):
    while b - a > p:
        m = (a + b) / 2
        if f(m) == 0:
            break
        elif f(m) < 0:
            a = m
        else:
            b = m
    if f(m) == 0:
        print(m,"est la solution recherchée")
    else:
        print("[" ,a, ";" ,b, "]")
                            

Question 2 :
Modifier la fonction dicho_croiss(a, b, p) pour qu'elle affiche le nombre d'itérations nécessaires pour atteindre la précision $p$. Cela vous donne-t-il une idée de l'efficacité de la dichotomie ?
Question 3 :
Écrire une nouvelle fonction Python, dicho_general(f, a, b, p, croissance), qui généralise la dichotomie pour fonctionner à la fois pour les fonctions croissantes et décroissantes. Le paramètre croissance sera un booléen (True pour croissante, False pour décroissante).
Question 4 :
Tester votre fonction dicho_general(f, a, b, p, croissance) avec la fonction $f(x) = x^3 + 2x^2 - 4x - 1$ sur l'intervalle $[-1, 0]$, où elle est décroissante, avec une précision de $p=0.01$. N'oubliez pas de tenir compte que f est décroissante sur cet intervalle !

Exercice 7 : Dichotomie et Fonction Décroissante

Question 1 :
Écrire une fonction Python dicho_decroiss(a, b, p) qui utilise l'algorithme de dichotomie pour trouver un zéro d'une fonction $f$ strictement décroissante sur l'intervalle $[a, b]$, avec $f(a) > 0$ et $f(b) < 0$.


def f(x): # Définition de la fonction f(x) (à adapter selon l'exercice)
    return x**3 + 2 * x**2 - 4 * x - 1

# Votre code pour la fonction dicho_decroiss ici
                            

Question 2 :
Tester votre fonction dicho_decroiss(a, b, p) avec la fonction $f(x) = x^3 + 2x^2 - 4x - 1$ sur l'intervalle $[-1, 0]$ et une précision de $p=0.05$. L'intervalle trouvé est-il cohérent avec le comportement décroissant de $f$ et la recherche d'un zéro ?
Question 3 :
Comparer le code de dicho_croiss avec celui de dicho_decroiss. Quelles sont les principales différences ? Expliquez pourquoi ces modifications sont nécessaires pour adapter la dichotomie aux fonctions décroissantes.

Probabilités et Loi Binomiale

Exercice 8 : Calcul des Probabilités Binomiales

Question 1 :
Utiliser la fonction binomiale(k, n, p) pour calculer la probabilité d'obtenir exactement 3 succès en 10 épreuves, avec une probabilité de succès de 0.4 à chaque épreuve.


def binomiale(k, n, p):
    from math import comb
    return comb(n, k) * p**k * (1 - p)**(n - k)
                            

Question 2 :
Pour un jeu de pile ou face équilibré (p=0.5) lancé 5 fois, calculer avec binomiale la probabilité d'obtenir exactement 0, 1, 2, 3, 4, et 5 faces. Afficher ces probabilités.
Question 3 :
Vérifier que la somme de toutes les probabilités calculées à la question précédente est bien égale à 1 (à cause des arrondis, vous pourriez obtenir une valeur très proche de 1). Pourquoi est-ce logique ?

Exercice 9 : Suite Définie par un Produit

Question 1 :
Exécuter la fonction Python SuiteProd(n) pour différentes valeurs de $n$. Observer comment les valeurs de la suite évoluent.


def SuiteProd(n):
    u = 1
    for i in range(1, n + 1):
        u = u * (1 + 1/(i**2))
    return u
                            

Question 2 :
Modifier la fonction SuiteProd(n) pour afficher à chaque étape la valeur de i et le terme courant u.
Question 3 :
La suite calculée par SuiteProd(n) semble-t-elle converger vers une limite finie lorsque $n$ augmente ? Estimez approximativement cette limite si elle existe.

Exercice 10 : Suite Récurrente avec Modulo

Question 1 :
Calculer à la main les 5 premiers termes de la suite $(v_n)$ définie par $v_0 = 3$ et $v_{n+1} = (v_n + 5) \pmod{7}$.
Question 2 :
Écrire une fonction Python SuiteModulo(n) qui retourne le $n$-ième terme de la suite $(v_n)$.
Question 3 :
Afficher les 20 premiers termes de la suite $(v_n)$. La suite semble-t-elle périodique ? Si oui, quelle est la période ?

Exercice 11 : Somme des Termes d'une Suite Géométrique

Question 1 :
Écrire une fonction Python SommeGeo(u0, q, n) qui calcule la somme des $n+1$ premiers termes d'une suite géométrique de premier terme $u_0$ et de raison $q$.
Question 2 :
Calculer avec SommeGeo la somme des 10 premiers termes de la suite géométrique de premier terme $u_0 = 2$ et de raison $q = 0.5$.
Question 3 :
Comparer le résultat obtenu avec la formule théorique de la somme des termes d'une suite géométrique. La formule théorique est-elle vérifiée numériquement ?

Exercice 12 : Problème de Seuil sur une Somme

Question 1 :
On considère la suite $(w_n)$ définie par $w_0 = 1$ et $w_{n+1} = w_n + \frac{1}{n+1}$ pour $n \ge 0$. Écrire une fonction Python SeuilSomme(seuil) qui retourne le plus petit entier $N$ tel que la somme $W_N = \sum_{i=0}^{N} w_i$ dépasse un seuil donné.
Question 2 :
Tester la fonction SeuilSomme(seuil) pour différents seuils (par exemple, seuil=10, 50, 100). Comment l'indice $N$ évolue-t-il avec le seuil ?
Question 3 :
Modifier la fonction SeuilSomme(seuil) pour afficher également la valeur de la somme $W_N$ atteinte lorsque le seuil est dépassé.

Exercice 13 : Altitude Maximale de la Suite de Syracuse

Question 1 :
Modifier la fonction Syracuse(debut) pour qu'elle retourne également l'altitude maximale atteinte par la suite, en plus du temps de vol et de la liste des termes.
Question 2 :
Tester la fonction modifiée pour différentes valeurs de départ (par exemple, 15, 27, 40). Observer et comparer les altitudes maximales atteintes.
Question 3 :
Pour un grand nombre de valeurs de départ (par exemple, de 1 à 1000), déterminer quelle valeur de départ produit l'altitude maximale la plus élevée.

Exercice 14 : Dichotomie pour Fonction Trigonométrique

Question 1 :
Définir une fonction Python $g(x) = \cos(x) - x$. Montrer graphiquement que la fonction $g(x)$ admet un zéro sur l'intervalle $[0, 1]$ et qu'elle est décroissante sur cet intervalle.
Question 2 :
Utiliser la fonction dicho_decroiss(a, b, p) (que vous avez écrite précédemment) pour trouver une approximation du zéro de $g(x)$ sur $[0, 1]$ avec une précision de $p = 0.001$.
Question 3 :
Modifier la fonction dicho_decroiss pour qu'elle retourne également le nombre d'itérations nécessaires pour atteindre la précision demandée.

Exercice 15 : Dichotomie pour Inversion de Fonction

Question 1 :
On considère la fonction $h(x) = x^2 + x$ sur l'intervalle $[0, 2]$. Montrer que $h(x)$ est croissante sur cet intervalle.
Question 2 :
Utiliser la dichotomie (fonction dicho_croiss) pour trouver une approximation de la valeur $x$ dans $[0, 2]$ telle que $h(x) = 3$, avec une précision de $p = 0.01$. On cherche donc à inverser la fonction $h$ pour la valeur 3.
Question 3 :
Vérifier que la valeur approchée de $x$ trouvée satisfait bien $h(x) \approx 3$.

Exercice 16 : Probabilité Cumulée Binomiale

Question 1 :
Écrire une fonction Python Binomiale_cumulee(k, n, p) qui calcule la probabilité cumulée $P(X \le k)$ pour une variable aléatoire binomiale $X \sim B(n, p)$, en utilisant une boucle et la fonction binomiale(i, n, p) pour $i$ allant de 0 à $k$.
Question 2 :
Pour un jeu de pile ou face équilibré lancé 10 fois, calculer avec Binomiale_cumulee la probabilité d'obtenir au plus 4 faces.
Question 3 :
Calculer également la probabilité $P(X > 4)$ pour le même exemple, en utilisant la probabilité complémentaire et la fonction Binomiale_cumulee.

Exercice 17 : Seuil pour Probabilité Binomiale

Question 1 :
Écrire une fonction Python SeuilBinomiale(prob_seuil, p) qui détermine le nombre minimal d'épreuves $n$ nécessaires pour que la probabilité d'obtenir au moins un succès soit supérieure ou égale à une probabilité prob_seuil donnée, pour une probabilité de succès $p$ à chaque épreuve.
Question 2 :
Tester la fonction SeuilBinomiale pour une probabilité de succès $p = 0.1$ et un seuil de probabilité de 0.9. Combien d'épreuves faut-il au minimum ?
Question 3 :
Expliquez pourquoi la probabilité d'obtenir au moins un succès augmente avec le nombre d'épreuves $n$.

Exercice 18 : Application de la Loi Binomiale - Contrôle Qualité

Question 1 :
Dans un processus de fabrication, 5% des pièces produites sont défectueuses. On prélève un échantillon aléatoire de 20 pièces. Quelle est la probabilité qu'il y ait exactement 2 pièces défectueuses dans l'échantillon ? Utiliser la fonction binomiale.
Question 2 :
Quelle est la probabilité qu'il y ait au plus 2 pièces défectueuses dans l'échantillon ? Utiliser la fonction Binomiale_cumulee.
Question 3 :
Quelle est la probabilité qu'il y ait plus de 2 pièces défectueuses dans l'échantillon ?