<<CheminPackLocaux`

Collège du Sud, Bulle
2-ème année OS PAM

Applications des mathématiques

Calcul numérique
de l'exponentielle et du logarithme
par une méthode élémentaire

Version pour Mathematica
Marcel Délèze, Eugène Pasquier
Edition 2009/2010
www.collegedusud.ch/app/applmaths/

§ 1 Idée de la méthode

La méthode proposée ici est une méthode élémentaire qui est accessible aux élèves de deuxième année de gymnase.
Sur les machines à calculer, on utilise généralement des méthodes plus performantes que celle qui est étudiée ici mais qu'il serait plus long et plus difficile d'expliquer.

§ 1-1 Une propriété typique des fonctions exponentielles et logarithmiques

Idée d'une propriété typique

A titre d'exemple, comparons une suite arithmétique et une suite géométrique

({{0, 1, 2, 3, 4, 5, 6}, {1, 2, 4, 8, 16, 32, 64}})

Dans la suite arithmétique, le moyen terme entre 4 et 6 est donné par la moyenne arithmétique

((4+6)/2)=5

Dans la suite géométrique, le moyen terme correspondant entre 16 et 64 est donné par la moyenne géométrique

(Sqrt[16*64])=(Sqrt[1024])=32

Le passage d'une suite arithmétique à une suite géométrique, complété continûment, conduit à une fonction exponentielle. Dans l'exemple précédent, il s'agit de la fonction f(x) = (2^x). La fonction exponentielle doit donc avoir la propriété
	à la moyenne arithmétique dans l'ensemble de départ
	correspond la moyenne géométrique dans l'ensemble d'arrivée.

Généralisation et formalisation

Considérons une fonction exponentielle avec les nombres p, q dans l'ensemble de départ et f(p), f(q) dans l'ensemble d'arrivée

f(x)=(a^x)                        (fonction exponentielle de base a)
f(p)=(a^p); f(q)=(a^q)
f(((p+q)/2))=(a^((p+q)/2))=((((a^(p+q))))^(1/2))=(Sqrt[(a^(p+q))])=(Sqrt[(a^p) (a^q)])=(Sqrt[f(p) f(q)])

A la moyenne arithmétique de p, q dans l'ensemble de départ correspond la moyenne géométrique de f(p), f(q) dans l'ensemble d'arrivée.

p=1.5`;q=3.9`;
Clear[f];f[x_]:=(2^x);
Plot[f[x],{x,-1,4},Ticks->{{{p,"p"},{((p+q)/2),"\!\(\(p + q\)\/2\)"},{q,"q"}},{{f[p],"f(p)"},{(Sqrt[f[p] f[q]]),"\!\(\*SqrtBox[\(f \((p)\) f \((q)\)\)]\)"},{f[q],"f(q)"}}},AxesOrigin->{0,0},Epilog->{Dashing[{0.02`,0.02`}],Line[{{p,0},{p,f[p]},{0,f[p]}}],Line[{{q,0},{q,f[q]},{0,f[q]}}],Line[{{((p+q)/2),0},{((p+q)/2),f[((p+q)/2)]},{0,f[((p+q)/2)]}}]},ImageSize->{400,300}]

Considérons une fonction logarithmique avec les nombres positifs r, s dans l'ensemble de départ et g(r), g(s) dans l'ensemble d'arrivée

g(x)=(Subscript[log, a])(x)                      (fonction logarithmique de base a)
g(r)=(Subscript[log, a])(r); g(s)=(Subscript[log, a])(s)
g((Sqrt[r s]))=(Subscript[log, a])((((r s))^(1/2)))=(1/2)(Subscript[log, a])(r s)=(1/2)( (Subscript[log, a])(r)+(Subscript[log, a])(s))=((g(r)+g(s))/2)

A la moyenne géométrique de r, s dans l'ensemble de départ correspond la moyenne arithmétique de g(r), g(s) dans l'ensemble d'arrivée.

r=1.3`;s=3.9`;
Clear[g];g[x_]:=Log[x];
Plot[g[x],{x,0.5`,4},Ticks->{{{r,"r"},{(Sqrt[r s]),"\!\(\@\(r s\)\)"},{s,"s"}},{{g[r],"g(r)"},{(1/2) (g[r]+g[s]),"\!\(\*FractionBox[\(g \((r)\)  +  g \((s)\)\), \(2\)]\)"},{g[s],"g(s)"}}},AxesOrigin->{0,0},Epilog->{Dashing[{0.02`,0.02`}],Line[{{r,0},{r,g[r]},{0,g[r]}}],Line[{{s,0},{s,g[s]},{0,g[s]}}],Line[{{(Sqrt[r s]),0},{(Sqrt[r s]),g[(Sqrt[r s])]},{0,g[(Sqrt[r s])]}}]},ImageSize->{400,300}]

