Page 1 sur 2
bool3 et valeur interdite
Posté : mar. 5 juin 2012, 00:37
par maurice
Bonsoir, pour ne pas poluer le sujet
sur l'impression, je lance un nouveau.
Pour le début, voir
ici.GM a écrit :J'ai oublié de dire que :
- les fonctions choisies ci-dessus n'ont pas de valeurs interdites, donc il suffirait de deux états pour le booléen : un pair qui ne satisfait pas la condition n'est simplement pas tracé... et le premier pair qui suit et qui satisfait la condition débute nécessairement un nouveau guide ;
- l'intérêt d'un booléen trois états est pour moi dans le tracé de la courbe d'une fonction ayant une valeur interdite, car il faut alors pouvoir écrire une condition de test fonctionnant ainsi :
- si l'état est true, le pair testé est ajouté au guide courant ;
- si l'état est default, le pair testé est le premier pair d'un nouveau guide qui devient le guide courant ;
- si l'état est false, le pair testé n'est à ajouter à aucun guide et le prochain pair qui vérifiera la condition débutera un nouveau guide.
J'espère que j'ai été clair.
J'ai essayé de représenter la fonction
, je n'ai pas eu besoin de l'état default.
Si on remplace true par default, aucune ligne n'estbtracé, ce qui est normal vu la doc sur
graph.
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
import graph;
size(300, IgnoreAspect);
int xmin=-3, xmax=3, ymin=-3, ymax=3;
real f(real x){return 1/x;}
bool3 cond(real x) {return ((x!=0)&&(f(x)>ymin)&&(f(x)<ymax)) ? true : false;}
guide[] Cf=graph(f,xmin,xmax,n=10*(xmax-xmin),cond);
draw(Cf, red, dot());
xaxis(xmin=xmin,xmax=xmax,Ticks(Step=1));
yaxis(ymin=ymin,ymax=ymax,Ticks(Step=1));
Ce n'est donc pas que tu n'as pas été clair mais je tarde à bien comprendre.
bruno
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 05:42
par GM
Avec ton exemple, je n'ai fait que changer la valeur de n pour planter le fonctionnement :
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
import graph;
size(300, IgnoreAspect);
int xmin=-3, xmax=3, ymin=-3, ymax=3;
real f(real x){return 1/x;}
bool3 cond(real x) {return ((x!=0)&&(f(x)>ymin)&&(f(x)<ymax)) ? true : false;}
guide[] Cf=graph(f,xmin,xmax,n=(xmax-xmin)+1,cond);
draw(Cf, red, dot());
xaxis(xmin=xmin,xmax=xmax,Ticks(Step=1));
yaxis(ymin=ymin,ymax=ymax,Ticks(Step=1));
Dans le cas de la fonction inverse... il faut prendre en compte le changement de signe.
Remarque : Quand j'ai écrit
l'intérêt d'un booléen trois états est pour moi dans le tracé de la courbe d'une fonction ayant une valeur interdite, car ...
j'aurais dû écrire 'l'intérêt essentiel" car je ne doute pas que l'on peut inventer d'autres usages.
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 10:21
par OG
Bonjour
Pour la fonction 1/x il y a l'exemple sur le site asymptote, qui comme le dit Gaëtan
tient compte du changement de signe. Mais si j'ai bien compris il y a deux pbs à gérer
le 1/x et le pb du "bug".
Sur le modèle du 1/x je m'étais amusé à tracé la partie entière
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
import graph;
size(200,IgnoreAspect);
real f(real x) {return (real) floor(x);};
bool3 branch(real x)
{
static int lastsign=-50;
if(x-floor(x) == 0) return false;
int sign=floor(x);
bool b=lastsign ==-50 || sign == lastsign;
lastsign=sign;
return b ? true : default;
}
draw(graph(f,-4,4,n=1000,branch),black+1bp);
axes("$x$","$y$",red);
Évidemment on peut préférer les tracés avec les crochets aux extrémités de chaque partie constante
de la fonction.
O.G.
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 11:39
par GM
OG a écrit :je m'étais amusé à tracé la partie entière
Rappel d'une version différente :
http://www.marris.org/asymptote/Courbes_fonctions/index.html#fig_fa03_131111_fonction_partie_entiere
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
usepackage("amsmath");
import graph;
size(8cm,0);
real Floor(real x) {return floor(x);}
pair[] ListeDesPointsCompris;
pair[] ListeDesPointsExclus;
//==================
// bool3 est un booléen à trois états : true, default et false
bool3 TestRelierOuPas(real x) {
static real lasty;
static bool first = true;
real y = floor(x);
bool memebranche = first || lasty == y;
first = false;
if(!memebranche) { ListeDesPointsExclus.push((x,lasty));
ListeDesPointsCompris.push((x,y));
}
lasty=y;
return memebranche ? true : default;
};
//==================
draw(graph(Floor,-5.5,5.5,500,TestRelierOuPas));
axes("$x$",rotate(0)*"$\lfloor x\rfloor$",red);
dot(ListeDesPointsCompris);
dot(ListeDesPointsExclus,UnFill);
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 11:47
par GM
Sur le même thème, je rappelle un exemple déjà donné... dont je ne sais plus dire s'il y a le problème d'impression de traits supplémentaires avec adobereader (qu'il faudrait donc aménager si tel est le cas).
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
defaultpen(fontsize(10pt));
import graph_pi;
import geometry;
usepackage("fourier");
usepackage("mathrsfs");
size(450,0);
real a=3;
graphicrules(xunit=.8cm, yunit=1.5cm,
xmin=-3pi, xmax=3pi,
ymin=-4, ymax=4,
crop=Crop
);
// Définition et tracé de la grille
grid(xStep=pi/4, xstep=pi/12,
yStep=1, ystep=.25,
pTick=.7bp+.4white,
ptick=.7bp+.8white,
above=false
);
// Définition et tracé des axes
cartesianaxis(
xticks=Ticks(labelfrac(factor=pi,
symbol="\pi",
symbolin=true,
zero=false),
Step=pi/2, step=pi/12,
pTick=1bp+black,
ptick=1bp+gray),
yticks=Ticks(labelfrac(zero=false),
Step=1, step=.5,
pTick=1bp+black,
ptick=1bp+gray),
Arrow
);
real f(real x) {return tan(x);}
bool3 condition(real x)
{
static int derniersigne=0;
real a=x/(pi/2);
if(a==floor(a)) return false;
int signe = sgn(tan(x));
bool b = derniersigne == 0 || signe == derniersigne;
derniersigne = signe;
return b ? true : default;
}
guide[] Cf=graph(f,-3pi-.5,3pi+.5,n=1000,condition);
draw(Cf,linewidth(1bp)+blue);
xlimits(-3pi-.7,3pi+.7,Crop);
ylimits(-3.25,3.25,Crop);
label("$\mathscr{C}_{\tan}$",(-10pi/6,f(-10pi/6)),E);
label("La fonction $x\mapsto\tan(x)$ est p\'eriodique de p\'eriode $\pi$ \qquad et impaire.",truepoint(N),N);
distance("$T= \pi$",(0,f(0)),(pi,f(pi)),offset=-5mm,Arrows);
Edition par GM : je modifierai le code plus tard et supprimerai ce commentaire....... car je viens de réaliser, que la modification de graph_pi ne donne plus le découpage espéré que l'on avait avant : le même graphe avec la version de graph_pi précédente.
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 15:00
par maurice
Bonjour, merci pour vos réponses.
Code : Tout sélectionner
bool3 branch(real x)
{
static int lastsign=-50;
if(x-floor(x) == 0) return false;
int sign=floor(x);
bool b=lastsign ==-50 || sign == lastsign;
lastsign=sign;
return b ? true : default;
}
Si je comprends en gros ce code, quel est l'intéret du static ?
De plus, quelle est la signification exacte de cette ligne :
Là se sont mes (faibles) connaissances en informatique qui sont dépassées.
Bruno
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 16:53
par OG
Re
Merci pour l'exemple de la tangente.
Sans static une nouvelle variable est créée et initialisée à chaque appel
(donc pas de mémoire et le résultat n'est pas celui qu'on attend). Avec static
c'est la même case mémoire qui sert donc pour deux appels c'est la "même" variable.
== teste l'égalité
|| ou logique
O.G.
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 16:57
par maurice
Bonjour, merci pour les explications pour static
OG a écrit :
== teste l'égalité
|| ou logique
O.G.
Ca je savais, mais en gros :
déclare le booléen b qui est true si lastsgn égal -50 ou si sign égal lastsign ...
C'est ça qui n'est pas très clair...
Merci
Bruno
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 19:23
par GM
OG a écrit :Code : Tout sélectionner
bool3 branch(real x)
{
static int lastsign=-50;
if(x-floor(x) == 0) return false;
int sign=floor(x);
bool b=lastsign ==-50 || sign == lastsign;
lastsign=sign;
return b ? true : default;
}
Un "return false" pour la partie entière ?
Pourquoi ne placerait-on pas de point quand
?
Je crois que le modèle de bool3 relatif à 1/x n'est pas adapté pour la partie entière... et puis le nom des variables est perturbant car "lastsign" ne me semble pas adapté.
Re: bool3 et valeur interdite
Posté : mar. 5 juin 2012, 19:44
par GM
GM a écrit :Un "return false" pour la partie entière ?
Pourquoi ne placerait-on pas de point quand
?
Je crois que le modèle de 1/x n'est pas adapté pour la partie entière... et puis le nom des variables est perturbant car "lastsign" ne me semble pas adapté.
Je crois deviner que "return false" a été ajouté pour éviter d'avoir un point isolé pour la valeur entière xmax=4.
Mais pour un point gênant, enlever tous les points d'abscisses entières... c'est peut-être exagéré.
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***
- CODE ASYMPTOTE de la figure ci-dessus :
Tout sélectionner
import graph;
size(200,IgnoreAspect);
real f(real x) {return (real) floor(x);};
real xmin=-4, xmax =4;
bool3 branch(real x)
{
if((x==xmax)&&(floor(x)==x)) return false; // << pour enlever uniquement le dernier point, isolé quand xmax est entier.
static int partieentiereprecedente=05062012;
int partieentiere=floor(x);
bool onrelie= (partieentiereprecedente ==05062012) || (partieentiere == partieentiereprecedente);
partieentiereprecedente = partieentiere;
return onrelie ? true : default;
}
draw(graph(f,xmin,xmax,n=1000,branch),black+1bp);
axes("$x$","$y$",red);