Une résolution par balayage L'algorithme présenté dans cette page permet de trouver "toutes" (ou presque(*)) les solutions d'une équation du type f(x)=0 sur un intervalle donné. Voici l'idée de la méthode : On se place sur un intervalle [a ; b] donné où la fonction f est définie. On découpe cet intervalle en "tranches de taille identique". On teste alors si la fonction change de signe entre les bornes de chaque tranche. Si oui, on considère que la fonction a coupé l'axe des abscisses entre les deux bornes et que l'on a donc un encadrement d'une solution de l'équation f(x) = 0. Dans toute la suite on appellera a et b les deux bornes de l'intervalle, p la longueur "d'une tranche". Indiquer les encadrement des solutions obtenues lorsque l'on choisit successivement : a=0, b=6 et p=2 a=0, b=6 et p=1,5 a=0, b=6 et p=1 a=0,5, b=6 et p=1 Voici une première version de l'algorithme où l'on a choisi de "découper" l'intervalle [a ; b] en 1 000 tranches de tailles identiques. Algorithme en langage naturel Entrées : Saisir les bornes a et b de l'intervalle (a<b) Initialisation des variables : Affecter (b-a)/1000 à p Affecter a à x Affecter 0 à M // M représente le nombre de solutions trouvées Effacer toutes les listes Traitement : Tant que x ≤b faire | Si f x ×f xp0 alors | | Augmenter M de 1 | | Affecter x à Liste_des_valeurs_par_défaut en position M | | Affecter x + p à Liste_des_valeurs_par_excès en position M | | Affecter x + p à x | Sinon | | Affecter x + p à x | Fin de Si Fin de Tant que Sorties : Pour i allant de 1 à M faire | Afficher "Les solutions sont comprises entre : " | Afficher la valeur de Liste_des_valeurs_par_défaut, position M | Afficher "et : " | Afficher la valeur de Liste_des_valeurs_par_excès, position M Fin de Pour Sur Casio 1) Tester cet algorithme avec les fonctions définies par : a) f(x) = cos(x) sur [0 ; 7] (mettre la calculatrice en radians) b) f(x) = x²-1 sur [-2 ; 2] 2) Tracer le graphe de la fonction f définie au b). Que constate-t-on? Comment l'expliquer? Amélioration de l'algorithme : Pour palier au défaut rencontré à la question 2) nous allons rajouter un test supplémentaire dans le traitement de l'algorithme. Algorithme en langage naturel Sur Casio Entrées : Saisir les bornes a et b de l'intervalle (a<b) Initialisation des variables : Affecter (b-a)/1000 à p Affecter a à x Affecter 0 à N // N représente le nombre de solutions exactes trouvées Affecter 0 à M // M représente le nombre de solutions approchées trouvées Effacer toutes les listes Traitement : Tant que x≤b faire | Si f(x) = 0 alors | | Affecter N+1 à N | | Affecter x à Liste_des_solutions_exactes en position N | | Affecter x + p à x | Sinon | | Si f x ×f x p0 alors | | | Augmenter M de 1 | | | Affecter x à Liste_des_valeurs_par_défaut en position M | | | Affecter x + p à Liste_des_valeurs_par_excès en position M | | | Affecter x + p à x | | Sinon | | | Affecter x + p à x | | Fin de Si | Fin de Si Fin de Tant que Sorties : Afficher "Le nombre de solution de l'équation est : " Afficher la valeur de N+M Pour i allant de 1 à N faire | Afficher "Les solutions exactes sont : " | Afficher la valeur de Liste_des_solutions_exactes, position N Fin de Pour Pour i allant de 1 à M faire | Afficher "Les solutions sont comprises entre : " | Afficher la valeur de Liste_des_valeurs_par_défaut, position M | Afficher "et : " | Afficher la valeur de Liste_des_valeurs_par_excès, position M Fin de Pour Tester l'algorithme avec les fonctions précédentes Mini défi : Cet algorithme contient une instruction répétée trois fois, alors que l'on peut ne l'écrire qu'une seule fois en modifiant la structure de l'algorithme. Sauriez-vous trouver laquelle et effectuer cette modification? (*) Un début d'explication du "presque toutes les solutions" du début : Tester cet algorithme sur la fonction f définie par f(x) = sin(1/x) en choisissant comme bornes : a) a=0,00001 et b = 1 b) a=0,00001 et b = 0,1 Que remarque-t-on?