Lorsque Xcas fait le graphe G d’une fonction utilisateur g,
dans la réponse, il va figurer l’expression formelle de g(x) et si
cette fonction contient des tests, lorsque on va reutiliser G il y aura
un message d’erreur car il ne sait pas évaluer les tests contenus dans
g(x). Pour ne pas avoir ce genre d’erreurs, il faut alors commencer
l’écriture de la fonction g par un test sur le type de ses
arguments qui est : si les arguments ne sont pas réels on renvoie la fonction
quotée.
Exemple
g(x):={ si type(x)!=DOM_FLOAT alors retourne 'g'(x); fsi; si x<=-1 alors retourne -1; fsi; si -1<x et x<1 alors retourne sin(pi*x/2); fsi; si 1<= x alors retourne 1; fsi; }:; f(x,y):={ si type(x)!=DOM_FLOAT et type(y)!=DOM_FLOAT alors retourne 'f'(x,y) fsi; si x^2+y^2<=2 alors retourne 2 fsi; si x^2+y^2>2 alors retourne x^2+y^2 fsi; } :;
On tape par exempple :
G:=plotfunc(g(x)) ou
F:=plotfunc(f(x,y),[x=-4..4,y=-4..4]);
et pour voir le cercle x2+y2=2 :
plotparam([x,sqrt(2-x^
2),2],[x,y],affichage=1);
plotparam([x,-sqrt(2-x^
2),2],[x,y],affichage=1)
Voici les programmes qui permettent de paire du papier quadrillé (papierq), du papier triangulé (papiert), du papier pointé (papierp).
u est le pas en x,
v est le pas en y,
les lignes sont parallèles à y=x*tan(t) avec 0<t<pi
et à y=cste
dans le rectangle [x1,x2]*[y1,y2]
papierq(u,v,t,x1,x2,y1,y2):={ local x3,y3,y4,L,k,q,j,j0; si normal(t-pi)>=0 ou normal(t)<=0 alors return "0<=t<=pi";fsi; si x2<x1 alors j:=x1;x1:=x2;x2:=j;fsi; si y2<y1 alors j:=y1;y1:=y2;y2:=j;fsi; L:=polygone(x1+i*y1,x1+i*y2,x2+i*y2,x2+i*y1); pour k de y1 jusque y2 pas v faire L:=L,segment(x1+i*k,x2+i*k); fpour; si normal(t-pi/2)==0 alors pour j de x1 jusque x2 pas u faire L:=L,segment(j+i*y1,j+i*y2); fpour; return L; fsi; k:=evalf((y2-y1)/tan(t)); si normal(t-pi/2)<0 alors q:=floor(k/u+1e-12); pour j de x1-q*u jusque x1 pas u faire y3:=tan(t)*(x2-j)+y1; y4:=tan(t)*(x1-j)+y1; x3:=(y2-y1)/tan(t)+j; si y3<y2 alors L:=L,segment (x1+i*y4,x2+i*y3); fsi; si x3<x2 alors L:=L,segment (x1+i*y4,x3+i*y2); fsi; fpour; pour j de x1 jusque x2 pas u faire y3:=tan(t)*(x2-j)+y1; x3:=(y2-y1)/tan(t)+j; si y3<y2 alors L:=L,segment (j+i*y1,x2+i*y3); fsi; si x3<x2 alors L:=L,segment (j+i*y1,x3+i*y2); fsi; fpour; return L; fsi; si normal(t-pi/2)>0 alors j:=x1; tantque j<=x2 faire y3:=tan(t)*(x1-j)+y1; x3:=(y2-y1)/tan(t)+j; si y3<y2 alors L:=L,segment (j+i*y1,x1+i*y3); fsi; si x3>x1 alors L:=L,segment (j+i*y1,x3+i*y2); fsi; j:=j+u; ftantque; q:=ceil(k/u-1e-12); tantque j<=x2-q*u faire y3:=tan(t)*(x1-j)+y1; y4:=tan(t)*(x2-j)+y1; x3:=(y2-y1)/tan(t)+j; si normal(y3-y2)<0 alors L:=L,segment (x2+i*y4,x1+i*y3); fsi; si normal(x3-x1)>0 alors L:=L,segment (x2+i*y4,x3+i*y2); fsi; j:=j+u; ftantque; return L; fsi; } :; papiert(u,v,t,x1,x2,y1,y2):={ local x3,y3,y4,L,k,q,j,u1,t1,L; //si normal(t-pi/2)==0 alors retourne -atan(v/u)+pi; fsi; u1:=v/tan(t); si normal(u1-u)==0 alors t1:=pi/2; fsi; si normal(u1-u)>0 alors t1:=atan(v/(u1-u)); fsi; si normal(u1-u)<0 alors t1:=atan(v/(u1-u))+pi; fsi; L:=papierq(u,v,t,x1,x2,y1,y2); L:=L,papierq(u,v,t1,x1,x2,y1,y2); retourne L; }:; papierp(u,v,t,x1,x2,y1,y2):={ local j,k,L,q,q2,x3; si normal(t-pi)>=0 ou normal(t)<=0 alors return "0<t<pi";fsi; L:=NULL; L:=L,polygone(x1+i*y1,x2+i*y1,x2+i*y2,x1+i*y2); si x2<x1 alors j:=x1;x1:=x2;x2:=j;fsi; si y2<y1 alors j:=y1;y1:=y2;y2:=j;fsi; pour j de y1 jusque y2 pas v faire x3:=evalf((j-y1)/tan(t)); q:=floor(x3/u+1e-12); pour k de x1-q*u+x3 jusque x2 pas u faire L:=L,point(k+i*j); fpour; fpour; retourne L; }:;