Les erreurs fréquentes en Maple

Transcription

Les erreurs fréquentes en Maple
Les erreurs fréquentes en Maple
Ce document a pour but de recenser les messages d’erreur les plus fréquemment rencontrés lors de l’utilisation de Maple
en classes préparatoires, et de tenter d’en donner une explication simple permettant d’interpréter l’erreur, et de la corriger
le cas échéant. Les exemple ont été produits avec Maple 12.01. Les sorties apparaissent en commentaires, traduites en
français dans la plupart des cas.
Il s’agit de la première version, tout commentaire est bienvenu.
1
Error – Les messages d’erreur
>
>
#
#
successeur := proc(n) n:=n+1; n; end proc:
successeur (3);
Error, (in successeur) illegal use of a formal parameter
Erreur, (dans successeur) utilisation illégale d'un paramètre formel
Dans la procédure (ici successeur), vous avez tenté de modifier l’argument (ici n).
Solution : travailler sur une copie de l’argument.
>
>
#
#
successeur := proc(n::posint) n+1; end proc:
successeur (0);
Error, invalid input: successeur expects its 1st argument, n, to be of type posint, but received 0
Erreur, entrée non valable : successeur attend que son 1er argument, n, soit de type posint, mais a reçu 0
En anglais, positive signifie strictement positif, tandis que positif ou nul se dit nonnegative.
Solution : utiliser le type nonnegint lorsque l’argument peut prendre la valeur 0.
>
>
#
#
L := [1, 2, 3]:
L[0];
Error, invalid subscript selector
Erreur, indice invalide
Vous cherchez à accéder à un élément d’une liste qui n’existe pas.
Solution : n’utiliser que les indices entre 1 et nops(L).
>
>
#
#
i := 3:
sum(i,i=1..10);
Error, (in sum) summation variable previously assigned, second argument evaluates to 3 = 1 .. 10
Erreur, (dans sum) indice de sommation déjà affecté, le second argument est évalué en 3 = 1 .. 10
L’indice de sommation doit être une variable non affectée (3 ne peut pas varier de 1 à 10).
Solution : utiliser j ou 'i' qui empêche l’évaluation de i.
> u_n+1 := 4;
# Error, invalid left hand side of assignment
# Erreur, membre de gauche de l'affection incorrect
À gauche de := doit se trouver un nom de variable.
Solution : ne pas faire d’opération à gauche de :=.
> Pi := 2.71828;
# Error, attempting to assign to `Pi` which is protected
# Erreur, tentative d'affectation de `Pi` qui est protégée
Certains noms sont réservés et ne peuvent pas être utilisés comme nom de variable.
Solution : Utiliser un autre nom
> S := 0
for k from 1 to 10 do S := S + k end do:
S;
# Error, reserved word `for` unexpected
# Erreur, mot réservé `for` inattendu
Quand un mot est inattendu, le problème de syntaxe vient en général de l’expression précédente non terminée.
Solution : Terminer correctement l’expression précédente par le ; (c’est le cas ici) end if, end do . . . manquant.
>
>
#
#
S := 0:
for k from 1 to n do S := S + k end do:
Error, final value in for loop must be numeric or character
Erreur, la valeur finale dans la boucle for doit ^
etre un nombre ou une variable affectée
2010-2011
http://mpsi1.lamartin.fr
1/6
Les erreurs fréquentes en Maple
Une boucle for ne peut être exécutée sans donner explicitement les valeurs extrêmes de l’indice.
Solution : Donner une valeur à n ou remplacer n par un nombre.
>
>
#
#
x := Pi / 4:
cos(3x);
Error, missing operator or `;`
Erreur, il manque un opérateur ou un `;`
Toutes les opérations doivent être indiquées, et les différentes expressions doivent être séparées par des ; ou un :
Solution : Mettre le * entre 3 et x.
>
>
#
#
x := Pi / 4:
assume (x>0);
Error, (in assume) cannot assume on a constant object
Erreur, (dans assume) on ne peut pas faire d'hypothèse sur un objet constant
L’évaluation totale fait que x est π4 , et on ne peut pas supposer que π4 ¡ 0 : c’est vrai ou c’est faux.
Solution : Supprimer l’affectation de x ou travailler avec une autre variable.
> ln(0);
# Error, (in ln) numeric exception: division by zero
# Erreur, (dans ln) exception numérique : division par zéro
Erreur de division par zéro (parfois caché dans les calculs intermédiaires).
Solution : ne pas diviser par 0.
> x := cos(x);
# Error, recursive assignment
# Erreur, affectation récursive
Les déclarations récursives doivent être faites à l’intérieur d’une procédure récursive, ou bien dans une boucle.
Solution : donner une valeur initiale à x.
>
>
#
#
f := proc(n) n * f(n-1) end proc:
f(3);
Error, (in f) too many levels of recursion
Erreur, (dans f) trop d'appels récursifs
> f := proc(n) if n = 0 then 1 else f(n) end if end proc:
> f(3);
Lors de l’utilisation d’une fonction récursive, il y a un débordement de la pile de récursivité. C’est en général dû à une
erreur de définition de la fonction.
Solution : ne pas oublier le cas terminal dans la définition d’une fonction récursive ; vérifier la décroissance de l’argument
vers le cas terminal lors des appels récursifs.
>
>
#
#
s := seq(i,i=1..2):
s[2]:=7;
Error, invalid assignment (1, 2)[2] := 7; cannot assign to an expression sequence
Erreur, affectation non valable (1, 2)[2] := 7 ; l'affectation d'une séquence ne peut ^
etre modifiée
Les variables de type séquence (expression sequence) sont en lecture seulement, et ne peuvent être modifiées sans être
entièrement redéfinies.
Solution : redéfinir entièrement la séquence, ou utiliser une liste (type list).
> factor(x^2+2*x-1,sqrt(2)+I);
# Error, (in factor) 2nd argument, 2^(1/2)+I,
? is not a valid algebraic extension
# Erreur, (dans factor) le 2nd argument, 2 i, n'est pas une extension algébrique correcte
L’utilisation d’un argument optionnel pour permettre la factorisation des polynômes doit se faire de façon correcte.
Solution : N’indiquer qu’un irrationnel, ou bien une liste d’irrationnels en option (ici [sqrt(2),I] par exemple).
with(LinearAlgebra): A := < <0,1,-1> | <-1,0,1> | <1,-1,0> >:
sum (A[1,k], k=1..3);
# Error, bad index into Matrix
# Erreur, mauvais indice dans la matrice
La fonction sum est réservée pour le calcul formel des sommes, en particulier des sommes infinies. Pour les sommes finies
(et pour éviter d’écrire une boucle), l’aide de Maple recommande fortement d’utiliser add.
Solution : Utiliser add.
2/6
http://mpsi1.lamartin.fr
2010-2011
Les erreurs fréquentes en Maple
if (i=k & j=l) then 1 else 0 end if;
# Error, invalid neutral operator
if (i=k || j=l) then 1 else 0 end if;
# Error, `=` unexpected
# Erreur, `=` inattendu
Le ET booléen ne se note pas avec une esperluette. Le OU booléen ne se note pas avec un double pipe
Solution : Utiliser and et or.
kronecker := ((i,j),(k,l)) -> if (i=k and j=l) then 1 else 0 end if:
kronecker ((1,2),(1,2));
# Error, (in kronecker) invalid keyword expression
# Erreur, (dans kronecker) expression invalide
Les arguments d’une procédure doivent être séparés par des virgules, sans parenthèse.
Solution : écrire ici une fonction de 4 variables, ou bien utiliser deux listes de deux entiers.
A := LinearAlgebra[RandomMatrix](3,3):
B := LinearAlgebra[RandomMatrix](3,3):
A*B;
# Error, (in rtable/Product) invalid arguments
# Erreur, (dans rtable/Product) arguments invalides
L’étoile désigne la loi externe des matrices.
Solution : utiliser le point . pour le produit des matrices.
# Error, control character unexpected
# Erreur, caractère de contr^
ole inattendu
Un caractère invisible s’est inséré dans le code qui précéde. Il s’agit d’une erreur dûe à l’interface graphique, parfois
conséquence de l’utilisation du copier-coller.
Solution : effacer entièrement la ligne correspondante, et la ressaisir.
with(LinearAlgebra):
A := < <1,2> | <1,3> >: B := <2,3,4>:
LinearSolve(A,B);
# Error, (in LinearAlgebra:-LA_Main:-LinearSolve) number of rows of left hand side Matrix, 2, does not match number of rows o
# Erreur, (dans LinearSolve) le nombre de lignes/colonnes du système n'est pas cohérent
sum(1/(k-10),k=0..10);
# Error, (in SumTools:-DefiniteSum:-ClosedForm) summand is singular in the interval of summation
# Erreur, l'expression sommée s'annule dans l'intervalle de sommation
2010-2011
http://mpsi1.lamartin.fr
3/6
Les erreurs fréquentes en Maple
2
Warning – Les mises en gardes
> cos(Pi/8)
# Warning, inserted missing semicolon at end of statement
# Attention, il manque un point-virgule à la fin de l'instruction
Ne pas oublier de terminer chaque expression par un ; ou un :
Solution : mettre un ;
> successeur := proc(n) m:=n+1; m; end:
# Warning, `m` is implicitly declared local to procedure `successeur`
# Attention, `m` est implicitement déclarée comme variable locale à la procédure `successeur`
Ne pas oublier de déclarer toutes les variables locales.
Solution : Ajouter local m; dans l’entête de la procédure.
>
#
#
#
with(plots);
Warning, the name changecoords has been redefined
[animate, ..., display, ..., tubeplot]
Attention, la fonction changecoords a été redéfinie
Le chargement d’une bibliothèque (ici plots) a parfois pour conséquence la redéfinition de certaines fonctions (ici
changecoords)( 1 ).
Solution : C’est une simple mise en garde si vous utilisiez l’ancienne définition de la fonction.
> solve(cos(x)<x, x);
# Warning, solutions may have been lost
# Attention, les solutions ont peut-^
etre été perdues
La résolution de l’inéquation a échoué. Si elle faisait partie d’une suite de calculs, et que cette équation est utilisée par la
suite, il faut être conscient qu’on a peut-être perdu des solutions.
> plot(a*ln(x),x);
# Warning, unable to evaluate the function to numeric values in the region;
# see the plotting command's help page to ensure the calling sequence is correct
#
# Attention, les valeurs numériques de la fonction n'ont pas pu ^
etre calculées
Le tracé graphique d’une fonction nécessite de pouvoir calculer les valeurs numériques de la fonction.
Solution : Affecter une valeur à chaque variable dont dépend la fonction (ici a doit pouvoir être évaluée en un nombre).
1. N’est plus d’actualité avec Maple 12
4/6
http://mpsi1.lamartin.fr
2010-2011
Les erreurs fréquentes en Maple
3
Les résultats qui peuvent surprendre
3.1
Maple retourne l’instruction sans l’évaluer
C’est en général que Maple n’arrive pas à calculer l’expression.
> un_booleen := Pi > 0:
> evalb(un_booleen);
#
0 π
La fonction evalb fait une simple évaluation de booléen, sans « calcul » ou simplification sur l’expression.
Solution : on peut utiliser is à la place de evalb.
> G1 := plot(cos(x),x): G2 := plot(sin(x),x):
> display([G1,G2]);
# display prP LOT p...q, P LOT p...qsq
La fonction (ici display) n’est pas connue par Maple, parce qu’elle fait partie d’une bibliothèque non chargée par défaut
(ici plots).
Solution : Charger la bibliothèque (ici with(plots))
> maplesyrup;
#
cos;
#
maplesyrup
cos
maplesyrup est ici un nom de variable non affecté, qui s’évalue donc en son nom. cos est un nom de variable affecté (la
fonction cos) qui s’évalue, lorsqu’elle est appelée sans argument, en son propre nom.
> cos(Pi/8);
#
cos
π
8
Par défaut, seules certaines valeurs des fonctions usuelles sont évaluées.
Solution : pour avoir une expression avec radicaux, utiliser convert(%, radical)
factor(x^2+2*x-1);
#
x2 2x 1
solve(x^2+2*x-1);factor(x^2+2*x-1,sqrt(2));
?
?
#
2 1, 1 2
px 1
?
2qpx
1
?
2q
La factorisation des polynômes se fait seulement avec des coefficients rationnels.
Solution : avoir une idée des coefficients, donc des racines avec solve, puis indiquer en option « dans quelle direction »
chercher les coefficients( 2 ).
> u(n):=3*n+4:
> u(5);
#
u p 5q
Il y a eu une confusion entre fonction et expression. 3*n+4 est une expression qui dépend de n. u(5) est la fonction u
évaluée en 5.
Solution : Ne jamais écrire u(n):= ou f(x):=, mais travailler avec des fonctions ou avec subs.
3.2
Maple ne retourne rien
C’est rare, mais cela signifie en général qu’il n’y a pas de solution, ou qu’alors Maple ne sait pas les calculer.
> assume(x, real); # ceci ne produit rien en apparence
> x;
#
x
L’évaluation de cette expression permet de formuler une hypothèse, mais ne produit rien en apparence. Sauf le petit
qui suit dorénavent la variable sur laquelle l’hypothèse a été formulée.
2. Il s’agit d’une extension de corps : on cherche à factoriser avec des coefficients dans
2010-2011
http://mpsi1.lamartin.fr
?
Qr 2s tr1
?
2r2 , r1 , r2
P Qu
5/6
Les erreurs fréquentes en Maple
3.3
Maple retourne un résultat « faux »
Non, les résultats ne sont pas faux, mais il peut arriver que le résultat attendu ne soit pas le résultat proposé par Maple.
Ce dernier peut cependant toujours être expliqué en regardant la définition précise des fonctions utilisées.
> un_booleen := (a+b)^2=a^2+2*a*b+b^2:
> evalb(un_booleen);
#
f alse
La fonction evalb fait une simple évaluation de booléen, sans « calcul » ou simplification sur l’expression.
Solution : Utiliser is à la place de evalb.
> A:=< <1,x> | <1, 1> >;
#
> LinearAlgebra[Rank] (A);
#
A : p x1 11 q
2
Mathématiquement, le rang de la matrice A dépend de la valeur de x. Informatiquement, x n’est pas 1, donc le rang de
la matrice est bien 2.
> solve( {cos(t)=sin(t)} , {t} );
#
tt π
4
u
Il y a d’autres solutions bien-sûr !
3.4
Inclassables
Certains résultats peuvent surprendre.
assume(y>0);
y;
#
y
Si une hypothèse a été formulée sur une variable, Maple le rappelle par un
> ED:=diff(y(x),x)-y(x):
> dsolve(ED,y(x));
#
après le nom de la variable.
y pxq _C1 ex
Si une variable a été introduite par Maple (ici _C1), elle est précédée d’un caractère de soulignement (_). Pour utiliser
cette variable, il faut bien utiliser son nom entier, avec ce caractère (ici _C1).
sqrt(I); sqrt(-1); arccosh(0);?
1
#
2
2
1
i
2
?
2
i
iπ
2
La plupart des fonctions sont définies sur C, et la plupart des applications, même si elles ne sont pas bijectives, ont une
(fausse) application réciproque connue par Maple.
> solve({x*y=2,x+y=2},{x,y});
#
tx RootOf p_Z 2 2_Z 2, label _L1q 2, y
allvalues(%);
#
tx 1 I, y 1 I u, tx 1 I, y 1 I u
RootOf p_Z 2 2_Z
2, label
_L1qu
Parfois, les solutions sont exprimées avec la fonction RootOf qui désigne les racines d’une équation (en général polynomiale). On peut tenter d’obtenir l’ensemble de ces racines en utilisant la fonction allvalues.
6/6
http://mpsi1.lamartin.fr
2010-2011

Documents pareils