Page 1 sur 2

Tracé de fonctions discontinues

Publié : sam. janv. 21, 2017 10:45 am
par Lionel21
Bonjour,
je cherche à tracer des fonctions porte définies à l'aide de piecewise. Mais je n'arrive pas à supprimer les segments verticaux. Sous maple, il suffit d'ajouter discont=true. Y-a-t'il une option permettant de faire la même chose sous xcas ?

Merci d'avance pour vos réponses.

Lionel

Re: Tracé de fonctions discontinues

Publié : sam. janv. 21, 2017 6:20 pm
par parisse
Non, en fait le moteur de calcul essaie de reperer les discontinuites tout seul. Quelle est votre fonction?

Re: Tracé de fonctions discontinues

Publié : sam. janv. 21, 2017 6:25 pm
par Lionel21
C'est la fonction indicatrice qui vaut 1 sur l'intervalle réel [-a;a] et 0 ailleurs. J'aimerais enlever les segments verticaux en -a et a.

Pour a=2, j'ai fait :

porte1:=unapply(piecewise(x<=-a,0,x<a,1/2/a,0),x);

Lionel

Re: Tracé de fonctions discontinues

Publié : sam. janv. 21, 2017 6:47 pm
par parisse
En fait le test de discontinuite n'est pas adapte aux fonctions definies par morceaux, il est prevu pour les singularites. Je vais reflechir a ce que je peux faire pour piecewise.

Re: Tracé de fonctions discontinues

Publié : sam. janv. 21, 2017 7:03 pm
par Lionel21
Merci d'avance.

Lionel

Re: Tracé de fonctions discontinues

Publié : dim. janv. 22, 2017 8:48 am
par alb
salut,
un de mes anciens programmes dont voici le code me semble encore marcher
On peut le trouver ici
https://drive.google.com/drive/folders/ ... 1ZvUWE3UWs
Il s'agit de GrapheFonctionIntervalles

Code : Tout sélectionner

/******************************************************************
********** Graphe d'une fonction définie par intervalles **********
******************************************************************/

/* A mettre en ligne */

// f(x):=piecewise(x<=0,3+sqrt(-x),x<1,2x+3,x<3,-x+5,x<=7,x,5);GraphePiecewise(f);
// f(x):=piecewise(x<-2,undef,x<=0,3+sqrt(-x),x<1,2x+3,x<3,-x+5,x<=7,x,undef);GraphePiecewise(f);
// undef seulement aux extremites

Rayon():={ // détermination du rayon des demi-cercles
/*on cherche la longueur minimale des segments en excluant les extrémités*/
  local k,X1,Y1,X2,Y2,L,T,s;
  L:=NULL;
  T:=f(x);
  s:=size(f(x));
  si s=3 alors
    return 2;//modifier 2 ?
  fsi;
  si s>=4 alors 
    pour k de 1 jusque (s-3)/2 faire
      X1:=T[2k-1][1];
      X2:=T[2k+1][1];
      Y1:=subst(T[2k+2],x=X1);
      Y2:=subst(T[2k+2],x=X2);
      L:=L,longueur(point(X1,Y1),point(X2,Y2));
    fpour;
    si s<8 alors return min(L)/10;sinon return min(L)/5;fsi;
    //modifier 8,10,5 ?
  fsi;
}
:;

Demi_cercle_gauche(a,E,b):={
  local R,m,A,C;
  R:=Rayon();
  m:=evalf(subst(diff(E,x),x=a));
  A:=point(a,subst(E,x=a));
  //tester si m=undef ou m=inf
  si type(m)!=DOM_IDENT et type(m)!=DOM_SYMBOLIC alors
    C:=point(a-R/sqrt(1+m^2),subst(E,x=a)-R*m/sqrt(1+m^2));
    return plot(E,x=a..b),cercle(C,R,-pi/2+arctan(m),pi/2+arctan(m));
  sinon 
    si subst(E,x=a)-subst(E,x=a+0.001)<0 alors
      m:=inf;
      C:=point(a,subst(E,x=a)-R);
      return plot(E,x=a..b),cercle(C,R,-pi/2+arctan(m),pi/2+arctan(m));
    sinon
      m:=inf;
      C:=point(a,subst(E,x=a)+R);
      return plot(E,x=a..b),cercle(C,R,-pi/2-arctan(m),pi/2-arctan(m));
    fsi;   
  fsi;
}
:;

Demi_cercle_droite(a,E,b):={
  local R,m,B,C;
  R:=Rayon();
  m:=evalf(subst(diff(E,x),x=b));
  B:=point(b,subst(E,x=b));
  //tester si m=undef ou m=inf
  si type(m)!=DOM_IDENT et type(m)!=DOM_SYMBOLIC alors
    C:=point(b+R/sqrt(1+m^2),subst(E,x=b)+R*m/sqrt(1+m^2));
    return plot(E,x=a..b),cercle(C,R,pi/2+arctan(m),3*pi/2+arctan(m));
  sinon
    si subst(E,x=b-0.001)-subst(E,x=b)>0 alors
      m:=inf;
      C:=point(b,subst(E,x=b)-R);
      return plot(E,x=a..b),cercle(C,R,-pi/2+arctan(m),pi/2+arctan(m));
    sinon
      m:=inf;
      C:=point(b,subst(E,x=b)+R);
      return plot(E,x=a..b),cercle(C,R,-pi/2-arctan(m),pi/2-arctan(m));
    fsi;   
  fsi; 
}
:;

GraphePiecewise(f):={
  local T,s,L,k;
  affichage(epaisseur_ligne_3);
  T:=f(x);L:=NULL;
  s:=size(f(x));
  si s==3 alors
    si simplifier(subst(T[2],x=T[1][1])-subst(T[3],x=T[1][1]))!=0 et T[1][0]=='>' alors
      L:=L,Demi_cercle_droite(T[1][1]-5,T[2],T[1][1]);
    fsi;
    si simplifier(subst(T[2],x=T[1][1])-subst(T[3],x=T[1][1]))!=0 et T[1][0]=='>=' alors 
      L:=L,Demi_cercle_gauche(T[1][1],T[3],T[1][1]+5);
    fsi;
    return L:=L,plot(T[2],x=T[1][1]-5..T[1][1]),plot(T[3],x=T[1][1]..T[1][1]+5);
  fsi;
  si s>=4 alors
    si T[2]!=undef alors
      si simplifier(subst(T[2],x=T[1][1])-subst(T[4],x=T[1][1]))!=0 et T[1][0]=='>' alors
        L:=L,Demi_cercle_droite(T[1][1]-5,T[2],T[1][1]);  
      fsi;
      L:=L,plot(T[2],x=T[1][1]-5..T[1][1]);
    fsi;
    si T[s]!=undef alors
      si simplifier(subst(T[s-1],x=T[s-2][1])-subst(T[s],x=T[s-2][1]))!=0 et T[s-2][0]=='>=' alors
        L:=L,Demi_cercle_gauche(T[s-2][1],T[s],T[s-2][1]+5);
      fsi;
      L:=L,plot(T[s],x=T[s-2][1]..T[s-2][1]+5);
    fsi;
    si simplifier(subst(T[s-1],x=T[s-2][1])-subst(T[s],x=T[s-2][1]))!=0 et T[s-2][0]=='>' alors
      L:=L,Demi_cercle_droite(T[s-4][1],T[s-1],T[s-2][1]);
    fsi;
    pour k de 2 jusque (s-1)/2 faire
      si simplifier(subst(T[2k-2],x=T[2k-3][1])-subst(T[2k],x=T[2k-3][1]))!=0 et T[2k-3][0]=='>=' alors
        L:=L,Demi_cercle_gauche(T[2k-3][1],T[2k],T[2k-1][1]);
      fsi;
      si k!=(s-1)/2 alors 
        si simplifier(subst(T[2k],x=T[2k-1][1])-subst(T[2k+2],x=T[2k-1][1]))!=0 et T[2k-1][0]=='>' alors
          L:=L,Demi_cercle_droite(T[2k-3][1],T[2k],T[2k-1][1]);
        fsi;
      fsi;
      L:=L,plot(T[2k],x=T[2k-3][1]..T[2k-1][1]);
    fpour;
    return L;
  fsi;
}
:;


Re: Tracé de fonctions discontinues

Publié : dim. janv. 22, 2017 4:34 pm
par parisse
Je ne comprends pas ce code, a quoi servent les cercles?
J'ai ajoute du code dans le source du plotter pour gerer les piecewise dont les conditions sont des inegalites lineaires en la variable (en adaptant le code qui integre ce genre d'expressions).

Re: Tracé de fonctions discontinues

Publié : dim. janv. 22, 2017 5:02 pm
par alb
Je ne comprends pas ce code, a quoi servent les cercles?
pour exclure l'extremite du morceau de courbe à droite ou à gauche selon la definition de la fonction f
en classe en utilise un crochet ouvert

Re: Tracé de fonctions discontinues

Publié : dim. janv. 22, 2017 5:15 pm
par parisse
Wow, c'est chiade! Je ne vais pas faire aussi bien!

Re: Tracé de fonctions discontinues

Publié : dim. janv. 22, 2017 7:14 pm
par Lionel21
Salut,
ça marche super. J'ai juste un petit problème, je n'arrive pas à modifier les échelles des axes.
J'ai essayé de mettre gl_x=-a..a, gl_y=-0.25..1/a dans la dernière fonction, mais ça ne change rien (le maximum de ma fonction est 1/(2a) sur [-a;a] et la fonction vaut 0 ailleurs).

Lionel

Re: Tracé de fonctions discontinues

Publié : lun. janv. 23, 2017 7:36 am
par alb
pour changer d'echelle le mieux est d'utiliser les fleches du pave situe à droite du graphe
si le repere n'est pas orthonorme mes cercles sont deformes