§ 1-2 La méthode d'Ozanam (1685)

On suppose que le calculateur, en plus des quatre opérations ( +, -, *, / ), sait extraire les racines carrées.
La méthode suivante a été proposée par le mathématicien Ozanam en 1685.

Exemple 1

Soit par exemple à calculer          (10^0.7)
On part de l'encadrement initial :

0 < 0.7 < 1   ⟹   1< (10^0.7) < 10

Puisque 0.7 est à droite de la moyenne arithmétique de {0, 1} sur l'axe horizontal,
alors (10^0.7) est en-dessus de la moyenne géométrique de {1, 10} sur l'axe vertical :

((0+1)/2)=0.5 < 0.7 < 1   ⟹   (Sqrt[1*10])≃3.16228< (10^0.7) < 10

Puisque 0.7 est à gauche de la moyenne arithmétique de {0.5, 1} sur l'axe horizontal,
alors (10^0.7) est au-dessous de la moyenne géométrique de {3.16228, 10} sur l'axe vertical :

0.5 < 0.7 < ((0.5+1)/2)=0.75   ⟹   3.16228< (10^0.7) < (Sqrt[3.16228*10])≃5.62341

((0.5+0.75)/2)=0.625< 0.7 < 0.75   
				                                  ⟹   (Sqrt[3.16228*5.62341])≃4.21697< (10^0.7) < 5.62341

Exercice  1-2-1

En poursuivant  le calcul précédent, calculez (10^0.7) à la précision de ± 0.1

Attention : prenez garde de ne pas utiliser les fonctions exponentielles et logarithmiques de votre machine mais seulement la racine carrée et les 4 opérations (+, -, *, /).

Exemple 2

Soit par exemple à calculer             Log(3)= (Subscript[log, 10])(3)
On part de l'encadrement initial :

1 < 3 < 10   ⟹   0< Log(3) < 1

Puisque 3 est à gauche de la moyenne géométrique de {1, 10} sur l'axe horizontal,
alors Log(3) est en-dessous de la moyenne arithmétique de {0, 1} sur l'axe vertical :

1 < 3 < (Sqrt[1*10])≃3.162   ⟹   0< Log(3) < ((0+1)/2)=0.5

Puisque 3 est à droite de la moyenne géométrique de {1, 3.162} sur l'axe horizontal,
alors Log(3) est au-dessus de la moyenne arithmétique de {0, 0.5} sur l'axe vertical :

(Sqrt[1*3.162 ])≃1.778< 3 < 3.162   ⟹  ((0+0.5)/2)=0.25< Log(3) < 0.5

(Sqrt[1.778*3.162 ])≃2.371< 3 < 3.162   ⟹  ((0.25+0.5)/2)=0.375< Log(3) < 0.5

Exercice 1-2-2

En poursuivant  le calcul précédent, calculez       Log(3)        à la précision de ± 0.01

Attention : prenez garde de ne pas utiliser les fonctions exponentielles et logarithmiques de votre machine mais seulement la racine carrée et les 4 opérations (+, -, *, /).

Exercice 1-2-3

Calculez        (2^π)       à  la précision de ±0.05

Exercice 1-2-4

Calculez      Log(2000)        à la précision de ± 0.01

§ 2 Réduction à un intervalle de référence

