On cherche le maximum de la fonction f définie sur \mathbb{R} par f(x) = 3x^3 - 5x + 1 sur un intervalle [a;b] à la précision 10^{-n} , n étant le nombre de chiffres corrects après la virgule.
Comment définir la fonction f définie sur \mathbb{R} par f(x) = 3x^3 - 5x + 1 en Python ?
En Python, une fonction se définit avec le mot-clé \verb/def/ suivi du nom de la fonction et des arguments entre parenthèses. Elle se termine par l'instruction \verb/return/ qui renvoie le résultat souhaité.
Ainsi :
\verb/ def f(x): /
\verb/ return 3*x**3-5*x+1 /
On coupe l'intervalle en 3 en posant m = \dfrac{b-a}{3} , c = a + m , et d = b - m .
On a alors a < c < d < b et on peut séparer les différents cas possibles en notant x_0 l'abscisse du maximum :
- si a < x_0 \leq c , alors f(c) > f(d) ;
- si c \leq x_0 \leq d , alors f(c) \geq f(d) ou f(c) \leq f(d) ;
- si d \leq x_0 \leq b , alors f(c) < f(d) .
Comment peut-on résumer la situation précédente ?
Si f(c) \leq f(d) , alors c \leq x_0 \leq b . Donc x_0 \in [c;b] .
Si f(c) \geq f(d) , alors a \leq x_0 \leq d . Donc x_0 \in [a;d] .
Ainsi :
- si f(c) \leq f(d) , alors x_0 \in [c;b] ;
- si f(c) \geq f(d) , alors x_0 \in [a; d] .
Comment mettre à jour l'intervalle dans lequel se trouve le maximum ?
On sait que :
- Si f(c) \leq f(d) , alors x_0 \in [c;b] . On met a à jour qui prend la valeur de c .
- Si f(c) \geq f(d) , alors x_0 \in [a; d] . On met b à jour qui prend la valeur de d .
On peut donc utiliser les conditions Python \verb/if - else/ pour mettre à jour les bornes de l'intervalles :
\verb* m=(b-a)/3 *
\verb/ c=a+m /
\verb/ d=b-m /
\verb/ if f(c)<=f(d): /
\verb/ a=c /
\verb/ else: /
\verb/ b=d /
Quel programme Python permet de déterminer un intervalle à la précision 10^{-n} dans lequel se trouve le maximum de la fonction f sur un intervalle [a;b] ?
On cherche un intervalle de précision 10^{-n} . On utilise donc une boucle \verb/while/ qui permet d'itérer tant qu'une condition est vérifiée. Ici, la condition est que l'intervalle soit plus large que la valeur de la précision.
Tant que c'est le cas, on met l'intervalle à jour avec la formule suivante :
- Si f(c) \leq f(d) , alors a = c .
- Si f(c) \geq f(d) , alors b = d .
Ainsi, le programme qui convient est le suivant :
\verb/ def f(x): /
\verb/ return -3*x**3+4*x+1 /
\verb/ def trichotomie(f,a,b,n): /
\verb/ e=10**(-n) /
\verb/ while b-a>e: /
\verb* m=(b-a)/3 *
\verb/ c=a+m /
\verb/ d=b-m /
\verb/ if f(c)<=f(d): /
\verb/ a=c /
\verb/ else: /
\verb/ b=d /
\verb/ return (round(a,n),round(b,n)) /