Durée : 1 heure
Corrigé
On rappelle que l’on a : ( )
0( ) ( )
2, cos 1
2 !
n n
n
x x x
n
+∞
=
∀ ∈ = ∑ − .
L’objectif principal de cet exercice est d’écrire un programme Python permettant d’obtenir une valeur approchée de cos ( ) x pour certaines valeurs de x à l’aide du développement précédent.
Pour tout x réel, on pose : u
n( ) ( ) ( ) x = − 1
n2 x n
2n! , ( )
0( ) ( )
21 2 !
n k k n
k
S x x
=
k
= ∑ − et
( ) cos ( ) ( )
n n
R x = x − S x .
1. Montrer que pour tout réel de l’intervalle I = − ⎡ ⎣ 2 ; 2 ⎤ ⎦ la série ∑ u
n( ) x vérifie le critère spécial des séries alternées. En déduire : ( ) ( )
2 2
cos 2 2 !
n n
x S x x
n
− ≤
++ .
Soit x fixé dans I = − ⎡ ⎣ 2 ; 2 ⎤ ⎦ .
On a immédiatement, l’exposant de x étant pair :
( )
2
, 0
2 ! x
nn n
∀ ∈ ≥ et donc
( ) ( ) ( ) ( ) ( ) ( ( ( ) ) ) ( )
( )
( )
( )
2 1 2 1
2 2
1
,
11 1 0
2 ! 2 1 ! 2 ! 2 1 !
n n
n n
n n
n n
x x x x
n u x u x
n n n n
+ +
+
∀ ∈ ×
+= − × − = − × ≤
+ + .
La série ∑ ( ) ( ) − 1
n2 x
2n
n! est bien une série alternée.
On a immédiatement, : ∀ ∈ n , u
n( ) ( ) ( ) ( ) x = − 1
n2 x n
2n! = 2 x n
2n! puis, pour x non nul,
( ) ( )
( )
( )
( )
( ) ( ) ( )
( )( )
2 1
2 2 2
1
2 2
2 1 ! 2 !
, 2 2 ! 2 2 2 1
2 !
n
n n
n n
n
x
u x n x n x
n u x x n x n n
n
+
+
+
+∀ ∈ = = × =
+ + + .
Or :
( )( ) ( ) ( )
2 2 2
, 2 1
2 2 2 1 2 0 2 2 0 1 2 2
x x x
n n n
∀ ∈ ≤ = ≤ =
+ + × + × × + .
Ainsi, la suite ( u
n( ) x )n∈ est décroissante.
Si x = 0 , la suite ( u
n( ) 0 )n∈ est constante à partir de n = 1 et donc décroissante…
Pour montrer enfin que l’on a
nlim u
n( ) x 0
→+∞
= lorsque x est non nul (c’est immédiat lorsque x l’est), on peut utiliser la formule de Stirling.
On a : ( ) 2 n ! 2 2 n 2 n
2n2 n 2 n
2ne e
π π
+∞
⎛ ⎞ ⎛ ⎞
× × ⎜ ⎝ ⎟ ⎠ = × ⎜ ⎝ ⎟ ⎠
∼ et il vient alors :
( ) ( ) 2
2!
22
21 2
22
n n n
n n
x x ex
u x
n n n n
n e
π π
+∞
⎛ ⎞
= ×⎜ ⎟ ⎛ ⎝ ⎞ ⎠ = ×⎜ ⎟ ⎝ ⎠
∼ .
Mais :
( ) ( )
( ) ( )
1
21 1
ln ln ln 2 ln 2 ln 2
2 2 2
1 ln 1 ln
2 ln ln 2
4 4
ex
nn n ex n n
n n
n n ex n
n n
π π
π
⎡ × ⎛ ⎞ ⎤ = − − + × − ×
⎢ ⎜ ⎝ ⎟ ⎠ ⎥
⎢ ⎥
⎣ ⎦
⎛ ⎞
= − × ⎜ ⎝ + − + ⎟ ⎠
On a : 1 ln 1 ln
lim 0
4 4
n
n
n n
π
→+∞
⎛ + ⎞ =
⎜ ⎟
⎝ ⎠ et donc lim 1 ln 1 ln ln ( ) ln 2 ( )
4 4
n
n ex n
n n
π
→+∞
⎛ + − + ⎞ = +∞
⎜ ⎟
⎝ ⎠ .
Alors : lim 2 1 ln 1 ln ln ( ) ln 2 ( ) lim ln 1
24 4 2
n
n n
n ex
n ex n
n n n n
π
π
→+∞ →+∞
⎡ ⎤
⎡ − × ⎛ ⎜ + − + ⎞ ⎟ ⎤ = ⎢ × ⎛ ⎜ ⎞ ⎟ ⎥ = −∞
⎢ ⎝ ⎠ ⎥ ⎝ ⎠
⎣ ⎦ ⎢ ⎣ ⎥ ⎦ et
finalement : lim 1
2lim ( ) 0
2
n
n n n
ex u x
n n π
→+∞ →+∞
⎡ × ⎛ ⎞ ⎤ = =
⎢ ⎜ ⎝ ⎟ ⎠ ⎥
⎢ ⎥
⎣ ⎦ .
Pour tout réel x de l’intervalle I = − ⎡ ⎣ 2 ; 2 ⎤ ⎦ , la série ∑ u
n( ) x vérifie le critère spécial des séries alternées.
On a alors la majoration classique : R
n( ) x ≤ u
n+1( ) x , c’est-à-dire :
( ) ( ) ( ( ( ) ) ) ( )
2 1 2 2
cos 2 1 ! 2 2 !
n n
n
x x
x S x
n n
+ +
− ≤ =
+ +
( ) ( ) ( )
2 2
2 ; 2 , , cos
2 2 !
n n
x n x S x x
n
⎡ ⎤
+∀ ∈ − ⎣ ⎦ ∀ ∈ − ≤ +
2. Ecrire une fonction Python RangMini qui calcule le plus petit entier naturel n tel que
( )
2
2 ! x
nn ≤ ε où ε est un réel strictement positif fixé.
La fonction RangMini recevra comme argument une variable x, correspondant au réel x, et une variable epsilon correspondant au réel ε .
Les factorielles seront obtenues via une fonction Python Fact (à écrire).
On a d’abord :
def Fact(n):
if n==0:
return(1) else:
return(n*Fact(n-1))
Pour la fonction RangMini, on va calculer
( )
2
2 ! x
nn pour des valeurs successives de n (la variable correspondante sera incrémentée à chaque itération) tant que la condition
( )
2
2 ! 0 x
nn > est vérifée. La dernière valeur de n devra être retournée. On peut donc considérer le code suivant :
def RangMini(x,epsilon):
n = 0
while x**(2*n)/Fact(2*n) > epsilon:
n += 1 return(n)
Le principe du calcul de l’approximation de cos ( ) x pour tout réel x de l’intervalle I est alors :
• On fixe/demande la précision souhaitée (réel ε ).
• On détermine le plus petit entier n tel que
( )
2
2 ! x
nn ≤ ε .
• On calcule S
n−1( ) x qui est une valeur approchée de cos ( ) x à ε près.
3. Ecrire une fonction Python EvalSommePartielle qui recevra comme argument une variable x, correspondant au réel x, et une variable n, correspondant à un entier n et évaluera S
n( ) x (vous écrirez et utiliserez une fonction récursive PolyHorner mettant en œuvre la méthode de Horner pour l’évaluation des polynômes).
Pour les détails de la mise en œuvre de la méthode de Horner on se réfèrera au cours.
Nous proposons le code suivant :
def PolyHorner(L,x):
if len(L)==1:
return(L[0]) else:
L[-2] += L[-1]*x del L[-1]
return(PolyHorner(L,x))
L’évaluation de ( )
0( ) ( )
21 2 !
n k k n
k
S x x
=
k
= ∑ − , c’est-à-dire l’évaluation du polynôme
( ) ( )
0
1 2 !
n k
k k
k X
=
∑ − au point x
2, consiste alors à appeler la fonction précédente avec la liste des coefficients ( )
( ) 2 1 !
k
k
− . Dans un premier temps, on construit donc cette liste puis on appelle la fonction PolyHorner. D’où le code possible suivant :
def EvalSommePartielle(x,n):
L = []
for i in range(n+1):
L.append((-1)**i/Fact(2*i)) return(PolyHorner(L,x))
Remarque : la liste L peut également être définie comme suit :
L = [(-1)**i/Fact(2*i) for i in range(n+1)]
Ainsi, on peut aller jusqu’à écrire la fonction de façon très compacte : def EvalSommePartielle(x,n):
return(PolyHorner([(-1)**i/Fact(2*i) for i in range(n+1)],x))
4. Ecrire enfin une fonction Python CosApprox qui recevra comme argument une variable x correspondant au réel x de l’intervalle I et une variable epsilon, correspondant au réel
ε , et qui renverra une valeur approchée de cos ( ) x à ε près.
Le contenu de la fonction CosApprox comporte deux étapes principales :
• La détermination, grâce à la fonction RangMini, du plus petit indice n tel que
( )
2
2 ! x
nn ≤ ε .
• Calcul de la somme partielle S
n−1( ) x (rappelons que nous avons :
( ) ( )
21
2 !
n n
S x x
n ε
−
< ≤ ).
D’où le code possible :
def CosApprox(x,epsilon):
return(EvalSommePartielle(x**2, RangMini(x,epsilon)-1))
En définitive, on aura le code complet possible suivant (avec une version « standard » de la fonction EvalSommePartielle) :
def Fact(n):
if n==0:
return(1) else:
return(n*Fact(n-1))
def PolyHorner(L,x):
if len(L)==1:
return(L[0]) else:
L[-2] += L[-1]*x del L[-1]
return(PolyHorner(L,x))
def RangMini(x,epsilon):
n = 0
while x**(2*n)/Fact(2*n) > epsilon:
n += 1 return(n)
def EvalSommePartielle(x,n):
L = []
for i in range(n+1):
L.append((-1)**i/Fact(2*i)) return(PolyHorner(L,x))
def CosApprox(x,epsilon):
return(EvalSommePartielle(x**2,RangMini(x,epsilon)-1))
5. Dans cette question on étend l’intervalle de validité de la méthode ci-dessus à J = − [ π π ; ]
.
a. Montrer que l’on a : ( )
( )
2
*, *,
112
n n
u x x
n x
u x
∀ ∈ ∀ ∈
+≤ .
b. En déduire que pour tout x de J, la majoration ( ) ( )
2 2
cos 2 2 !
n n
x S x x
n
− ≤
++ est valable pour tout entier naturel n non nul.
Retour sur la première question.
On a travaillé sur l’intervalle I car il garantissait la décroissance de la suite ( u
n( ) x )n
∈
et nous permettait donc de majorer simplement la différence cos x − S
n( ) x .
Mais idéalement, on souhaiterait pouvoir disposer d’une méthode numérique valable sur un intervalle de longueur 2 π . C’est l’objet de cette dernière question.
a. A la première question, on a vu que l’on avait, pour tout x réel non nul :
( )
( ) ( )( )
2
,
12 2 2 1
n n
u x x
n u x n n
∀ ∈
+≤
+ +
On en déduit : ( )
( ) ( )( )
2 2
*, *,
12 1 2 2 1 1 12
n n
u x x x
n x
u x
∀ ∈ ∀ ∈
+≤ =
× + × + .
( ) ( )
2
*, *,
112
n n
u x x
n x
u x
∀ ∈ ∀ ∈
+≤
b. Pour tout réel x non nul de J, on a :
2 2
12 12 1 x ≤ π <
et la suite ( u
n( ) x )n *
∈
(notez bien l’astérisque) est strictement décroissante. Pour x = 0 elle est constante (et donc décroissante) à partir de n = 1 .
Posons alors : cos ( ) x = + 1 f x ( ) (on a donc : ( )
1( ) ( )
2, 1
2 !
n n
n
x f x x
n
+∞
=
∀ ∈ = ∑ − ) et, pour
tout entier naturel n non nul : ( ) ( ) ( )
2( )
1
1 1 1
2 !
n k k
n n
k
S x x T x
=
k
= + ∑ − = + .
Pour tout réel x de J, on peut appliquer le critère spécial des séries alternées à la série
( )
* n n
u x
∑
∈. On a alors, pour tout entier naturel n non nul, la majoration :
( ) ( ) ( )
2 2
2 2 !
n n
f x T x x
n
− ≤
++ .
En tenant compte de f x ( ) − T x
n( ) = ( cos ( ) x − − 1 ) ( S
n( ) x − = 1 ) cos ( ) x − S
n( ) x , il
vient finalement : ( ) ( ) ( )
2 2
*, J, cos
2 2 !
n n
n x x S x x
n
∀ ∈ ∀ ∈ − ≤
++ .
( ) ( ) ( )
2 2
*, J, cos
2 2 !
n n