Calcul formel : Mode d'emploi - Exemples en Maple

Claude Gomez, Bruno Salvy, Paul Zimmermann

Masson, 1995

Chapitre IX, section 3.3, exercice 1, page 253.

Philippe.Dumas@inria.fr
http://algo.inria.fr/dumas/Maple/

Page du Projet Algorithmes | Page de Philippe Dumas | Page Maple de Philippe Dumas

Retour en page principale
Table des matières
Index
Maple V.3 worksheet
Maple V.4 worksheet
Maple V.5 worksheet, bis


Cet exercice illustre bien l'évolution de Maple. Tout calcul se passe dans un certain domaine. Par exemple quand vous écrivez x+y, vous supposez certainement que l'addition est commutative. Un système de calcul formel doit prendre explicitement en compte de telles hypothèses. Pour les concepteurs du logiciel, les fonctions mathématiques sont des fonctions complexes de variable complexe. Cet aspect n'était pas très marqué jusqu'à la version V.3. Par contre, à partir de la version V.4 il est devenu très net. En particulier, cette approche les a obligés à imposer des restrictions pour que le logiciel ne produise pas des résultats incorrects. Par exemple la racine carrée du carré de a ne peut être simplifiée que si l'on a fait une hypothèse adéquate sur a. Ceci peut sembler relever du simple bon sens, mais n'est pas sans poser d'importants problèmes. En tout cas, cela impose un domaine de calcul à l'utilisateur.

Commençons par employer la version V.3, celle qui a servi aux auteurs pour la première édition du manuel.

Une tentative naïve nous montre qu'il est utile d'expliciter une hypothèse sur a.

> int(1/(a^2+(x+I*b)^2),x=-infinity..infinity);

[Maple Math]

Nous exprimons donc que a est réel.

> assume(a,real);

> int(1/(a^2+(x+I*b)^2),x=-infinity..infinity);

[Maple Math]

Le résultat est alors évident.

Passons maintenant à la version V.4. Instruit par l'expérience, nous introduisons tout de suite des hypothèses.

> assume(a,real);

> assume(b,real);

> result[`a and b reals`]:=int(1/(a^2+(x+I*b)^2),
x=-infinity..infinity);

[Maple Math]

En vain ! Après quelques essais obscurs nous nous convainquons que les signes de a+b et a-b pourraient avoir de l'importance. Nous augmentons donc les hypothèses.

> additionally(a+b>0);
additionally(a-b>0);

> result[`a+b>0 and a-b>0`]:=int(1/(a^2+(x+I*b)^2),
x=-infinity..infinity);

[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]
[Maple Math]

Par curiosité, nous regardons les hypothèses faites.

> about(a);

Originally a, renamed a~:
Involved in the following expressions with properties
a+b assumed RealRange(Open(0),infinity)
a-b assumed RealRange(Open(0),infinity)
is assumed to be: real
also used in the following assumed objects
[a-b] assumed RealRange(Open(0),infinity)
[a+b] assumed RealRange(Open(0),infinity)

> about(b);

Originally b, renamed b~:
Involved in the following expressions with properties
a+b assumed RealRange(Open(0),infinity)
a-b assumed RealRange(Open(0),infinity)
is assumed to be: real
also used in the following assumed objects
[a-b] assumed RealRange(Open(0),infinity)
[a+b] assumed RealRange(Open(0),infinity)

À part cela, nous essayons d'arranger le résultat obtenu.

> normal(result[`a+b>0 and a-b>0`]);

[Maple Math]
[Maple Math]

