Non tracé des discontinuités

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Non tracé des discontinuités

Messagepar jmbdeblois » Mer 9 Juin 2010, 17:48

Bonjour, j'ai repris l'exemple de Heaviside pour tracer une fonction f dont je joins le code, mais il y a le tracé de la discontinuité en x=2. Je n'ai pas du tout comprendre au booléen censé l'en empêcher !
Où est mon erreur alors ?
Code: Tout sélectionner
import graph;
size(300);

real xmin=-3,xmax=3;
real ymin=-1,ymax=2;

// Test pour savoir s'il faut relier les points ou pas lors de l'utilisation de graph.
bool3 condition(real x)
{
  static int derniersigne=0;
  int signe = sgn(x);
  bool b = derniersigne == 0 || signe == derniersigne;
  derniersigne = signe;
  return b ? true : default;
}

// Définition de la fonction de Heaviside
real H(real t) {return t < 0 ? 0 : 1;}
// Définition de la fonction
real f(real t){ return t*H(t)-(t-1)*H(t-1)-H(t-2);}

// Tracé de la courbe
guide[] CH=graph(f,xmin,xmax,condition,n=400);
draw(CH,1.5bp+blue);

real margeaxe=.4;
xaxis(Label("$x$",align=Align),xmin-margeaxe,xmax+margeaxe,Ticks(NoZero),Arrow);
yaxis(ymin-margeaxe,ymax+margeaxe,Ticks(NoZero),Arrow);

shipout(bbox(2mm,Fill(white)));
jmbdeblois
 
Messages: 30
Inscription: Dim 30 Mai 2010, 09:01

Re: Non tracé des discontinuités

Messagepar maurice » Mer 9 Juin 2010, 18:36

Bonjour,

en remplaçant
Code: Tout sélectionner
int signe = sgn(x);
par
Code: Tout sélectionner
int signe = sgn(x-2);
ça marche.

Code: Tout sélectionner
// Test pour savoir s'il faut relier les points ou pas lors de l'utilisation de graph.
bool3 condition(real x)
{
  static int derniersigne=0;
  int signe = sgn(x-2);
  bool b = derniersigne == 0 || signe == derniersigne;
  derniersigne = signe;
  return b ? true : default;
}


Par contre pour les explications, faudra attendre le maître.
J'ai fait ca à l'intuition.

Maurice
maurice
 
Messages: 86
Inscription: Jeu 25 Mar 2010, 13:00

Re: Non tracé des discontinuités

Messagepar jmbdeblois » Mer 9 Juin 2010, 19:39

Bien sûr, que je suis ballot. Merci Maurice.
EN fait le test sert à ne pas tracer les discontinuités là ou il y a des discontinuités !
Faudrait bosser sur ce booléen pour qu'il les repère systématiquement. Car s'il y en a deux, comme dans le cas d'un signal carré...
jmbdeblois
 
Messages: 30
Inscription: Dim 30 Mai 2010, 09:01

Re: Non tracé des discontinuités

Messagepar GM » Mer 9 Juin 2010, 22:48

jmbdeblois a écrit:Faudrait bosser sur ce booléen pour qu'il les repère systématiquement.


Houla... pas facile cela.
J'en veux pour preuve que, si c'était un problème facile... les calculatrices sauraient les gérer or, bien souvent, elles tracent des traits verticaux abusifs reliant des branches qu'elles ne devraient pas relier.

Personne ne connait un des concepteurs de geogebra ou d'un autre grapheur pour savoir comment ils font ?
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://gmaths.net/asy/index/?filtre=arc triple
Avatar de l’utilisateur
GM
Administrateur du site
Administrateur du site
 
Messages: 628
Inscription: Dim 7 Mar 2010, 14:50

Re: Non tracé des discontinuités

Messagepar jmbdeblois » Jeu 10 Juin 2010, 10:10

GM a écrit:Houla... pas facile cela.
J'en veux pour preuve que, si c'était un problème facile... les calculatrices sauraient les gérer or, bien souvent, elles tracent des traits verticaux abusifs reliant des branches qu'elles ne devraient pas relier.

L'idée que j'avais déjà programmée il y a quelques temps, est de tester la différence entre deux ordonnées consécutives dans le tracé par segment de f. Si la valeur absolue de la différence est supérieur à un certain epsilon prévu à l'avance, on ne trace pas la fonction. On saute d'un point à l'autre, sans tracer le segment entre ces deux points.
L'écueil est sur les fonctions présentant des variations très fortes (comme exp). Mais ça marchait pas trop mal.
jmbdeblois
 
Messages: 30
Inscription: Dim 30 Mai 2010, 09:01

Re: Non tracé des discontinuités

Messagepar maurice » Jeu 10 Juin 2010, 12:50

Bonjour,

Et pourquoi pas un tracé point par point ?

Code: Tout sélectionner
import graph;

//Taille de l'image
size(500);

