Calcul formel : Mode d'emploi - Exemples en Maple
Claude Gomez, Bruno Salvy, Paul Zimmermann
Masson, 1995
Chapitre VIII, section 2.7, exercice 1, page 212.
Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/
|
|
Calcul naïf. Nous employons la méthode présentée pages 206-207. Nous définissons l'équation puis la précision désirée.
> eq:=diff(y(z),z)-y(y(z))-cos(z);
> N:=6;
La condition initiale y(0)=0 impose aussi y'(0)=1 et la série débute donc comme dans le cas présenté en exemple.
> f:=proc(z)
local i;
global N;
z+add(a[i]*z^i,i=2..N+2)
end:
> s:=series(eval(subs(y=f,eq)),z,N+2);
Nous prenons soin d'avoir autant d'inconnues que d'équations.
> sys:={seq(coeff(s,z,i),i=0..N)};
inc:={seq(a[i],i=2..N+1)};
Le système n'est pas linéaire mais il est triangulaire. Autrement dit, il est équivalent à une récurrence. Cette remarque est la clé pour prouver que l'équation différentielle possède exactement une solution série formelle.
> S:=solve(sys,inc);
> F:=series(subs(S,f(z)),z,N+1);
Calcul efficace. Comme il est expliqué à la page 207, le calcul précédent n'est pas assez efficace. Pour N grand, on passe donc à une méthode itérative.
> N:=50:
> start:=time():
> for i from 2 to N do
sol:=subs(ii=i,
proc(z)
local j;
z+add(a[j]*z^j,j=2..ii)
end);
equa:=op(1,series(eval(subs(y=sol,eq)),z,i));
a[i]:=solve(equa,a[i])
od:
F:=series(sol(z),z,N+1);
a:='a':
time()-start;
Ainsi le calcul aboutit (contrairement à ce qui se serait passé avec la première méthode), mais demande un peu de temps.
On notera aussi que le style est critiquable car les a[i] sont à la fois des symboles (ou indéterminées) mathématiques et des variables informatiques (voir page 56, deuxième paragraphe). On a tenté de corriger ceci par l'instruction a:='a':. Il ne s'agit pas d'un simple souci esthétique. Ainsi la boucle peut être réexécutée sans provoquer d'erreur.