Tracé de fonctions discontinues

Utilisation de Xcas

Modérateur : xcasadmin

Lionel21
Messages : 6
Inscription : sam. janv. 21, 2017 9:21 am

Tracé de fonctions discontinues

Message par Lionel21 » sam. janv. 21, 2017 10:45 am

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

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

Re: Tracé de fonctions discontinues

Message par parisse » sam. janv. 21, 2017 6:20 pm

Non, en fait le moteur de calcul essaie de reperer les discontinuites tout seul. Quelle est votre fonction?

Lionel21
Messages : 6
Inscription : sam. janv. 21, 2017 9:21 am

Re: Tracé de fonctions discontinues

Message par Lionel21 » sam. janv. 21, 2017 6:25 pm

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

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

Re: Tracé de fonctions discontinues

Message par parisse » sam. janv. 21, 2017 6:47 pm

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.

Lionel21
Messages : 6
Inscription : sam. janv. 21, 2017 9:21 am

Re: Tracé de fonctions discontinues

Message par Lionel21 » sam. janv. 21, 2017 7:03 pm

Merci d'avance.

Lionel

alb
Messages : 1321
Inscription : ven. août 28, 2009 3:34 pm

Re: Tracé de fonctions discontinues

Message par alb » dim. janv. 22, 2017 8:48 am

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


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

Re: Tracé de fonctions discontinues

Message par parisse » dim. janv. 22, 2017 4:34 pm

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).

alb
Messages : 1321
Inscription : ven. août 28, 2009 3:34 pm

Re: Tracé de fonctions discontinues

Message par alb » dim. janv. 22, 2017 5:02 pm

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

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

Re: Tracé de fonctions discontinues

Message par parisse » dim. janv. 22, 2017 5:15 pm

Wow, c'est chiade! Je ne vais pas faire aussi bien!

Lionel21
Messages : 6
Inscription : sam. janv. 21, 2017 9:21 am

Re: Tracé de fonctions discontinues

Message par Lionel21 » dim. janv. 22, 2017 7:14 pm

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

alb
Messages : 1321
Inscription : ven. août 28, 2009 3:34 pm

Re: Tracé de fonctions discontinues

Message par alb » lun. janv. 23, 2017 7:36 am

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

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

Re: Tracé de fonctions discontinues

Message par parisse » lun. janv. 23, 2017 8:20 am

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

Lionel21
Messages : 6
Inscription : sam. janv. 21, 2017 9:21 am

Re: Tracé de fonctions discontinues

Message par Lionel21 » lun. janv. 23, 2017 10:19 am

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
Pièces jointes
PbFctPorte.png
Exemple de tracés de fonctions porte
PbFctPorte.png (6.69 Kio) Consulté 15741 fois

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

Re: Tracé de fonctions discontinues

Message par parisse » lun. janv. 23, 2017 10:26 am

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).

Lionel21
Messages : 6
Inscription : sam. janv. 21, 2017 9:21 am

Re: Tracé de fonctions discontinues

Message par Lionel21 » lun. janv. 23, 2017 11:29 am

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

Répondre