Solution du TD 1
Exercices sur papier
1. On considère la suite définie par la récurrence a) Calculer pour .
In [1]: # Puisqu'on a la machine sous la main, autant l'utiliser pour vérifier nos calculs ! def u(n):
if n<1: return 0
else: return u(n-1)+2*n-1
print ([u(n) for n in range(7)])
b) Deviner une formule pour . Manifestement,
c) Prouver la formule par récurrence.
Elle est vraie pour . Si on la suppose vraie jusqu'au rang , alors, elle est donc encore vraie au rang , CQFD.
d) Exprimer comme une somme (sans récurrence) et imaginer un dessin rendant la solution évidente.
Puisque s'obtient à partir de en lui ajoutant une fonction de seul, , on a
autrement dit,
est la somme des premiers nombres impairs.
Pourquoi cette somme vaut-elle ? C'est l'aire d'un carré de côté , qu'on peut découper ainsi :
2. Mêmes questions pour les sommes alternées
a) Calculer pour n≤6.
In [2]: def S(n):
return sum([((-1)**(n-k))*k**2 for k in range(1,n+1)]) print ([S(n) for n in range(1,7)])
b) Deviner une formule pour .
Il semble bien que .
On teste sur les cas suivants avant de se lancer : ( )un
= + 2n− 1, = 0.
un un−1 u0 un n≤ 6
un
u(n) =n2.
n= 0 n− 1
= (n− 1 + 2n− 1 = − 2n+ 1 + 2n− 1 = ,
un )2 n2 n2
n
un
un un−1 n f(n) = 2n− 1
= +f(n) = +f(n− 1) +f(n) = … = +f(1) +f(2) + ⋯ +f(n) = (2i− 1)
un un−1 un−2 u0 ∑
i=1 n
= 1 + 3 + 5 + ⋯ + (2n− 1) un
n
n2 n
∗ + o x
∙
∗ + o x x
∗ + o o o
∗ + + + +
∗
∗
∗
∗
∗
= 1 + 3 + 5 + 7 + 9 52
= (−1 .
Sn ∑
k=1 n
)n−kk2
Sn
Sn
21 = 3 × 7, 15 = 5 × 3, 10 = 2 × 5, 6 = 2 × 3, ⋯
= Sn
n(n+1) 2
[0, 1, 4, 9, 16, 25, 36]
[1, 3, 6, 10, 15, 21]
In [3]: print ([S(n) for n in range(7,11)])
Ça a l'air bon, alors on y va. On a bien . Si on suppose la formule vraie jusqu'au rang , on a (attention aux signes !)
elle est donc encore vraie au rang suivant, est c'est démontré.
d) Exprimer comme une somme (sans récurrence) ? C'est comme ça qu'elle est définie, à la question précédente, on a fait l'inverse : transformer la somme en récurrence.
Imaginer un dessin rendant la solution évidente.
3. Soit la suite définie par la récurrence a) Calculer les 6 premiers termes.
In [4]: def v(n):
if n<1: return 1 return 3*v(n-1)-1
print ([v(n) for n in range(7)])
b) Trouver une expression de la série génératrice
On a
Donc,
et
c) En déduire la valeur de . On décompose en éléments simples :
car le degré du numérateur est inférieur à celui du dénominateur, et ce dernier n'a que des racines simples. En multipliant par et en posant , on trouve . En multipliant pas et en posant , on trouve .
On peut vérifier avec sympy :
In [5]: from sympy import * var('x')
= 1 = 1(1 + 1)/2
S1 n− 1
= − + = − + = − + n+ = ,
Sn Sn−1 n2 (n− 1)n
2 n2 1
2n2 1
2 n2 n(n+ 1) 2
Sn
=
∗
∗
∗
∗
∗
∗
∗
∗
∗
∗ ∗
∗
∗
∗
∗
∗ ∗
∗
∗
∗
∗
∗
∗
∗
∗
∗
∗
∗
∗
∗
− + − + = 1 + 2 + 3 + 4 + 5 =
52 42 32 22 12 5(5 + 1)
2
( )vn
= 3 − 1, = 1.
vn vn−1 v0
V(x) =∑ .
n≥0
vnxn
V(x) =v0+∑(3 − 1) = 1 + 3x −
n≥1
vn−1 xn ∑
n≥1
vn−1xn−1 ∑
n≥1
xn
= 1 + 3xV(x) − x . 1 −x (1 − 3x)V(x) = 1 − x =
1 −x
1 − 2x 1 −x V(x) = 1 − 2x .
(1 −x)(1 − 3x)
vn
V(x) = 1 − 2x = +
(1 −x)(1 − 3x) a 1 −x
b 1 − 3x
1 −x x= 1
a=12 1 − 3x x= 13 b= 12
[28, 36, 45, 55]
[1, 2, 5, 14, 41, 122, 365]
Out[5]: x
On a donc finalement
et ainsi,
Vérifions :
In [8]: print([(3**n+1)//2 for n in range(7)])
Exercices sur machine
4. Soit la suite définie par
a) Trouver une expression de la série génératrice de . Il faut tout de même faire ce calcul sur papier :
donc
La factorisation du membre droit de cette égalité était évidente, mais le polynôme en facteur de à gauche se factorise aussi : In [9]: factor(1-2*x-x**2+2*x**3)
Il nous reste donc, après simplification par , soit
On calcule la décomposition avec sympy : In [10]: U = (1-x)/((1+x)*(1-2*x))
apart(U)
On a donc (attention aux signes en recopiant !)
d'où
soit
. Vérifions :
In [11]: series(U,x,0,10)
In [11]: print [(2**n+2*(-1)**n)/3 for n in range(10)]
V(x) = 1 + (3x =
2∑
n≥0
xn 1 2∑
n≥0
)n ∑
n≥0
+ 1 3n
2 xn
= .
vn 3n+ 1 2
( )un
= 2 + − 2 , = 1, = 0, = 2.
un un−1 un−2 un−3 u0 u1 u2 U(x) ( )un
U(x) =u0+u1x+u2x2+∑(2 + − 2 ) = 1 + 2 + 2x(U(x) − 1 − 0x) + (U(x) − 1) − 2 U(x)
n≥3
un−1 un−2 un−3 xn x2 x2 x3
= 1 − 2x+x2+ (2x+x2− 2 )U(x)x3 (1 − 2x−x2+ 2 )Ux3 (x) = (1 −x)2
U(x)
1 −x
(1 +x)(1 − 2x)U(x) = (1 −x) U(x) = 1 −x
(1 +x)(1 − 2x)
U(x) = 1 + = (2x + (−x
3 1 1 − 2x
2 3
1 1 +x
1 3∑
n≥0
)n 2 3∑
n≥0
)n
U(x) =∑
n≥0
+ (−1 2 2n )n
3
= ( + (−1 )
un 2
3 2n−1 )n [1, 2, 5, 14, 41, 122, 365]
Out[9]: (x− 1) (x+ 1) (2x− 1)
Out[10]:
− 1 +
3 (2x− 1) 2 3 (x+ 1)
Out[11]: 1 + 2x2+ 2x3+ 6x4+ 10x5+ 22x6+ 42x7+ 86x8+ 170x9+O(x10)
[1, 0, 2, 2, 6, 10, 22, 42, 86, 170]
In [12]: def u(n):
if n==0: return 1 elif n==1: return 0 elif n==2: return 2
else: return 2*u(n-1)+u(n-2)-2*u(n-3)
print ([u(n) for n in range(10)])
5. On considère la suite définie par
Il n'existe pas de méthode générale pour résoudre ce genre de récurrence.
a) Programmer la suite avec . In [13]: var('a b')
def q(n):
if n==0: return a if n==1: return b
return simplify((1+q(n-1))/q(n-2)) print ([q(n) for n in range(8)])
On voit que la suite est périodique : . Donc . Il n'y a rien de plus à dire ...
6. Soit la somme alternéee
a) Programmer la fonction avec (utiliser ).
In [14]: def A(n):
return sum([(-1)**k*Rational((2*k+1)**3,(2*k+1)**4+4) for k in range(n+1)]) print ([A(n) for n in range(12)])
On voit que le numérateur doit être . Pour le dénominateur, si on retranche 1, on voit apparaître c'est
de sorte que
et il semble bien que
On teste :
In [15]: def B(n):
return (-1)**n*Rational(n+1, (2*n+2)**2+1) print ([B(n) for n in range(12)])
Pour prouver la formule, il suffit de vérifier que le terme général de la somme
est bien la différence de deux valeurs consécutives de notre expression conjecturale.
( )qn
= , =a, =b.
qn 1 +qn−1
qn−2 q0 q1
sympy
= , =
u6 u0 u7 u1 un=un mod 6
An
= (−1 .
An ∑
k=0 n
)k (2k+ 1)3 (2k+ 1 + 4)4 A(n) sympy Rational
(−1 (n)n + 1)
4, 16, 36, 64, 100, 144, … , , , , , … 22 42 62 102 122
= (−1 , = (−1 , …
A0 )0 0 + 1
(2(0 + 1) + 1)2 A1 )1 1 + 1 (2(1 + 1) + 1)2
= (−1 .
An )n n+ 1 (2n+ 2 + 1)2
An
= (−1
an )n (2n+ 1)3 (2n+ 1 + 4)4
− Bn Bn−1
[1, 0, 2, 2, 6, 10, 22, 42, 86, 170]
[a, b, (b + 1)/a, (a + b + 1)/(a*b), (a + 1)/b, a, b, (b + 1)/a]
[1/5, -2/17, 3/37, -4/65, 5/101, -6/145, 7/197, -8/257, 9/325, -10/401, 11/485, -12/577]
[1/5, -2/17, 3/37, -4/65, 5/101, -6/145, 7/197, -8/257, 9/325, -10/401, 11/485, -12/577]
In [18]: cc = bb.subs(x,x-1); cc
In [20]: dd = cc+bb
In [24]: # Il y a un bug dans simplify, on décompose le calcul dd.as_numer_denom()
In [25]: list(map(expand,_))
In [26]: [factor(_[0]),factor(_[1]-4)]
Out[18]: x 4x2+ 1
Out[24]: (x*((2*x + 2)**2 + 1) + (x + 1)*(4*x**2 + 1), (4*x**2 + 1)*((2*x + 2)**2 + 1))
Out[25]: [8*x**3 + 12*x**2 + 6*x + 1, 16*x**4 + 32*x**3 + 24*x**2 + 8*x + 5]
Out[26]: [(2*x + 1)**3, (2*x + 1)**4]