Page 1 sur 2

Tracer la tangente à un fonction

Publié : lun. janv. 24, 2011 9:47 am
par Pierrette
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));
}

:;

Re: Tracer la tangente à un fonction

Publié : lun. janv. 24, 2011 12:01 pm
par parisse
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.

Re: Tracer la tangente à un fonction

Publié : lun. janv. 24, 2011 1:41 pm
par Pierrette
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 !

Re: Tracer la tangente à un fonction

Publié : mar. mars 01, 2011 7:56 am
par alb
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 ?

Re: Tracer la tangente à un fonction

Publié : mar. mars 01, 2011 9:23 am
par alain974
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...

Re: Tracer la tangente à un fonction

Publié : mar. mars 01, 2011 9:25 am
par parisse
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.

Re: Tracer la tangente à un fonction

Publié : mer. mars 30, 2011 8:19 am
par alb
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

Re: Tracer la tangente à un fonction

Publié : mer. mars 30, 2011 11:09 am
par parisse
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

Re: Tracer la tangente à un fonction

Publié : mer. mars 30, 2011 7:58 pm
par alb
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)

Re: Tracer la tangente à un fonction

Publié : jeu. mars 31, 2011 9:55 pm
par alb
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 ?

Re: Tracer la tangente à un fonction

Publié : ven. avr. 01, 2011 6:09 am
par parisse
Là on peut contourner le problème avec evalf(d2)>0.

Re: Tracer la tangente à un fonction

Publié : ven. avr. 01, 2011 8:08 am
par parisse
Bon, j'ai corrige le probleme, c'etait a cause de la taille du numerateur/denominateur de la fraction.

Re: Tracer la tangente à un fonction

Publié : ven. avr. 01, 2011 4:01 pm
par alb
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

Re: Tracer la tangente à un fonction

Publié : ven. avr. 01, 2011 5:52 pm
par parisse
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);

Re: Tracer la tangente à un fonction

Publié : ven. avr. 01, 2011 8:54 pm
par alb
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.