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;
}:;