Page 1 sur 2

graphe par morceaux/fonction args

Publié : ven. oct. 08, 2010 8:18 pm
par alb
En cherchant des petits algorithmes illustrant la notion de fonction affine par morceaux je me suis demandé comment obtenir le graphe d'une fonction définie par morceaux.
Je tombe alors sur une fonction que je ne connaissais pas: args
Voici une utilisation de cette fonction, à ne pas mettre entre les mains des élèves...sauf à vouloir faire grossir les rangs des manifestants !

Code : Tout sélectionner

Graphe_morceaux():={
  local L,k;
  affichage(epaisseur_ligne_3);
  L:=plot((args)[1],x=(args)[2]-5..(args)[2]),
  plot((args)[size(args)-1],x=(args)[size(args)-2]..(args)[size(args)-2]+5);
  pour k de 1 jusque size(args)/2-2 faire
    L:=L,plot((args)[2k+1],x=(args)[2k]..(args)[2k+2]);
  fpour;
  return L;
}
:;
Ensuite il faut faire Graphe_morceaux(expr1,front1,expr2,front2,........,expr137,front137,expr138)
Par exemple Graphe_morceaux(-10/x,-8,x+7,-3,-x+1,0,x+1,2,-x+5,5,sqrt(x))
J'ai eu une petite difficulté avec epaisseur:
le manuel indique ligne_epaisseur_n et point_epaisseur_n alors qu'il faut faire epaisseur_ligne_n et epaisseur_point_n

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 6:08 am
par parisse
Est-ce que vous aviez pensé à utiliser piecewise (ça ne devrait pas déclencher de manifestation:-))? On doit pouvoir obtenir à peu près la même chose avec
plot(piecewise(x<-8,-10/x,x<-3,-x+1,x<0,x+1,x<2,-x+5,sqrt(x)),x=-10..10)
mais les discontinuités sont mal gérées, votre programme donnera de meilleurs résultats graphiquement
Merci pour le bug de la doc, je vais essayer de ne pas oublier de le signaler à Renée.

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 6:46 am
par alb
parisse a écrit :On doit pouvoir obtenir à peu près la même chose avec...
C'est justement ce à peu près que je voulais éviter dans le tracé.
En outre les élèves risquent de me dire: "on voit bien que la fonction est continue"

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 12:49 pm
par alb
Dans ma session d'étude d'une fonction définie par morceaux, je pense faire ceci:
f(x):=piecewise(x<-8,-10/x,x<-3,x+7,x<0,-x+1,x<2,x+1,x<5,-x+5,3-(x-5)^2);
qui permet de faire des calculs formels du genre:
simplifier(f(5+a^2));d:=2+3/(1+x^2);simplifier(f(d));
Pour le graphe je ferai Graphe_piecewise() avec:

Code : Tout sélectionner

Graphe_morceaux():={
//le graphe respecte les sauts
//faire Graphe_morceaux(expr1,front1,...,exprn,frontn,expr(n+1))
  local L,k;
  affichage(epaisseur_ligne_3);
  L:=plot((args)[1],x=(args)[2]-5..(args)[2]),
  plot((args)[size(args)-1],x=(args)[size(args)-2]..(args)[size(args)-2]+5);
  pour k de 1 jusque size(args)/2-2 faire
    L:=L,plot((args)[2k+1],x=(args)[2k]..(args)[2k+2]);
  fpour;
  return L;
}
:;
et:

Code : Tout sélectionner

