graphe par morceaux/fonction args

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

graphe par morceaux/fonction args

Message par alb » ven. oct. 08, 2010 8:18 pm

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

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

Re: graphe par morceaux/fonction args

Message par parisse » sam. oct. 09, 2010 6:08 am

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.

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 6:46 am

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"

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 12:49 pm

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 ?

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 3:23 pm

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.

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

Re: graphe par morceaux/fonction args

Message par parisse » sam. oct. 09, 2010 3:25 pm

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.

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

Re: graphe par morceaux/fonction args

Message par parisse » sam. oct. 09, 2010 3:53 pm

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!

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 4:35 pm

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

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

Re: graphe par morceaux/fonction args

Message par parisse » sam. oct. 09, 2010 5:52 pm

très bizarre, sur mon linux, les épaisseurs vont bien par ordre croissant. C'est sous windows?

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 6:30 pm

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

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 6:37 pm

En revanche, tout va très bien avec ceci:
affichage(epaisseur_ligne_3);
plot(x,affichage=bleu);
droite(y=2,affichage=vert,epaisseur=1);

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

Re: graphe par morceaux/fonction args

Message par alb » sam. oct. 09, 2010 7:55 pm

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

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

Re: graphe par morceaux/fonction args

Message par parisse » dim. oct. 10, 2010 6:07 am

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

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

Re: graphe par morceaux/fonction args

Message par parisse » dim. oct. 10, 2010 3:06 pm

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.

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

Re: graphe par morceaux/fonction args

Message par alb » dim. oct. 17, 2010 8:12 am

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 ?

Répondre