Le langage Mathematica permet de définir des règles de transformation. Lorsque la règle de transformation est conditionnelle, elle ne sera appliquée que si la condition est vraie.

§ 2-1 Fonction exponentielle de base a > 1

Notion d'intervalle de référence

Soit par exemple à calculer        (10^3.7)       et       (10^(-2.4))
On peut ramener l'exposant dans l'intervalle [0; 1[ :

(10^3.7)=(10^(3+0.7))=(10^3)*(10^0.7)=1000*(10^0.7)
(10^(-2.4))=(10^(-3+0.6))=(10^(-3))*(10^0.6)=(1/1000)*(10^0.6)

En d'autres termes, il suffit de savoir calculer (10^z)   pour z ϵ [0; 1[.
L'avantage de cette réduction, c'est qu'on peut toujours partir de l'encadrement initial

0≤z<1    ⟹   1 ≤ (10^z) < 10

Algorithme de réduction à l'intervalle de référence

La méthode d'Ozanam nécessite de déterminer un encadrement initial.
Supposons temporairement que la base de l'exponentielle vérifie      a > 1.
La fonction exponentielle    f(x)=(a^x)    est alors strictement croissante.
Choisissons l'intervalle de référence suivant:
	dans l'ensemble de départ 	0 ≤ x < 1
	dans l'ensemble d'arrivée	1 ≤ (a^x) < a.
Pour tout calcul effectué dans cet intervalle de référence, l'encadrement initial est évident.

Les propriétés des fonctions exponentielles nous permettent de nous ramener à cet intervalle de référence.

f(x-1)=(a^(x-1))=(a^x)(a^(-1))= f(x) (1/a)           ⟹              f(x)=a f(x-1)
f(x+1)=(a^(x+1))=(a^x)(a^1)=f(x) a                  ⟹              f(x)=((f(x+1))/a)

Ces relations sont à la base de l'algorithme suivant:
	tant que x≥1, on applique la première règle, par exemple

(10^3.4)=10*(10^2.4)=100*(10^1.4)=1000*(10^0.4)

tant que x<0, on applique la deuxième règle, par exemple

(10^(-2.4))=((10^(-1.4))/10)=((10^(-0.4))/100)=((10^(+0.6))/1000)

Programme de réduction à l'intervalle de référence

En Mathematica, l'algorithme précédent se formule de la manière suivante :

Clear[expon];
expon[a_,x_]:=a expon[a,x-1]/; x≥ 1;
expon[a_,x_]:= ((expon[a, x+1])/a)/; x<0

?expon

Le symbole /; se lit "à la condition que".
Il s'agit de règles de transformations qui sont appliquées tant que la condition est vraie.
La règle peut donc être appliquée plusieurs fois.
Il faudra veiller à ce que chaque règle de transformation ne puisse s'appliquer indéfiniment !
Voici des exemples de leur effet :

expon[10,3.4]

expon[10,-3.4]

Exercice 2-1

Calculez      (5^π)      avec la méthode numérique suivante :
a)	Montrez qu'il suffit de savoir calculer (5^z) pour un z ϵ [0; 1[.
b)	Pour cette valeur de z, calculez (5^z) en effectuant 5 pas de la méthode d'Ozanam.
c)	Donnez la valeur finale de (5^π) avec la précision correspondante.

§ 2-2 Fonction logarithmique de base a > 1

Notion d'intervalle de référence