Re: Tracé de fonctions discontinues

Publié : lun. janv. 23, 2017 8:20 am
par parisse
La syntaxe devrait plutot etre avec un point virgule

Code : Tout sélectionner

gl_x=-a..a; gl_y=-0.25..1/a; 
et attention, la commande de trace doit etre apres les commandes gl_x/y

Re: Tracé de fonctions discontinues

Publié : lun. janv. 23, 2017 10:19 am
par Lionel21
Il ne veut rien savoir. J'ai toujours le même repère. J'utilise qcas (je n'ai pas pu installer xcas sur ma debian).

Voici la syntaxe :

Code : Tout sélectionner

GraphePiecewise(f,coul,a):={
  local T,s,L,k;
  affichage(epaisseur_ligne_3);display(coul);
	gl_x=-a..a; 
	gl_y=0..1/a;
  T:=f(x);L:=NULL;
  s:=size(f(x));
  si s==3 alors
    si simplifier(subst(T[2],x=T[1][1])-subst(T[3],x=T[1][1]))!=0 et T[1][0]=='>' alors
      L:=L,Demi_cercle_droite(T[1][1]-5,T[2],T[1][1]);
    fsi;
    si simplifier(subst(T[2],x=T[1][1])-subst(T[3],x=T[1][1]))!=0 et T[1][0]=='>=' alors
      L:=L,Demi_cercle_gauche(T[1][1],T[3],T[1][1]+5);
    fsi;
    return L:=L,plot(T[2],x=T[1][1]-5..T[1][1]),plot(T[3],x=T[1][1]..T[1][1]+5);
  fsi;
  si s>=4 alors
    si T[2]!=undef alors
      si simplifier(subst(T[2],x=T[1][1])-subst(T[4],x=T[1][1]))!=0 et T[1][0]=='>' alors
        L:=L,Demi_cercle_droite(T[1][1]-5,T[2],T[1][1]); 
      fsi;
      L:=L,plot(T[2],x=T[1][1]-5..T[1][1]);
    fsi;
    si T[s]!=undef alors
      si simplifier(subst(T[s-1],x=T[s-2][1])-subst(T[s],x=T[s-2][1]))!=0 et T[s-2][0]=='>=' alors
        L:=L,Demi_cercle_gauche(T[s-2][1],T[s],T[s-2][1]+5);
      fsi;
      L:=L,plot(T[s],x=T[s-2][1]..T[s-2][1]+5);
    fsi;
    si simplifier(subst(T[s-1],x=T[s-2][1])-subst(T[s],x=T[s-2][1]))!=0 et T[s-2][0]=='>' alors
      L:=L,Demi_cercle_droite(T[s-4][1],T[s-1],T[s-2][1]);
    fsi;
    pour k de 2 jusque (s-1)/2 faire
      si simplifier(subst(T[2k-2],x=T[2k-3][1])-subst(T[2k],x=T[2k-3][1]))!=0 et T[2k-3][0]=='>=' alors
        L:=L,Demi_cercle_gauche(T[2k-3][1],T[2k],T[2k-1][1]);
      fsi;
      si k!=(s-1)/2 alors
        si simplifier(subst(T[2k],x=T[2k-1][1])-subst(T[2k+2],x=T[2k-1][1]))!=0 et T[2k-1][0]=='>' alors
          L:=L,Demi_cercle_droite(T[2k-3][1],T[2k],T[2k-1][1]);
        fsi;
      fsi;
      L:=L,plot(T[2k],x=T[2k-3][1]..T[2k-1][1]);
    fpour;
    return L;
  fsi;
}
:;
J'ai ajouté l'image du graphe obtenu.

Lionel

Re: Tracé de fonctions discontinues

Publié : lun. janv. 23, 2017 10:26 am
par parisse
qcas ne reconnait probablement pas les options de trace.
Par contre c'est etonnant que vous n'arriviez pas a installer xcas sur une debian: il y a 3 depots possibles stable et testing correspondent a debian 7 et devraient marcher au-dela, old devrait fonctionner pour des debian plus anciennes (le package 64 bits n'y est pas a jour).

Re: Tracé de fonctions discontinues

Publié : lun. janv. 23, 2017 11:29 am
par Lionel21
parisse a écrit :qcas ne reconnait probablement pas les options de trace.
Par contre c'est etonnant que vous n'arriviez pas a installer xcas sur une debian: il y a 3 depots possibles stable et testing correspondent a debian 7 et devraient marcher au-dela, old devrait fonctionner pour des debian plus anciennes (le package 64 bits n'y est pas a jour).
J'avais xcas sur mon ancienne debian. Il y a un problème avec une librairie qui a disparue lors du passage à la version 8 stable :

http://xcas.e.ujf-grenoble.fr/XCAS/view ... f=1&t=1624

Comme j'avais qcas, je me suis dit que j'allais rester comme ça. Je dois ré-installer un autre ordi, je verrai avec la version 8.7.

Lionel