Tracer la tangente à un fonction

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
Pierrette
Messages : 2
Inscription : lun. janv. 24, 2011 8:30 am

Tracer la tangente à un fonction

Message par Pierrette » lun. janv. 24, 2011 9:47 am

Bonjour,
Inutile de dire que je suis nouvelle à la fois sur le forum et aussi au niveau de la programmation XCAS...
J'ai fait un petit programme afin de tracer la tangente d'une courbe (cf ci-dessous).
La fonction est donnée par l'utilisateur ainsi que le point en lequel on veut la tangente.
Mon problème, c'est que ca ne me dessine rien dans la fenetre DispG...
Et je ne vois pas ou est le probleme...
Merci de votre aide

Tangente():={
saisir("fonction f ?",f);
saisir("point ?",a);
h(x):=f;
dh:=function_diff(h);
y(x):=h(a)+dh(a)*(x-a);
plot([h(x),y(x)],x);
afficher("L'équation de la tangente de f(x) = "+f+" en "+a+" est : "+y(x));
}

:;

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

Re: Tracer la tangente à un fonction

Message par parisse » lun. janv. 24, 2011 12:01 pm

Je viens d'essayer votre programme, qui semble fonctionner normalement chez moi (j'ai mis x^2-1 pour f et 3 pour a), l'ecran DispG affiche bien la fonction et la droite. Peut-etre y-a-t-il un probleme de configuration graphique (xmin..xmax incorrects?)?
Notez aussi que si vous fermez ou minimisez la fenetre DispG et la reouvrez ensuite, cela efface la fenetre. Dans votre cas vous pouvez obtenir un affichage plus persistant en mettant plot([h(x),y(x)],x); comme derniere instruction, qui sera alors la valeur de retour de la fonction.
Notez enfin que plot(h(x),x),droite(y(x),affichage=rouge) est preferable a plot([h(x),y(x)],x) parce que dans le 1er cas, l'objet droite(y(x)) est reconnu comme une droite, dans le second c'est un graphe de courbe.

Pierrette
Messages : 2
Inscription : lun. janv. 24, 2011 8:30 am

Re: Tracer la tangente à un fonction

Message par Pierrette » lun. janv. 24, 2011 1:41 pm

Bonjour,
Merci pour la réponse.
En fait, des fois ca s'affiche, et des fois non...
je ne sais pas très bien comment configurer DispG...
Merci pour les indications que je vais tester !

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

Re: Tracer la tangente à un fonction

Message par alb » mar. mars 01, 2011 7:56 am

Avec un peu de recul je trouve qu'il est plus simple de travailler avec des expressions plutôt qu'avec des fonctions.
D'ailleurs demander à des élèves de terminale ce qu'est une fonction est un test intéressant.
En seconde c'est clair:
- Donnez moi un exemple de fonction.
- 2x+3
- x^2
J'aurais donc traité ce problème d'équation de tangente et son tracé un peu comme ça:

Code : Tout sélectionner

Tangente():={
local E,a,b,d,eq;
saisir("expression f(x)=",E,"abscisse du point",a);
afficher("l'équation réduite de la tangente au point d'abscisse "+a+" est:");
b:=subst(E,x=a);
d:=simplifier(subst(diff(E),x=a));
eq:=normal(d*(x-a)+b);
ClrGraph; 
plot(E,x=a-10..a+10);
vecteur([a,b],[a+5,subst(eq,x=a+5)],affichage=rouge);
vecteur([a,b],[a-5,subst(eq,x=a-5)],affichage=rouge);
retourne y=eq;
}
:;
Comment expliquer avec des mots simples pour les élèves la différence entre y=eq et "y="+eq ?

alain974
Messages : 104
Inscription : lun. mai 24, 2010 11:15 am

Re: Tracer la tangente à un fonction

Message par alain974 » mar. mars 01, 2011 9:23 am

Pierrette a écrit :En fait, des fois ca s'affiche, et des fois non...
je ne sais pas très bien comment configurer DispG...

Bonjour, je ne sais pas si ça peut aider mais j'ai eu un problème analogue parce que j'avais Xcas configuré en mode ti89. Des fois que ça viendrait de là aussi...

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

Re: Tracer la tangente à un fonction

Message par parisse » mar. mars 01, 2011 9:25 am

il faut probablement parler un peu de type: chaine, symbolique, entier exact, reel approche, qui d'une certaine maniere etendent les types d'objets qu'ils manipulent deja (entier, rationnel, decimal...). Je pense que la difference entre type chaine et type expression est plus facile a comprendre qu'entre rationnel (par ex. 5/2) et decimal (2.5), au sens ou j'imagine que pour beaucoup de collegues, la notation 2.5 peut signifier le rationnel 5/2 ce qui n'est pas le cas pour un logiciel de calcul formel.

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

Re: Tracer la tangente à un fonction

Message par alb » mer. mars 30, 2011 8:19 am

J'ai essayé de mettre un peu d'animation (je viens de découvrir cette fonction) dans le tracé d'une tangente

Code : Tout sélectionner

Tangente(E,a):={
// pour ne pas afficher le signe de f''
// on peut commenter les lignes 11,12,13,20
local b,d,eq,aff,d2,aff2;
b:=subst(E,x=a);
d:=simplifier(subst(diff(E),x=a));
si d>0 alors aff:="positif";fsi;
si d=0 alors aff:="nul";fsi;
si d<0 alors aff:="négatif";fsi;
d2:=simplifier(subst(diff(diff(E)),x=a));
si d2>0 alors aff2:="positif";fsi;
si d2=0 alors aff2:="nul";fsi;
si d2<0 alors aff2:="négatif";fsi;
eq:=normal(d*(x-a)+b);
Digits:=3;
plot(E,x=a-10..a+10),
segment(point(a,0),point(a,b),affichage=ligne_tiret),
legende(point(a,0),a,quadrant4),
legende(milieu([a,b],[a-2,subst(eq,x=a-2)]),"f'("+a+") est "+aff),
legende(milieu([a,b],[a+2,subst(eq,x=a+2)]),"f''("+a+") est "+aff2),
vecteur([a,b],[a+2,subst(eq,x=a+2)],affichage=rouge),
vecteur([a,b],[a-2,subst(eq,x=a-2)],affichage=rouge),
legende([10,50],"l'équation réduite de la tangente au point d'abscisse "+a+" est: "),
legende([10,70],"y="+eq),
legende([10,90],"ou approximativement: "),
legende([10,110],"y="+evalf(eq));
}
:;
TgteAnim(E,a,m,M,h):={
plot([E,diff(E),diff(diff(E))],x=m..M,color=[noir,bleu,vert],legende=["f","f'","f''"]),
animation(seq(Tangente(E,a),a,m,M,h));
}
Un exemple:
TgteAnim(x^3-3x^2-9x+2,a,-3,6,1/10)

En fait j'ai une question sur animation:
Peut-on passer en paramètre le temps d'affichage des objets graphiques ?
La valeur par défaut 0.2 me semble trop courte donc il faut utiliser à chaque appel cfg/animate
Dernière modification par alb le dim. avr. 10, 2011 8:18 pm, modifié 1 fois.

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

Re: Tracer la tangente à un fonction

Message par parisse » mer. mars 30, 2011 11:09 am

Oui, on peut regler le dt de la meme facon qu'on peut regler xmin xmax, avec gl_animate, par exemple

Code : Tout sélectionner

animate(sin(x*t),x=-pi..pi,t=-3..3,frames=30),gl_animate=0.5

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

Re: Tracer la tangente à un fonction

Message par alb » mer. mars 30, 2011 7:58 pm

Quelques petites améliorations.

Code : Tout sélectionner

Tangente(E,a):={
local b,d,d2,eq,aff;
b:=subst(E,x=a);
d:=simplifier(subst(diff(E),x=a));
d2:=simplifier(subst(diff(diff(E)),x=a));
eq:=normal(d*(x-a)+b);
si d2>0 alors
  aff:="f''("+a+")>0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est croissante",x=0,"f'("+a+")=0, f' est croissante","f'("+a+")<0, f' est croissante");
fsi;
si d2=0 alors
  aff:="f''("+a+")=0";
  f(x):=piecewise(x>0,"f'("+a+")>0",x=0,"f'("+a+")=0","f'("+a+")<0");
fsi;
si d2<0 alors
  aff:="f''("+a+")<0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est décroissante",x=0,"f'("+a+")=0, f' est décroissante","f'("+a+")<0, f' est décroissante");
fsi;
Digits:=3;
legende(point(a,b),"M"),
point([a,b],affichage=epaisseur_point_3+point_point),
plot(E,x=a-10..a+10),
segment(point(a,0),point(a,b),affichage=ligne_tiret),
legende(point(a,0),a,quadrant4),
legende(milieu([a,b],[a-2,subst(eq,x=a-2)]),f(d)),
legende(milieu([a,b],[a+2,subst(eq,x=a+2)]),aff),
vecteur([a,b],[a+2,subst(eq,x=a+2)],affichage=rouge),
vecteur([a,b],[a-2,subst(eq,x=a-2)],affichage=rouge),
legende([10,50],"l'équation réduite de la tangente au point M d'abscisse "+a+" est: "),
legende([10,70],"y="+eq),
legende([10,90],"ou approximativement: "),
legende([10,110],"y="+evalf(eq)),
legende([10,150],"f' (dé)croissante signifie f' (dé)croissante sur un intervalle ouvert non vide de centre "+a);
}
:;
TgteAnim(E,a,m,M,h):={
gl_animate=2.0,
plot([E,diff(E),diff(diff(E))],x=m..M,legende=["f","f'","f''"],affichage=[noir+epaisseur_ligne_3,bleu,vert]),
animation(seq(Tangente(E,a),a,m,M,h));
}
Je n'ai testé qu'un exemple, c'est donc sans garantie:
TgteAnim(x^3-3x^2-9x+2,a,-3,6,1/10)

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

Re: Tracer la tangente à un fonction

Message par alb » jeu. mars 31, 2011 9:55 pm

Pour visualiser la convexité de sin en faisant:
TgteAnim(sin(x),-2*pi,2*pi,pi/12)
j'ai dû modifier le programme:

Code : Tout sélectionner

Tangente(E,a):={
local b,d,d2,eq,aff,eveq;
b:=subst(E,x=a);
d:=simplifier(subst(diff(E),x=a));
d2:=simplifier(subst(diff(diff(E)),x=a));
eq:=normal(d*(x-a)+b);
eveq:=evalf(d)*x-evalf(d*a-b);//modif
a:=simplifier(a);//modif
si d2>0 alors
  aff:="f''("+a+")>0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est croissante",x=0,"f'("+a+")=0, f' est croissante","f'("+a+")<0, f' est croissante");
fsi;
si d2=0 alors
  aff:="f''("+a+")=0";
  f(x):=piecewise(x>0,"f'("+a+")>0",x=0,"f'("+a+")=0","f'("+a+")<0");
fsi;
si d2<0 alors
  aff:="f''("+a+")<0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est décroissante",x=0,"f'("+a+")=0, f' est décroissante","f'("+a+")<0, f' est décroissante");
fsi;
Digits:=3;
legende(point(a,b),"M"),
point([a,b],affichage=epaisseur_point_3+point_point),
plot(E,x=a-10..a+10),
segment(point(a,0),point(a,b),affichage=ligne_tiret),
legende(point(a,0),a,quadrant4),
legende(milieu([a,b],[a-2,subst(eq,x=a-2)]),f(d)),
legende(milieu([a,b],[a+2,subst(eq,x=a+2)]),aff),
vecteur([a,b],[a+2,subst(eq,x=a+2)],affichage=rouge),
vecteur([a,b],[a-2,subst(eq,x=a-2)],affichage=rouge),
legende([10,50],"l'équation réduite de la tangente au point M d'abscisse "+a+" est: "),
legende([10,70],"y="+eq),
legende([10,90],"ou approximativement: "),
legende([10,110],"y="+eveq),//modif
legende([10,150],"f' (dé)croissante signifie f' (dé)croissante sur un intervalle ouvert non vide de centre "+a);
}
:;
TgteAnim(E,m,M,h):={//modif
gl_animate=2.0,
plot([E,diff(E),diff(diff(E))],x=m..M,legende=["f","f'","f''"],affichage=[noir+epaisseur_ligne_3,bleu,vert]),
animation(seq(Tangente(E,a),a,m,M,h));
}
Si je fais:
TgteAnim((ln(x))^2,1,3,1/10)
pas de problème. Mais si je fais:
TgteAnim((ln(x))^2,1,4,1/10) les tests plantent.
J'essaie de vérifier l'origine de l'erreur avec:
E:=(ln(x))^2;
a:=1+27/10;
d:=simplifier(subst(diff(E),x=a));
d2:=simplifier(subst(diff(diff(E)),x=a));
d2>0;
La dernière ligne ne renvoie pas 0
Ai-je atteint une fois de plus les limites de Xcas ?

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

Re: Tracer la tangente à un fonction

Message par parisse » ven. avr. 01, 2011 6:09 am

Là on peut contourner le problème avec evalf(d2)>0.

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

Re: Tracer la tangente à un fonction

Message par parisse » ven. avr. 01, 2011 8:08 am

Bon, j'ai corrige le probleme, c'etait a cause de la taille du numerateur/denominateur de la fraction.

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

Re: Tracer la tangente à un fonction

Message par alb » ven. avr. 01, 2011 4:01 pm

Extra !
Je peux mettre en évidence l'abscisse exact du point d'inflexion avec:
(mais je n'ai pas testé cet exemple sur la version de hier)
TgteAnim((ln(x))^2,e/10,2*e,e/20)
En revanche:
TgteAnim((ln(x))^2,e/10,2*e,e/25)
ou
TgteAnim((ln(x))^2,e-2,e+1,1/10)
donnent unable to check test

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

Re: Tracer la tangente à un fonction

Message par parisse » ven. avr. 01, 2011 5:52 pm

La ca semble un dépassement de capacité dans l'évaluation numérique du test (je ne peux rien y faire car ce n'est pas une fraction), on peut le contourner en calculant d2 en multiprécision au lieu de le simplifier:

Code : Tout sélectionner

 d2:=evalf((subst(diff(diff(E)),x=a)),30);

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

Re: Tracer la tangente à un fonction

Message par alb » ven. avr. 01, 2011 8:54 pm

Il y a encore une chose qui m'échappe.
Je fais TgteAnim((ln(x))^2,e-2,e+1,1/10) avec deux versions pour le début du programme selon la position de a:=simplifier(a)
version1:

Code : Tout sélectionner

b:=subst(E,x=a);
d:=simplifier(subst(diff(E),x=a));
d2:=evalf((subst(diff(diff(E)),x=a)),30);
eq:=normal(d*(x-a)+b);
eveq:=evalf(d)*x-evalf(d*a-b);
a:=simplifier(a);
si d2>0 alors
  aff:="f''("+a+")>0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est croissante",x=0,"f'("+a+")=0, f' est croissante","f'("+a+")<0, f' est croissante");
fsi;
si d2=0 alors
  aff:="f''("+a+")=0";
  f(x):=piecewise(x>0,"f'("+a+")>0",x=0,"f'("+a+")=0","f'("+a+")<0");
fsi;
si d2<0 alors
  aff:="f''("+a+")<0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est décroissante",x=0,"f'("+a+")=0, f' est décroissante","f'("+a+")<0, f' est décroissante");
fsi;
Dans ce cas lorsque a vaut e c'est d2>0 qui est vrai (incorrect)

version2:

Code : Tout sélectionner

a:=simplifier(a);
b:=subst(E,x=a);
d:=simplifier(subst(diff(E),x=a));
d2:=evalf((subst(diff(diff(E)),x=a)),30);
eq:=normal(d*(x-a)+b);
eveq:=evalf(d)*x-evalf(d*a-b);
si d2>0 alors
  aff:="f''("+a+")>0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est croissante",x=0,"f'("+a+")=0, f' est croissante","f'("+a+")<0, f' est croissante");
fsi;
si d2=0 alors
  aff:="f''("+a+")=0";
  f(x):=piecewise(x>0,"f'("+a+")>0",x=0,"f'("+a+")=0","f'("+a+")<0");
fsi;
si d2<0 alors
  aff:="f''("+a+")<0";
  f(x):=piecewise(x>0,"f'("+a+")>0, f' est décroissante",x=0,"f'("+a+")=0, f' est décroissante","f'("+a+")<0, f' est décroissante");
fsi;
Dans ce cas lorsque a vaut e c'est d2=0 qui est vrai (correct)

La seconde version me satisfait mais je n'arrive pas à reproduire en dehors du programme l'erreur de la première version. En fait je ne comprends pas la différence entre a et simplifier(a) dans la suite des calculs.

Répondre