> combine(",ln);

[Maple Math]
[Maple Math]

Nous nous lassons un peu et nous faisons appel au calcul vraiment formel, qui avait cours jusqu'en V.3.

> combine(",ln,symbolic);

[Maple Math]
[Maple Math]

Cela ne nous avance guère. Nous retroussons donc nos manches et nous sortons clés à molette, tournevis et autres outils propres à faire rendre le zéro attendu à cette expression.

> expand(");

[Maple Math]
[Maple Math]

> select(has,",ln);

[Maple Math]
[Maple Math]

> factor(");

[Maple Math]
[Maple Math]

> select(has,",ln);

[Maple Math]
[Maple Math]

> combine(",ln,symbolic);

[Maple Math]

Enfin nous l'avons ! Mais quelle dépense d'énergie pour un bien piètre résultat ! Il reste à traiter les autres cas, mais nous n'en avons plus le goût.

Passons maintenant à la version V.5. Nous reprenons le calcul en n'hésitant pas à introduire massivement des hypothèses.

> assume(a,real);
assume(b,real);

> result[`a and b reals`]:=int(1/(a^2+(x+I*b)^2),
x=-infinity..infinity);

[Maple Math]

> additionally(a+b>0);
additionally(a-b>0);

> result[`a+b>0 and a-b>0`]:=int(1/(a^2+(x+I*b)^2),
x=-infinity..infinity);

[Maple Math]

Tout cela ne produit rien et cette méchante intégrale, disons le, peut bien rester non évaluée. Nous la méprisons.

Le bilan est clair : bientôt Maple ne produira que deux sortes de résultat, NULL ou l'expression donnée en entrée. Ainsi on pourra dire que Maple ne produit que des résultats corrects.

Il faut tout de même préciser que le calcul suivant (qui démarre une nouvelle session) produit une partie du résultat. En séparant partie réelle et partie imaginaire, nous obtenons en effet l'intégrale de la partie réelle et le résultat est correct comme nous allons le voir plus loin. Cependant la procédure d'intégration échoue pour la partie imaginaire. Ceci n'est pas trop grave ici, car nous savons que cette intégrale est nulle si les deux variables a et b sont réelles.

> restart;

> F:=1/(a^2+(x+I*b)^2);

[Maple Math]

> ReF:=evalc(Re(F));

[Maple Math]

> int(ReF,x=-infinity..infinity);

[Maple Math]

> ImF:=evalc(Im(F));

[Maple Math]

> int(ImF,x=-infinity..infinity);

[Maple Math]

Après ce mouvement d'humeur, reprenons la question et essayons de comprendre où se situe le problème. À quelques exceptions près un système de calcul formel évalue une intégrale en passant par le calcul d'une primitive. Autrement dit l'action comporte deux phases : le calcul d'une primitive, puis l'évaluation de cette primitive aux bornes de l'intervalle. Séparons donc ces deux phases pour y voir plus clair.

> restart;

Le calcul d'une primitive se déroule sans problème.

> J:=int(1/(a^2+(x+I*b)^2),x);

[Maple Math]
[Maple Math]

Dans le résultat précédent, les lettres x, a et b ne représentent pas des réels, mais sont des indéterminées. De même arctan(x) n'est pas la valeur en x de la fonction bien connue, mais un symbole qui, pour ce qui concerne l'intégration, n'a qu'un mérite : quand on applique la dérivation (formelle) à arctan(x) on obtient 1/(1+x^2). On notera d'ailleurs qu'il n'y a pas de problème de définition. Puisque a et b sont des indéterminées, a, a+b et a-b ne sont pas zéro. Nous reviendrons sur ce point.

Il faut ensuite évaluer les limites de l'expression précédente en les deux infinis. C'est ici que les problèmes commencent. En effet on se met à interpréter les symboles a et b comme des réels et à considérer ln et arctan comme des fonctions. Puisque le logiciel n'est pas capable de nous fournir une réponse, nous prenons les choses en main. Nous regardons d'abord la partie logarithmique.

> L:=select(has,J,ln);

[Maple Math]

> combine(factor(L),ln,symbolic);

[Maple Math]

Nous voyons clairement que les limites en les deux infinis sont nulles, et ceci indépendamment des valeurs de a et b. Passons aux termes en arc tangente.

> A:=select(has,J,arctan);

[Maple Math]

Il faut discuter suivant les signes de a+b et a-b. Nous obtenons aisément les valeurs suivantes pour la limite en + l'infini de la somme des deux arcs tangente.

Comme les fonctions considérées sont impaires, les limites en - l'infini sont immédiates et nous obtenons les résultats suivants pour l'intégrale étudiée.

On note que dans le premier cas, a est strictement positif et que dans le dernier cas, il est strictement négatif. On voit donc réapparaître le Pi/|a| de la version V.3. Mais nous voyons aussi que le résultat fourni par la version V.3 est faux. En effet il introduit deux cas a>0 et a<0, ce qui revient à partager le plan des (a,b) en deux demi-plans. Il s'avère que ce plan doit être régionné en quatre quarts de plan.

Les cas a=0, a+b=0, a-b=0 n'ont pas été pris en compte parce que le calcul de primitive repose sur un calcul algébrique où a et b sont des indéterminées. Pour traiter ces cas, il faut spécialiser la situation. Le cas a=0 se traite comme suit.

> J:=int(subs(a=0,1/(a^2+(x+I*b)^2)),x);

[Maple Math]

Nous voyons tout de suite que les limites à l'infini sont nulles et l'intégrale est nulle. Passons au cas a+b=0.

> J:=int(subs(b=-a,1/(a^2+(x+I*b)^2)),x);

[Maple Math]

Nous pouvons suivre la même démarche que pour le cas général.

> L:=select(has,J,ln);

[Maple Math]

> combine(factor(L),ln,symbolic);

[Maple Math]

À nouveau la partie logarithmique a une contribution nulle.

> A:=select(has,J,arctan);

[Maple Math]

Le calcul de limite est évident et dans le cas a+b=0, l'intégrale vaut Pi/(2|a|). Bien sûr a n'est pas 0. Regardons enfin le cas a=b.

> J:=int(subs(b=a,1/(a^2+(x+I*b)^2)),x);

[Maple Math]

Clairement le résultat est le même que pour le cas a+b=0.

En conclusion, nous ressentons la difficulté de l'interprétation d'un résultat formel. Nous notons aussi que assume ne remplit pas correctement son office. En effet il s'avère que nous avions fourni un jeu d'hypothèses adéquates pour conclure et le système ne donnait pas de solution pour autant. Autrement dit assume est mal pris en compte dans le système et non fiable.

Retour en page principale