//Tracé de la courbe point par point
void pointparpoint(real f(real x), real a, real b, int n, pen stylo=black) {
      real[] A=new real[n+1];
      real[] B=new real[n+1];
      real w=linewidth();
      for (int k=0; k<=n; ++k) {
         A[k]=a+k*((b-a)/n);
         B[k]=f(a+k*((b-a)/n));
         dot((A[k],B[k]),stylo+2w);
      }
}

//Définition de la fonction
real f(real x) {return floor(x);}
real g(real x) {return exp(x);}

xaxis(Ticks(NoZero),Arrow);
yaxis(Ticks(NoZero),Arrow);
pointparpoint(f,-3,3,600,red);
pointparpoint(g,-3,log(3),1000,green);


Effectivement pour l'exponentielle, n doit devenir "gran".

Maurice
maurice
 
Messages: 86
Inscription: Jeu 25 Mar 2010, 13:00

Re: Non tracé des discontinuités

Messagepar jmbdeblois » Jeu 10 Juin 2010, 17:08

C'est pas mal du tout ça !
Effectivement, du coup les discontinuités sont presque évacuées.
J'essaye de ce pas !
jmbdeblois
 
Messages: 30
Inscription: Dim 30 Mai 2010, 09:01

Re: Non tracé des discontinuités

Messagepar jmbdeblois » Jeu 10 Juin 2010, 18:27

Voici ce que cela donne :
Code: Tout sélectionner
import graph;
import patterns;
usepackage("mathrsfs");

unitsize(2cm,2cm);
real xmin=-1,xmax=4;
real ymin=-1.5,ymax=1.5;

// Définition de la fonction de Heaviside
real H(real t) {return t < 0 ? 0 : 1;}
// Définition de la fonction
real f(real t){ return H(t)-(t-1)*H(t-1)+(t-2)*H(t-2);}
real g(real t){ return -H(t-1)+H(t-2);}


xlimits(xmin,xmax,Crop);
ylimits(ymin,ymax,Crop);

// The grid :
xaxis(BottomTop, xmin, xmax, Ticks("%", Step=1, step=0.5, extend=true, ptick=lightgrey));
yaxis(LeftRight, ymin, ymax, Ticks("%", Step=1, step=0.5, extend=true, ptick=lightgrey));
// The axis.
xequals(Label("$y$",align=W),0,ymin=ymin-0.25, ymax=ymax+0.25,
        Ticks(NoZero,pTick=nullpen, ptick=grey),
        p=linewidth(1pt), Arrow(2mm));
yequals(Label("$x$",align=S),0,xmin=xmin-0.25, xmax=xmax+0.25,
        Ticks(NoZero,pTick=nullpen, ptick=grey),
        p=linewidth(1pt), Arrow(2mm));

labelx(Label("$O$",NoFill), 0, SW);
draw(Label("$\vec{\imath}$",align=S,UnFill),
     (0,0)--(1,0),scale(2)*currentpen,Arrow);
draw(Label("$\vec{\jmath}$",align=W,UnFill),
     (0,0)--(0,1),scale(2)*currentpen,Arrow);
dot((0,0));

label("$\mathscr{C}_f$",(1.5,f(1.5)),2N,red);
label("$\mathscr{C}_f'$",(1.5,g(1.5)),2S,green);

//Tracé de la courbe point par point
void pointparpoint(real f(real x), real a, real b, int n, pen stylo=black) {
      real[] A=new real[n+1];
      real[] B=new real[n+1];
      real w=linewidth();
      for (int k=0; k<=n; ++k) {
         A[k]=a+k*((b-a)/n);
         B[k]=f(a+k*((b-a)/n));
         dot((A[k],B[k]),stylo+2w);
      }
}

pointparpoint(f,-1,3,600,red);
pointparpoint(g,0,3,600,green);
jmbdeblois
 
Messages: 30
Inscription: Dim 30 Mai 2010, 09:01

Re: Non tracé des discontinuités

Messagepar OG » Jeu 10 Juin 2010, 19:56

Bonsoir

Pour faire quelque chose d'efficace et rapide qui détecte tous les points de discontinuité
cela ne doit pas être coton et il y aura toujours des faux positifs ou des vrais négatifs.

Une solution intermédiaire serait déjà de pouvoir donner une liste (finie) des points de discontinuité.

O.G.
OG
V.I.P.
V.I.P.
 
Messages: 108
Inscription: Dim 7 Mar 2010, 22:27

Re: Non tracé des discontinuités

Messagepar projetmbc » Jeu 10 Juin 2010, 21:12

GM a écrit:Personne ne connait un des concepteurs de geogebra ou d'un autre grapheur pour savoir comment ils font ?

La seule technique que je connaisse est de travailler avec un seuil d'acceptation des segments verticaux reliant deux points consécutifs du tracé de la courbe d'équation cartésienne.

L'idée d'indiquer à la main les points de discontinuité est une très bonne idée aussi.
projetmbc
 
Messages: 34
Inscription: Mer 17 Mar 2010, 08:31

Suivante

Retourner vers Les demandes d'aide

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité