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);
}
[Edit]correction de bug lignes 17 et 20