Import des bibliothèques Python

In [1]:
import numpy as np                #pour disposer des tableaux de type array
import matplotlib.pyplot as plt   #pour les graphiques
In [2]:
% matplotlib inline
#pour l'affichage des graphiques dans la page et non pas dans une fenetre pop up
In [3]:
import operator                   #pour utiliser les opérateurs de base sous forme de fonctions
In [20]:
from sympy import *               #pour le calcul formel
init_printing()
t = symbols('t')
In [5]:
def dérivée(exp, t):
    return diff(exp,t)

def simplifier(exp):
    return simplify(exp)

Résolution approchée de $f(x)=0$ par dichotomie, exo 5 de la fiche

Soit $f$ la fonction définie sur $[0;+\infty[$ par $g(x)=2x^3+6x^2-1$ definie sur $[0;+\infty[$ et dérivable sur $[0;+\infty[$.

Question 1 : Calcul de dérivée

In [21]:
#expression de f(x)
fexp = 2*t**3 + 6*t**2 - 1
fexp
Out[21]:
$$2 t^{3} + 6 t^{2} - 1$$
In [22]:
#expression de f'(x)
fprimexp = dérivée(fexp, t)
fprimexp
Out[22]:
$$6 t^{2} + 12 t$$
In [23]:
simplifier(fprimexp)
Out[23]:
$$6 t \left(t + 2\right)$$

Questions 2 et 3 Etude des variations de $f$ et de la limite de $f$ en $+\infty$

In [24]:
f = lambdify(t, fexp,"numpy")
fprim = lambdify(t, fprimexp,"numpy")
In [25]:
#tracé des  courbes  de f et f'
#Message d'erreur pour f' pour le point d'abscisse 0 (division par 0)
xmin, xmax, ymin, ymax = 0, 10, -20 , 20
plt.axis([xmin, xmax, ymin, ymax])
tx = np.linspace(xmin, xmax, 1001)
ty = f(tx)
tz = fprim(tx)
plt.axhline(color='blue')
plt.axvline(color='blue')
plt.grid(True)
plt.plot(tx, ty, linestyle='-', linewidth=2, color='red', label=r'$y=f(x)$')
plt.plot(tx, tz, linestyle='-', linewidth=1, color='green', label=r"$y=f'(x)$")
plt.legend(loc='lower right')
         
Out[25]:
<matplotlib.legend.Legend at 0xa86deaac>
In [33]:
Eq(Limit(fexp, t, oo),limit(fexp,t,oo))
Out[33]:
$$\lim_{t \to \infty}\left(2 t^{3} + 6 t^{2} - 1\right) = \infty$$

Question 3 Existence de solutions de l'équation $f(x)=0$

  • $f:x \mapsto f(x)=2x^3+6x^2-1$ est dérivable donc continue sur $[0;+\infty[$
  • $f(0)<0 < \lim\limits_{x \to + \infty} f(x) = + \infty$
  • $f$ est strictement croissante sur $[0;+\infty[$

D'après un corollaire du théorème des valeurs intermédiaires, l'équation $f(x)=0$ possède donc une unique solution $\alpha$ dans l'intervalle $[0;+\infty[$.

De plus $f(0)<0<f(0,5)$ donc $0< \alpha < 0,5$.

Résolution approchée par balayage

In [11]:
def balayage(g, a, b, pas, k):
    """Retourne un intervalle d'amplitude pas encadrant l'unique solution de g(x)= k
    dans l'intervalle [a,b]"""
    if g(a) < k:
        comparaison = lambda u, v : operator.lt(u,v)
    else:
        comparaison = lambda u, v : operator.gt(u,v)
    x = a
    #en-tete du tableau
    print('|{etape:^16}|{t:^12}|{ft:^12}|'.format(etape='Etape', t='t', ft='g(t)'))
    count = 1
    while comparaison(g(x), k):
        print('|{etape:^16}|{t:^12.6f}|{ft:^12.6f}|'.format(etape=count,t=x, ft=g(x)))
        x += pas
        count += 1
    print('|{etape:^16}|{t:^12.6f}|{ft:^12.6f}|'.format(etape=count,t=x, ft=g(x)))       
    return x - pas, x
In [37]:
balayage(f, 0, 0.5, 0.2, 0)
|     Etape      |     t      |    g(t)    |
|       1        |  0.000000  | -1.000000  |
|       2        |  0.200000  | -0.744000  |
|       3        |  0.400000  |  0.088000  |
Out[37]:
$$\left ( 0.2, \quad 0.4\right )$$
In [39]:
balayage(f, 0.2, 0.4, 0.02, 0)
|     Etape      |     t      |    g(t)    |
|       1        |  0.200000  | -0.744000  |
|       2        |  0.220000  | -0.688304  |
|       3        |  0.240000  | -0.626752  |
|       4        |  0.260000  | -0.559248  |
|       5        |  0.280000  | -0.485696  |
|       6        |  0.300000  | -0.406000  |
|       7        |  0.320000  | -0.320064  |
|       8        |  0.340000  | -0.227792  |
|       9        |  0.360000  | -0.129088  |
|       10       |  0.380000  | -0.023856  |
|       11       |  0.400000  |  0.088000  |
Out[39]:
$$\left ( 0.3800000000000001, \quad 0.40000000000000013\right )$$
In [40]:
balayage(f, 0.38, 0.4, 0.002, 0)
|     Etape      |     t      |    g(t)    |
|       1        |  0.380000  | -0.023856  |
|       2        |  0.382000  | -0.012970  |
|       3        |  0.384000  | -0.002018  |
|       4        |  0.386000  |  0.009001  |
Out[40]:
$$\left ( 0.384, \quad 0.386\right )$$

Résolution approchée par dichotomie

Fonctions Python

In [15]:
def dicho(f,a,b,e, k):
    """valeur approchée à e près de la solution de f(x)=k
    sur [a,b]. On admet que l'utilisateur saisit des paramètres
    où la dichotomie peut s'appliquer. Construit une figure 
    à chaque étape.
    Les valeurs de a et b affichées sont celles en sortie de boucle."""
    etape = 0 #nombre d'étapes
    if f(a) <= f(b):
        #croissant ou du moins passage de - à +
        croissant = True
    else:
        croissant = False
    while b - a > e:
        etape += 1
        #on calcule le milieu du segment [a,b]
        m = (a+b)/2
        #figure
        x = np.linspace(a,b,500)
        y = f(x)
        plt.xlim(a,b)
        if croissant:
            plt.ylim(max(f(a),-50),min(f(b),50))
        else:
            plt.ylim(max(f(b),-50),min(f(a),50))
        plt.plot(x,y,color='red')
        plt.grid(True)
        plt.axhline(k)
        plt.title('a=%.4f et m=%.4f et b=%.4f'%(a,m,b))
        plt.show()
        #fin de la figure
        s = (f(m) - k)*(f(a) - k)
        #si f(m) - k  et f(a) - k sont de meme signe, f(x)=k dans ]m,b[
        if s > 0:
            a = m
        #si f(m) - k  et f(a) - k sont de signes opposés, f(x)=k dans ]a,m]
        else:
            b = m       
    return a, b, etape

def dicho_tab(f,a,b,e, k):
    """valeur approchée à e près de la solution de f(x)=k
    sur [a,b]. On admet que l'utilisateur saisit des paramètres
    où la dichotomie peut s'appliquer. 
    Ne retourne rien mais remplit un tableau avec les valeurs
    de a, b et m aux differentes etapes.
    Les valeurs de a et b affichées sont celles en sortie de boucle"""
    count = 0 #nombre d'étapes
    if f(a) <= f(b):
        #croissant ou du moins passage de - à +
        croissant = True
    else:
        croissant = False
    #en-tete du tableau
    print('|{etape:^16}|{median:^12}|{test:^10}|{binf:^12}|{bsup:^12}|'.format(etape='Etape',
                                                                     binf='a', bsup='b', median='m',
                                                                     test='Choix ?'))
    #première ligne du tableau
    #remplissage de la ligne du tableau
    print('|{etape:^16}|{median:^12}|{test:^10}|{binf:^12}|{bsup:^12}|'.format(etape='initialisation',
                                                                     binf=a, bsup=b, median=str(None),
                                                                     test=str(None)))
    while b - a > e:
        count += 1
        #on calcule le milieu du segment [a,b]
        m = (a+b)/2
        s = (f(m) - k)*(f(a) - k)
        #si f(m) - k  et f(a) - k sont de meme signe, f(x)=k dans ]m,b[
        if s > 0:
            a = m
        #si f(m) - k  et f(a) - k sont de signes opposés, f(x)=k dans ]a,m]
        else:
            b = m
        #remplissage de la ligne du tableau
        print('|{etape:^16}|{median:^12}|{test:^10}|{binf:^12}|{bsup:^12}|'.format(etape=count,
                                                                     binf=a, bsup=b, median=m,
                                                                     test= 'gauche' if b == m else 'droite'))   

Résolution par dichotomie de l'équation $f(x)=0$ dans l'intervalle $[0;0,5]$

D'abord on s'arrete lorsque l'amplitude de l'intervalle $[a,b]$ est inférieure ou égale à $0,01$

In [42]:
dicho_tab(f, 0, 0.5, 0.02, 0)
|     Etape      |     m      | Choix ?  |     a      |     b      |
| initialisation |    None    |   None   |     0      |    0.5     |
|       1        |    0.25    |  droite  |    0.25    |    0.5     |
|       2        |   0.375    |  droite  |   0.375    |    0.5     |
|       3        |   0.4375   |  gauche  |   0.375    |   0.4375   |
|       4        |  0.40625   |  gauche  |   0.375    |  0.40625   |
|       5        |  0.390625  |  gauche  |   0.375    |  0.390625  |
In [43]:
dicho(f, 0, 0.5, 0.02, 0)
Out[43]:
$$\left ( 0.375, \quad 0.390625, \quad 5\right )$$

Ensuite on s'arrete lorsque l'amplitude de l'intervalle $[a,b]$ est inférieure ou égale à $0,001$

In [44]:
dicho_tab(f, 0, 0.5, 0.002, 0)
|     Etape      |     m      | Choix ?  |     a      |     b      |
| initialisation |    None    |   None   |     0      |    0.5     |
|       1        |    0.25    |  droite  |    0.25    |    0.5     |
|       2        |   0.375    |  droite  |   0.375    |    0.5     |
|       3        |   0.4375   |  gauche  |   0.375    |   0.4375   |
|       4        |  0.40625   |  gauche  |   0.375    |  0.40625   |
|       5        |  0.390625  |  gauche  |   0.375    |  0.390625  |
|       6        | 0.3828125  |  droite  | 0.3828125  |  0.390625  |
|       7        | 0.38671875 |  gauche  | 0.3828125  | 0.38671875 |
|       8        |0.384765625 |  gauche  | 0.3828125  |0.384765625 |
In [45]:
dicho(f, 0, 0.5, 0.002, 0)
Out[45]:
$$\left ( 0.3828125, \quad 0.384765625, \quad 8\right )$$