Tangentes à une courbe

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

Tangentes à une courbe

Message par alb » sam. août 27, 2011 8:18 pm

Pour fabriquer des exercices sur le thème "tangentes à une courbe passant par un point" je me suis préparé ce petit programme qui me sera utile surtout en mode exact. J'ai testé sur quelques exemples standards (poly,fracrat,sqrt,ln,exp). N'hésitez pas à me signaler les cas manifestement incorrects.
REMARQUE si j'ai unable to isolate etc :
1/ je m'arrange dans l'écran DispG pour que le futur dessin montre les tangentes présumées
2/ je change l'option 1 en 0
3/ la courbe bleue me donne les intervalles demandés
QUESTION Comment expliquer sommairement que
fsolve(2-exp(x)=exp(x)*(2-x),x,a,newton_solver)
renvoie la plus petite solution pour toute valeur de a ?

Code : Tout sélectionner

/********** Tangentes à une courbe passant par un point P **********/
//Renvoie coordonnées des points de tangence et équations  réduites des tangentes dans une liste, affiche le graphique dans DispG
TangentesCourbe(T,u,v,opt):={//T expression, u et v coordonnées de P, opt=0 si approx et 1 si exact
  local G,sol,s,k,j,L;global x;
  DispG;ClrGraph;G:=plot(T,x=-20..20,affichage=epaisseur_ligne_2,xstep=0.001);//modifier -20..20 ?
  legende(point(u,v),"P");
  DIGITS:=4;
  si opt==1 alors
    sol:=resoudre(v-T=diff(T)*(u-x));//résolution exacte, evalf(ans()) donnera les approx
  fsi
  // si on obtient unable to isolate x in ... conjecturez les intervalles en utilisant les points d'intersection
  // de la courbe bleue avec l'axe des abscisses et recommencez avec opt=0
  si opt==0 alors
    sol:=NULL;
    plot(v-T-diff(T)*(u-x),x=-20..20,couleur=bleu,xstep=0.001);// pour mieux voir les intervalles
    saisir("Séquencez des intervalles contenant \nles abscisses des points de tangence\npar exemple -3.2..0.2,2..7",L);
    L:=[L];
    pour k de 0 jusque size(L)-1 faire
      //bisection_solver car les méthodes type newton ne donnent pas toutes les solutions
      sol:=sol,moyenne(resoudre_numerique(v-T=diff(T)*(u-x),x,L[k],bisection_solver))//résolution approchée
    fpour
    sol:=[sol];
  //sol:=resoudre_numerique(v-T=T'*(u-x));//résolution approchée
  //sol:=set[op(sol)]; // pour racines multiples
  fsi
  s:=size(sol);
  si s==0 alors
    afficher("Il n'est pas possible de construire une droite passant par P et tangente à la courbe");
    retourne []
  fsi
  si s==1 alors
    afficher("Une seule droite passant par P est tangente à la courbe");
    point(sol[0],simplifier(subst(T,x=sol[0])),affichage=epaisseur_point_3);
    retourne [sol[0],simplifier(subst(T,x=sol[0])),equation(tangente(G,sol[0],couleur=rouge))]
  fsi
  afficher(s+" droites passent par P et sont tangentes à la courbe");
  seq(point([sol[j],simplifier(subst(T,x=sol[j]))],affichage=epaisseur_point_3),j,0,s-1);
  retourne seq(append([sol[j],simplifier(subst(T,x=sol[j]))],equation(tangente(G,sol[j],couleur=rouge))),j,0,s-1);
}
Par exemple TangentesCourbe((3x²-2x-1)/(1+x²),0,-1,1)
[Edit]correction de bug lignes 17 et 20
Dernière modification par alb le jeu. déc. 22, 2011 3:06 pm, modifié 1 fois.

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

Re: Tangentes à une courbe

Message par parisse » dim. août 28, 2011 9:41 am

Pour le fsolve, il faut etre assez proche de la 2eme solution pour converger vers elle, avec 2.5 par exemple.

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

Re: Tangentes à une courbe

Message par alb » dim. août 28, 2011 12:27 pm

J'avais par erreur réglé par défaut epsilon à 1e-15 ce qui expliquerait que newton_solver renvoyait toujours la même valeur et parfois undef ?
Je pourrais donc utiliser cette méthode dans mon programme mais bisection_solver me semble plus sûr pour trouver toutes les solutions.

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

Re: Tangentes à une courbe

Message par parisse » dim. août 28, 2011 1:26 pm

oui, bisection_solver est beaucoup plus sur, meme si il converge un peu moins vite a la fin (mais ca ne se voit de toutes facons pas en precision normale sur un PC).

Répondre