Résoudre une équation contenant des ln

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

Résoudre une équation contenant des ln

Message par alb » dim. janv. 02, 2011 4:02 pm

Bonjour et bonne année,
Pour construire et/ou vérifier des exercices du type
Résoudre ln(x*(x-1)*(x-2))=ln(5)+ln((x+1)*(x-3)) dans l'intervalle -inf..4
j'ai d'abord envisagé de détecter le contenu des ln. Trop compliqué !
Finalement j'ai décidé de demander à l'utilisateur d'entrer à la main les conditions de validité.
Voici ce que je propose:

Code : Tout sélectionner

ResoudreLog(E,F,a,b):={ // préciser les bornes a et b éventuellement -inf ou inf
local sol,L,res,temp,k,l,j,X,A,B;
ClrGraph;
A:=a;B:=b;
si A==-inf alors A:=-20 fsi;
si B==inf alors B:=20 fsi;
plot([E,F],x=A..B,couleur=[rouge,bleu],legende=["E","F"]);//graphes dans la fenêtre DispG
sol:=solve(E=F);
temp:=NULL;
pour j de 0 jusque size(sol)-1 faire //boucle pour éliminer les solutions hors de a..b
  si sol[j]>=a and sol[j]<=b alors
    temp:=temp,sol[j];
  sinon
    afficher(sol[j]+" n'est pas dans l'intervalle ["+a+","+b+"]")
  fsi;
fpour;
sol:=[temp];
saisir("écrire les expressions qui doivent être strictement positives 
sous la forme e1,e2,..ou NULL s'il n'y a pas de condition",L);
L:=[L];
si size(L)==0 ou size(sol)==0 alors
  return sol;
sinon
  res:=NULL;
  pour k de 0 jusque size(sol)-1 faire
    X:=0;
    pour l de 0 jusque size(L)-1 faire 
      si subst(L[l],x=sol[k])>0 alors
        X:=X+1;
      fsi;
    fpour;
    si X==size(L)alors
      res:=res,sol[k]
    sinon
      afficher(sol[k]+" ne convient pas")
    fsi;
  fpour;
return [res];
fsi;
}
:;
Pour me restreindre à une résolution sur un intervalle donné j'avais pensé à:
supposons(x>=a and x<=b);sol:=solve(E=F);
Malheureusement dans la fonction le supposons n'est pas pris en compte.
D'où ma première question: Pourquoi ?
J'ai alors opté pour une boucle qui élimine les solutions qui ne sont pas dans l'intervalle de résolution.
Du coup un exemple comme
ln(cos(x))=-ln(2) dans l'intervalle -4*pi..4*pi
ne marche pas avec All_trig_sol coché.
D'où ma seconde question: comment faire pour renvoyer les solutions de -4*pi..4*pi ?
NB:c'est un peu vite fait et je n'ai regardé que 3 exemples, il se peut qu'il y ait pas mal de grosses fautes.
Merci de me les signaler.

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

Re: Résoudre une équation contenant des ln

Message par alb » ven. janv. 07, 2011 2:40 pm

Suite à la correction du bug concernant supposons, j'ai modifié le programme:

Code : Tout sélectionner

ResoudreLog(E,F,a,b):={ // préciser les bornes a et b éventuellement -inf ou inf
local sol,L,res,temp,k,l,j,X,A,B,trigo;
ClrGraph;
A:=a;B:=b;
si A==-inf alors A:=-20 fsi;
si B==inf alors B:=20 fsi;
plot([E,F],x=A..B,couleur=[rouge,bleu],legende=["E","F"]);//graphes dans la fenêtre DispG
tantque trigo!="oui" et trigo!="non" faire
saisir_chaine("l'équation contient-elle des expressions trigonométriques ? (oui/non)",trigo);
ftantque;
si trigo=="oui" alors
  all_trig_solutions:=1;
  supposons(x>=a and x<=b);
  sol:=solve(E=F);
  all_trig_solutions:=0;
sinon
  sol:=solve(E=F);
  temp:=NULL;
  pour j de 0 jusque size(sol)-1 faire //boucle pour éliminer et afficher les solutions hors de a..b
    si sol[j]>=a and sol[j]<=b alors
      temp:=temp,sol[j];
    sinon
      afficher(sol[j]+" n'est pas dans l'intervalle ["+a+","+b+"]")
    fsi;
  fpour;
  sol:=[temp];
fsi;
tantque type(L)!=DOM_LIST et type(L)!=DOM_SYMBOLIC et type(L)!=DOM_IDENT faire
saisir("écrire les expressions qui doivent être strictement positives 
sous la forme e1,e2,..ou NULL s'il n'y a pas de condition",L);
ftantque;
L:=[L];
si size(L)==0 ou size(sol)==0 alors
  purge(x);
  return sol;
sinon
  res:=NULL;
  pour k de 0 jusque size(sol)-1 faire
    X:=0;
    pour l de 0 jusque size(L)-1 faire 
      si subst(L[l],x=sol[k])>0 alors
        X:=X+1;
      fsi;
    fpour;
    si X==size(L)alors
      res:=res,sol[k]
    sinon
      afficher(sol[k]+" ne convient pas")
    fsi;
  fpour;
purge(x);
return [res];
fsi;
}
Exemple1:

Code : Tout sélectionner

E:=ln(x*(x-1)*(x-2));F:=ln(5)+ln((x+1)*(x-3));ResoudreLog(E,F,-inf,4)
Exemple2:

Code : Tout sélectionner

E:=ln(cos(x));F:=-ln(2);simplifier(ResoudreLog(E,F,-pi,4*pi))
Un tout petit truc embêtant: la fenêtre de saisie ne prend pas toujours la totalité du message (il faut redimensionner).

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

Re: Résoudre une équation contenant des ln

Message par parisse » ven. janv. 07, 2011 4:08 pm

alb a écrit : Un tout petit truc embêtant: la fenêtre de saisie ne prend pas toujours la totalité du message (il faut redimensionner).
ah oui, il faudrait augmenter la taille du label du champ de saisie lorsqu'il est long, mais il faut aussi définir une taille à ne pas dépasser pour que le champ de saisie soit assez grand, par exemple 2/3 de la taille?

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

Re: Résoudre une équation contenant des ln

Message par alb » ven. janv. 07, 2011 8:05 pm

Avoir une hauteur de fenêtre minimale pour obtenir le texte rédigé comme dans le code sur plusieurs lignes, ce n'est pas possible ?
Par exemple:

Code : Tout sélectionner

saisir("écrire les expressions 
qui doivent être strictement positives 
sous la forme e1,e2,.. 
ou NULL s'il n'y a pas de condition",L);
texte qu'on retrouve dans sa totalité aligné à droite si la hauteur est suffisante.

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

Re: Résoudre une équation contenant des ln

Message par parisse » sam. janv. 08, 2011 6:53 am

je ne pense pas que ce soit possible avec le système actuel, car c'est un label. Il faudrait changer de widget pour la description du champ.

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

Re: Résoudre une équation contenant des ln

Message par alb » sam. janv. 08, 2011 8:35 am

Pourtant c'est déjà le cas, quand le texte est tapé sur plusieurs lignes dans le code, on le retrouve tel quel dans le label mais aligné à droite, seul souci la fenêtre doit être redimensionnée pour pouvoir lire le texte.

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

Re: Résoudre une équation contenant des ln

Message par parisse » lun. janv. 10, 2011 3:14 pm

Je viens de faire une mise a jour, dites-moi si ca convient mieux.

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

Re: Résoudre une équation contenant des ln

Message par alb » lun. janv. 10, 2011 9:04 pm

Je pense que c'est parfait, il suffit de ne pas dépasser une certaine longueur par ligne, revenir à la ligne si nécessaire et surtout ne pas indenter.

Répondre