subtilités de unapply

Utilisation de Xcas

Modérateur : xcasadmin

Paulm
Messages : 27
Inscription : jeu. mai 29, 2008 6:06 am
Localisation : Epinal Vosges France

subtilités de unapply

Message par Paulm » mar. juin 17, 2008 9:38 am

Voici un copier-coller de commandes:
C1:=graphe(exp(x));C2:=graphe(exp(-x))
assume(t=[-0.2,-2,2,1/10])
M:=element(C1,t);N:=point(t,exp(-t))
d(t):=longueur(M,N)
f:=unapply(longueur(M,N),t)
fd:=unapply(d(t),t)
h:=longueur(M,N)
fh:=unapply(h,t)

et mes commentaires: les résultats ci-dessous ont été obtenus alors que le curseur t était négatif:
1-
d donne (t)->longueur(M,N) ce qui laisse croire que d est une fonction, ce qui n'est pas le cas: d(0), dp:=fonction_derivee(d) ne donnent pas ce qu'on espère. Finalement d(t) est-ce une expression?
2-
f donne (t)->-exp(t)+exp(-t) et cette fois f est bien une fonction.
3-
fd donne (t)->abs(exp(t)-exp(-t)) ce qui est bien fonction et c'est surtout celle qu'on espère. En particulier
fd(t) donne -exp(t)+exp(-t) (logique avec t<0)
et fd(x) donne abs(exp(x)-exp(-x)) (logique avec x quelconque)
Et fdp:=fonction_derivee(fd) est correcte sur R ( sauf en 0 toujours à cause de sign)
4-
f=fh (logique car h a la même "valeur" que longueur(M,N) )

Morale: unapply(? ,t) ne me donne ce que je cherche que lorsque je passe par une "fausse" fonction g , mais pas par une "vraie" expression h !! :cry:
Quelle est précisément la logique :?:

parisse
Messages : 5882
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Message par parisse » mer. juin 18, 2008 6:35 am

Il y a en effet quelques subtilites dans les fonctions, plus precisement dans l'evaluation. Lorsqu'on definit une fonction par f(args):=valeur le membre de droite de l'affectation n'est pas evalue. Ceci permet par exemple de definir f(x):=x^2 meme si x a une valeur. Donc f est la fonction qui a args associe valeur qui doit etre une expression dependant explicitement de args. Si valeur est un nom de variables defini precedemment en fonction de args, il faut utiliser unapply pour que valeur soit evalue et remplace par l'expression dependant de args.
Ensuite pour la difference entre f et fd, cela vient du niveau d'evaluation (il en faut un de plus pour calculer d(t) que pour calculer longueur(M,N)) et du fait que la variable t est un curseur formel. Lorsqu'un calcul exact depend d'un curseur formel, les calculs sont effectues en fonction du nom de variable du curseur, mais la valeur actuelle peut etre utilisee pour faire des choix de branche, et c'est ce qui se passe ici pour la valeur absolue. Ainsi le calcul de fd(t) enleve les valeurs absolues car on evalue abs(exp(t)-exp(-t)) avec t curseur. On peut aussi tester le calcul de d(t) et de eval(d(t)).
Toutes ces subtilites font qu'il est plus simple au debut de ne travailler qu'avec des expressions, quitte a utiliser subst pour evaluer en un point.

Répondre