Soit par exemple à calculer        Log(357)       et       Log(0.073)
On peut ramener l'argument dans l'intervalle [1; 10[ :

Log(357)=Log(10*35.7)=Log(10)+Log(35.7)=1+Log(35.7)=1+Log(10*3.57)
						=1+Log(10)+Log(3.57)=2+Log(3.57)
Log(0.073)=Log((10^(-1))*0.73)=-1+Log(0.73)=-2+Log(7.3)

En d'autres termes, il suffit de savoir calculer Log(z)   pour z ϵ [1; 10[.
L'avantage de cette réduction, c'est qu'on peut toujours partir de l'encadrement initial

1≤z<10   ⟹   0≤ Log(z) < 1

Algorithme de réduction à l'intervalle de référence

Supposons temporairement que la base du logarithme vérifie      a > 1.
La fonction logarithmique       g(x)=(Subscript[log, a])(x)      est alors strictement croissante.
Choisissons l'intervalle de référence suivant:
	dans l'ensemble de départ 	1 ≤ x < a
	dans l'ensemble d'arrivée	0 ≤ (Subscript[log, a])(x) < 1.
Pour tout calcul effectué dans cet intervalle de référence, l'encadrement initial est évident.

Exercice 2-2-1

Calculez       (Subscript[log, 2])(10)       avec la méthode numérique suivante :
a)	Montrez qu'il suffit de savoir calculer (Subscript[log, 2])(z) pour un z ϵ [1; 2[.
b)	Pour cette valeur de z, calculez (Subscript[log, 2])(z) en effectuant 5 pas de la méthode d'Ozanam.
c)	Donnez la valeur finale de (Subscript[log, 2])(10) avec la précision correspondante.

Exercice 2-2-2

a)	Ecrivez les propriétés des fonctions logarithmiques qui permettent de se ramener à
	l'intervalle [1; a[.

b)	En Mathematica, déclarez des règles de transformation pour ramener le calcul de la fonction
	logarithme[a, x]           à l'intervalle [1; a[.

c)	Appliquez les règles de transformation aux exemples 
	logarithme[10, 3457]      et            logarithme[10, (1/3457)]

§ 3 Calcul numérique de l'exponentielle et du logarithme

§ 3-1 Calcul de l'exponentielle de base a > 1

Il nous reste encore le travail suivant à effectuer
	calculer l'exponentielle d'un nombre situé dans l'intervalle de référence
	au moyen de la méthode d'Ozanam.
Il s'agit essentiellement de traduire les idées du § 1 en un algorithme, puis en un programme Mathematica.

A chaque étape, on connaît un encadrement sur l'axe des abscisses p, q (p ≤ x < q)
et un encadrement sur l'axe des ordonnées fp, fq.
A tout moment, tous les nombres   x, p, q, fp, fq   ont des valeurs numériques connues.
Par contre, le nombre f(x) est inconnu mais on sait que    fp ≤ f(x) < fq.

Au départ, on a {p, q, fp, fq} = {0, 1, 1, a}.
Une étape du calcul consiste à passer de l'encadrement par les quatre nombres {p, q, fp, fq} à l'encadrement suivant c'est-à-dire à définir le successeur de {p, q, fp, fq}.

p=1.5`;q=3.9`;
Clear[f];f[x_]:=(2^x);
Show[GraphicsRow[{Plot[f[x],{x,-1,4},Ticks->{{{p,"p"},{2,"x"},{((p+q)/2),"\!\(\(p + q\)\/2\)"},{q,"q"}},{{f[p],"f(p)"},{f[2],"f(x)"},{(Sqrt[f[p] f[q]]),"\!\(\*SqrtBox[\(f \((p)\) f \((q)\)\)]\)"},{f[q],"f(q)"}}},AxesOrigin->{0,0},Epilog->{Dashing[{0.02`,0.02`}],Line[{{p,0},{p,f[p]},{0,f[p]}}],Line[{{q,0},{q,f[q]},{0,f[q]}}],Line[{{2,0},{2,f[2]},{0,f[2]}}],Line[{{((p+q)/2),0},{((p+q)/2),f[((p+q)/2)]},{0,f[((p+q)/2)]}}]}],Plot[f[x],{x,-1,4},Ticks->{{{p,"p"},{((p+q)/2),"\!\(\(p + q\)\/2\)"},{3.5`,"x"},{q,"q"}},{{f[p],"f(p)"},{(Sqrt[f[p] f[q]]),"\!\(\*SqrtBox[\(f \((p)\) f \((q)\)\)]\)"},{f[3.5`],"f(x)"},{f[q],"f(q)"}}},AxesOrigin->{0,0},Epilog->{Dashing[{0.02`,0.02`}],Line[{{p,0},{p,f[p]},{0,f[p]}}],Line[{{q,0},{q,f[q]},{0,f[q]}}],Line[{{3.5`,0},{3.5`,f[3.5`]},{0,f[3.5`]}}],Line[{{((p+q)/2),0},{((p+q)/2),f[((p+q)/2)]},{0,f[((p+q)/2)]}}]}]},ImageSize->{550,200}]]

