TP4 : Approximants de Padé
I. Développement en série
L'équation à résoudre est
| > | deq:=diff(y(x),x)-1-y(x)^2; |
avec
sans utiliser la connaissance de la tangente.
Q1. L'équation linéarisée
| > | eval(deq,y(x)=y(x)+u(x))-deq; |
| > | expand(%); |
| > | lindeq:=subs(u(x)^2=0,%)=deq; |
| > | dsolve(lindeq,u(x)); |
La valeur de _C1 est donnée par les conditions initiales :
| > | eval(%,y(x)=0); |
| > | value(%); |
| > | equ:=subs(_C1=0,op(2,%%%)); |
Une procédure pour résoudre l'équation en série :
| > | uu:=proc(y,n) local hom; hom:=series(exp(int(2*y,x)),x,n); series(hom*Int(1/hom*(diff(y,x)-1-y^2),x),x,n) end; |
Q2. L'itération de Newton
| > | newt:=proc(n) local y; if n=1 then x else y:=convert(newt(ceil(n/2)),polynom); Order:=n+1; series(y-uu(y,n),x,n+1) fi end; |
| > | S:=newt(32); |
Vérification
| > | series(S-tan(x),x,33); |
II. Approximation
Q3. Approximant de Padé
| > | F:=numapprox[pade](S,x,[15,16]); |
![]() |
Q4. Graphes
| > | S:=convert(S,polynom): |
| > | plot([F,S,tan(x)],x=-20..20,view=-5..5); |
![]() |
Q5. Valeurs en 1
| > | L:=map(eval,[F,S],x=1)-[tan(1)$2]; |
| > | evalf(evalf(L,100)); |
Q6. Vitesse de convergence
| > | Digits:=40: |
| > | listapprox:=[seq(numapprox[pade](S,x,[k,k]),k=1..16)]; |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
| > | evalf(subs(x=1,listapprox)); |
| > | seq(evalf(tan(1))-%[i],i=1..nops(%)); |
Chaque terme apporte environ 3 décimales.
Q7. Mêmes calculs en 10
| > | L:=map(eval,[F,S],x=10)-[tan(10)$2]; |
| > | evalf(L,100); |
| > | evalf(subs(x=10,listapprox)); |
| > | seq(evalf(tan(10)-%[i]),i=1..nops(%)); |
La convergence semble encore géométrique, quoique plus lente.
Q8. Les racines du dénominateur
| > | fsolve(denom(F),x); |
| > | evalf([%]/Pi*2); |
Les premières racines sont très proches des multiples de
, et la qualité de l'approximation se dégrade en s'éloignant de l'origine.
Q9. Celles du numérateur
| > | fsolve(numer(F),x); |
| > | evalf([%]/Pi); |
Même observation.
Q10. Des dessins animés
D'abord sur ℝ :
| > | plots[display]([seq(plot([listapprox[i],tan(x)],x=-20..20,view=-5..5),i=1..nops(listapprox))],insequence=true); |
![]() |
Puis sur ℂ : on trace le module des approximants diagonaux dans le plan complexe, en utilisant la couleur pour représenter l'argument.
| > | plots[display]([seq(plots[complexplot3d](listapprox[i],x=-10-10*I..10+10*I,view=0..5,axes=boxed,style=surfacecontour,numpoints=100*100),i=1..nops(listapprox))],insequence=true); |
![]() |
III. Validité des approximations
Q11. Le développement en fraction continue de tanh
| > | numtheory[cfrac](series(tanh(x),x,12),monic); |
![]() |
On reconnaît les entiers impairs, qui sont donc positifs.
Q12. Conclusion
L'idée est de se ramener à une série de Stieltjes. D'abord, en changeant légèrement la fonction, on obtient la forme souhaitée pour la fraction continue
| > | CF:=numtheory[cfrac](series(tanh(sqrt(x))*sqrt(x),x,10),regular); |
![]() |
Étude de la convergence
Cette fraction continue étant à coefficients positifs, ses convergents se récrivent comme une série alternée :
| > | CV:=[seq(numtheory[nthconver](CF,i),i=1..9)]; |
![]() ![]() |
| > | map(normal,[seq(CV[i+1]-CV[i],i=1..nops(CV)-1)]); |
![]() ![]() ![]() |
Il suffit maintenant de montrer que le terme général tend vers 0 pour
Ce terme général n'est autre (à
près) que l'inverse du produit de deux dénominateurs consécutifs :
| > | den:=[seq(numtheory[nthdenom](CF,i),i=0..9)]; |
Soit
le
ème dénominateur. Le résultat est donc obtenu si l'on montre que pour tout ![]()
, `*`(d[`+`(i, 1)](x))), `*`(`^`(x, i)))](images/tp4_77.gif)
tend vers l'infini avec
Pour cela, on dispose d'une récurrence explicite :
| > | gfun:-listtorec(den,d(i)); |
| > | rec:=op(1,%); |
On retrouve que les coefficients des dénominateurs sont tous positifs. Pour
ces polynômes sont donc minorés par leurs termes constants
| > | recconst:=subs(x=0,rec); |
petit bug de Maple, ça a l'air de mieux se passer en enlevant la dernière condition initiale
| > | const:=rsolve(subsop(-1=NULL,recconst),d(i)); |
![]() |
on la vérifie quand même :
| > | eval(const,i=2); |
Le produit de deux termes constants consécutifs :
| > | const*subs(i=i+1,const); |
![]() |
et pour tout
ce terme constant tend vers l'infini plus vite que
| > | map(simplify,asympt(ln(%/x^i),i,3)) assuming x>0; |
Or la convergence d'une fraction continue à coefficients positifs pour un
entraîne sa convergence dans
∖
.
Conséquence sur le développement de tan(x)
Les deux développements sont directement reliés :
| > | map(numtheory[cfrac],[tan(x),tanh(x)],monic); |
![]() |
on passe de l'un à l'autre en changeant
en
et en divisant par
:
| > | subs(x=I*x,%[1]); |
![]() |
On vient de voir que le développement de
converge pour
, il s'ensuit que celui de
converge pour
, et donc nous avons donc la convergence de celui de
pour tout
| > |