Graphe_piecewise():={
//transformer syntaxe piecewise x<front1,expr1,...,x<frontn,exprn,expr(n+1)
//en syntaxe Graphe_morceaux expr1,front1,...,exprn,frontn,expr(n+1)
  local L,k;
  L:=NULL;
  pour k de 1 jusque size(op(f(x)))-2 pas 2 faire
    L:=L,op(f(x))[k],op(f(x))[k-1][1];
  fpour;
    L:=L,op(f(x))[size(op(f(x)))-1];
  return Graphe_morceaux(L);
}
:;
Sur cet exemple précis on dirait bien que c'est correct.
Une question:
droit et gauche ont-ils des équivalents pour les inégalités ?

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 3:23 pm
par alb
Des petits problèmes. Je fais:
f(x):=piecewise(x<-7,-x-8,x<-3,x+7,x<0,-x+1,x<2,x+1,x<3,1,x<5,-x+5,3-(x-5)^2)
- si je fais Graphe_piecewise();droite(y=2,affichage=bleu+epaisseur_ligne_?); alors l'affichage ne tient pas (ou mal) compte de la valeur de ?
- si je fais solve(f(x)<2) alors j'obtiens:
[((x>-10) && (x<-5)),((x>-1) && (x<1)),((x>1) && (x<3)),((x>3) && (x<6)),x>6]
mais ((x>1) && (x<3)),((x>3) && (x<6)) est incorrect.

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 3:25 pm
par parisse
le plus simple est d'utiliser les fonctions générales de décomposition d'un symbolique, à savoir par exemple si u:=x<3, qui s'évalue en 3>x, u[0] est l'opérateur '>', u[1] est le 1er argument (3) et u[2] le 2ème argument (x). Attention, xcas évalue les < et <= en > et >= comme dans l'exemple.

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 3:53 pm
par parisse
en effet, solve marche pour les inéquations seulement lorsque la fonction considérée est continue, ce qui n'est évidemment pas forcément le cas avec des piecewise, il faudra que je code ça!
Sinon, chez moi le graphe par morceau suivi de la droite avec display=bleu+epaisseur_ligne_5 à l'air de marcher!

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 4:35 pm
par alb
J'ai cru comprendre dans le manuel que droite(y=2,affichage=bleu+epaisseur_ligne_1); donnerait la ligne la plus fine même si l'épaisseur est fixée à 3 au début.
Or j'obtiens manifestement avec 1,une ligne d'épaisseur 3 (comme la courbe) puis avec 7 la ligne la plus fine.
Stupéfiant ! comme dirait un certain animateur télé...

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 5:52 pm
par parisse
très bizarre, sur mon linux, les épaisseurs vont bien par ordre croissant. C'est sous windows?

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 6:30 pm
par alb
non,sous linux.
Dans une nouvelle session je fais:
affichage(epaisseur_ligne_3);
plot(x,affichage=bleu);
droite(y=2,affichage=vert+epaisseur_ligne_1);
J'obtiens deux droites d'épaisseur 3

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 6:37 pm
par alb
En revanche, tout va très bien avec ceci:
affichage(epaisseur_ligne_3);
plot(x,affichage=bleu);
droite(y=2,affichage=vert,epaisseur=1);

Re: graphe par morceaux/fonction args

Publié : sam. oct. 09, 2010 7:55 pm
par alb
Ceci dans l'aide:
Attention NE PAS mettre affichage(hidden_name) comme commande globale car après, aucun nom sera visible, et seule la commande affichage(0) remettra l’affichage par défaut.
C'est donc (?) le même pb avec affichage(epaisseur_ligne_3) et quand on tape ...+epaisseur_ligne_n alors on obtient une épaisseur de n+2

Re: graphe par morceaux/fonction args

Publié : dim. oct. 10, 2010 6:07 am
par parisse
oui, c'est certainement la commande globale, l'attribut global est additionné à l'attribut ajouté dans la commande, d'où le décalage. Il ne faut donc pas mélanger les deux types d'attributs (en tout cas pour le moment).

Re: graphe par morceaux/fonction args

Publié : dim. oct. 10, 2010 3:06 pm
par parisse
parisse a écrit :en effet, solve marche pour les inéquations seulement lorsque la fonction considérée est continue, ce qui n'est évidemment pas forcément le cas avec des piecewise, il faudra que je code ça!
J'ai réussi à coder un solve inéquation pour piecewise mieux que le précédent, mais il n'est pas encore irréprochable parce qu'il peut oublier des cas particuliers lorsqu'il y a des discontinuités. Concrètement, solve résoud les équations donnant les cas possibles, pour chaque solution trouvée, il teste si piecewise est continue ou non, si elle n'est pas continue, alors la valeur est ajoutée comme point singulier, point pour lequel on considère que l'inéquation n'est pas vérifiée (même si les 2 limites le sont).
Je mettrai tout ça en ligne dans la semaine.

Re: graphe par morceaux/fonction args

Publié : dim. oct. 17, 2010 8:12 am
par alb
La mise à jour de ce matin me donne correctement la résolution de solve(f(x)<2)
Bravo et mille fois merci !
Pour les diificultés éventuelles aux bornes on fera appel au raisonnement ce qui n'est pas plus mal.
Mon idée est d'étudier avec des élèves de seconde des fonctions affines par intervalles avec éventuellement des discontinuités afin de les sensibiliser à la notion de continuité par des questions du style: que faut-il modifier pour que la courbe se trace sans lever le crayon ?