Si       x<((p+q)/2), alors le nouvel encadrement sera                   {p, ((p+q)/2), fp, (Sqrt[fp*fq])}
				                                     (voir fig. de gauche)
sinon le nouvel encadrement sera                                                       {((p+q)/2), q, (Sqrt[fp*fq]),fq}
                                                   (voir fig. de droite).

Ici, le successeur de {p, q, fp, fq} dépend de x; c'est pourquoi nous l'appelons successeur[x].

Clear[successeur];
successeur[x_][{p_,q_,fp_,fq_}]:=If[x<((p+q)/2),N[{p,((p+q)/2),fp,(Sqrt[fp*fq])}],
		N[{((p+q)/2),q,(Sqrt[fp*fq]),fq}]]

Pour calculer    (10^0.7),  effectuons 18 itérations (comparez avec l'exercice 1-2-1):

TableForm[NestList[successeur[0.7],{0,1,1,10},18], TableHeadings->{None,{"p","q", "f(p)","f(q)"}}]

Le calcul peut être poursuivi tant que     p < q  et  fp < fq.
Un critère d'arrêt du calcul est donc    p ≥ q  ou  fp ≥ fq.

Clear[arret];
arret[{p1_,q1_,fp1_,fq1_},{p2_, q2_, fp2_, fq2_}]:=p2≥q2 ∨ fp2≥fq2

Comme valeur de la fonction, nous extrayons la dernière valeur      Last[{p, q, fp, fq}] = fq

expon[a_,x_]:=Last[FixedPoint[successeur[x],{0,1,1,a}, SameTest->arret]]

?expon

expon[10,2.3]

Clear[erreur];
erreur[a_, x_]:=expon[a,x]-(a^x)

erreur[10,2.3]

§ 3-2 Calcul du logarithme de base a > 1

Exercice 3-2

a)	Ouvrez la solution de l'exercice 2-2-2 et poursuivez le calcul commencé comme suit.
b)	Ecrivez l'algorithme pour calculer la fonction logarithme dans l'intervalle de référence
	au moyen de la méthode d'Ozanam.
c)	Ecrivez le programme Mathematica pour calculer la fonction    logarithme[a, x].
d)	Testez le programme. Comparez avec la fonction    Log[a,x].

§ 3-3 Calcul de l'exponentielle de base a > 0

Exercice 3-3

Définissez la fonction    expon[a, x]      pour n'importe quelle base a > 0.
Testez le programme.

Indications
	Dans le cas a = 1, on a       expon[1, x] = 1
	Dans le cas a > 1, le cas a déjà été traité dans le § 3-1.
	Dans le cas 0 < a < 1, on peut se ramener au cas précédent avec la base (1/a) > 1.

expon[(1/a),x]=((((1/a)))^x)=(1/(a^x))=(1/(expon[a,x]))
⟹    expon[a, x]=(1/(expon[(1/a),x]))

§ 3-4 Calcul du logarithme de base a > 0 et a ≠ 1

Exercice 3-4

Définissez la fonction    logarithme[a, x]      pour n'importe quelle base a.
Testez le programme.

Indications
	Dans le cas a = 1,        logarithme[1, x]       n'est pas défini.
	Dans le cas a > 1, le cas a déjà été traité dans l'exercice 3-2.
	Dans le cas 0 < a < 1, on peut se ramener au cas précédent avec la base (1/a) > 1.

logarithme[(1/a),x]=((ln(x))/(ln((1/a))))=((ln(x))/(-ln(a)))=-((ln(x))/(ln(a)))=-logarithme[a,x]
⟹    logarithme[a, x]=-logarithme[(1/a),x]

Notion de programme

Nous avons écrit deux programmes :
	l'un pour calculer (a^x)
	l'autre pour calculer (Subscript[log, a])(x).

Pour écrire un programme, il est recommandé de passer par les étapes suivantes :
   1.	idée d'une méthode
   	nous avons d'abord résolu le problème à la main;
   	si on ne sait pas faire le calcul soi-même, on ne peut pas "expliquer" à
   	l'ordinateur comment faire;
   2.	algorithme
   	pour automatiser le calcul, nous avons formalisé la méthode et écrit
   	l'algorithme en termes mathématiques;
   3.	programme
   	nous avons traduit l'algorithme dans le langage de programmation Mathematica;
   	le résultat s'appelle un programme;
   4.	tests
   	le programme doit encore être testé; le cas échéant, il devra être corrigé.

§ 4 Prolongements (facultatif)

§ 4-1 Calcul du cosinus

Proposition

Pour tout a, b ϵ [0; π], on a

cos(((a+b)/2))=(1/2)((Sqrt[(1+cos(a)) (1+cos(b))])-(Sqrt[(1-cos(a)) (1-cos(b))]))

Démonstration

D'après le formulaire (voir trigonométrie), on a

cos(((a+b)/2))=cos((a/2)+(b/2))=cos((a/2))cos((b/2))-sin((a/2))sin((b/2))

D'après le formulaire (voir trigonométrie), on a

(((cos((a/2))))^2)=((1+cos(a))/2)
(((sin((a/2))))^2)=((1-cos(a))/2)

Pour a ϵ [0; π], on a         (a/2) ϵ [0; (π/2)]          donc          cos((a/2)) ≥ 0                et            sin((a/2)) ≥ 0         d'où

cos((a/2))=(Sqrt[((1+cos(a))/2)])
sin((a/2))=(Sqrt[((1-cos(a))/2)])
cos(((a+b)/2))=(Sqrt[((1+cos(a))/2)])(Sqrt[((1+cos(b))/2)])-(Sqrt[((1-cos(a))/2)])(Sqrt[((1-cos(b))/2)])
=((Sqrt[(1+cos(a)) (1+cos(b))])/2)-((Sqrt[(1-cos(a)) (1-cos(b))])/2)

Une méthode de calcul de cos(x)

On peut adapter la méthode d'Ozanam au calcul de cos(x) pour x ϵ [0; π].

a=(π/8);b=((2 π)/3);m=Style["\!\(\*FractionBox[\(\*SqrtBox[\(\((1 + ca)\) \((1 + cb)\)\)] - \*SqrtBox[\(\((1 - ca)\) \((1 - cb)\)\)]\), \(2\)]\)",FontSize->9];
Plot[Cos[x],{x,0,π},Epilog->{Dashing[{0.01`,0.01`}],Line[{{a,0},{a,Cos[a]},{0,Cos[a]}}],Line[{{b,0},{b,Cos[b]},{0,Cos[b]}}],Line[{{((a+b)/2),0},{((a+b)/2),Cos[((a+b)/2)]},{0,Cos[((a+b)/2)]}}]},Ticks->{{{a,"a"},{((a+b)/2),"\!\(\*FractionBox[\(a + b\), \(2\)]\)"},{b,"b"}},{{Cos[a],"ca"},{Cos[((a+b)/2)],m},{Cos[b],"cb"}}},PlotRange->All,ImageSize->{500,200}]

Tout  encadrement est représenté par la liste                  {a, b, cb, ca}.
La valeur de démarrage est                                                  {0, π, -1, 1}.
Si       x<((a+b)/2)          alors     le successeur est                     {a, ((a+b)/2), (((Sqrt[(1+ca) (1+cb)])-(Sqrt[(1-ca) (1-cb)]))/2), ca}
                                 sinon     le successeur est                     {((a+b)/2), b, cb, (((Sqrt[(1+ca) (1+cb)])-(Sqrt[(1-ca) (1-cb)]))/2)}

Exercice 4 - 1 (facultatif)

Pour x ϵ [0; π], écrivez un programme pour calculer cos(x).