angles et longueurs des côtés d'un triangle

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

angles et longueurs des côtés d'un triangle

Message par alb » sam. oct. 02, 2010 5:45 pm

Pour construire des exercices sur les triangles, j'utilise ceci:

Code : Tout sélectionner

Angle_degre(A,B,C):={
local a,b,c,val,lm;
lm:=min(longueur(A,B),longueur(A,C))/10;
a:=A;
b:=A+(B-A)*(lm/longueur(A,B));
c:=A+(C-A)*(lm/longueur(A,C));
si simplifier(angle(A,B,C)-pi/2)==0 alors
  return carre(a,b),legende(affixe(similitude(a,sqrt(2),pi/4,b)),"90°");
fsi;
si simplifier(angle(A,B,C)+pi/2)==0 alors 
  return carre(a,c),legende(affixe(similitude(a,sqrt(2),pi/4,c)),"-90°");
fsi;
val:=round(angle(A,B,C)*180/pi,1);//valeur en degré à 0.1 près
return angle(A,B,C,val+"°");
}
:;
puis:

Code : Tout sélectionner

Triangle(A,B,C):={
local L;
S:=simplifier((1/2)*longueur(B,C)*sin(abs(angle(A,B,C))));
L:=triangle(A,B,C),
Angle_degre(A,B,C),Angle_degre(B,C,A),Angle_degre(C,A,B),
legende(milieu(A,B),cat(longueur(A,B))),
legende(milieu(B,C),cat(longueur(B,C))),
legende(milieu(C,A),cat(longueur(C,A))),
legende(point((1/3)*(A+B+C)),"S="+S);
return L;
}:;
En faisant:

Code : Tout sélectionner

A:=point(-4,-1);B:=point(4,-2);C:=point(-2,2);Triangle(A,B,C);
je n'obtiens pas l'angle droit en C, le pb venant me semble-t-il de b dans la fonction Angle_degre
Mais si je remplace C:=point(-2,2) par C:=point(-2,2.0) alors j'ai l'angle droit.
Si quelqu'un a une idée....

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

Re: angles et longueurs des côtés d'un triangle

Message par alb » sam. oct. 02, 2010 6:39 pm

Une erreur: faire S:=simplifier((1/2)*longueur(A,B)*longueur(A,C)*sin(abs(angle(A,B,C))))
La fonction Angle_degre n'est sûrement pas indispensable puisque angle suffit mais j'avais commencé ainsi et j'aimerais savoir où je me plante.

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

Re: angles et longueurs des côtés d'un triangle

Message par parisse » dim. oct. 03, 2010 6:46 am

Il semble que c'est l'addition point + symbolique (complexe exact) qui ne renvoie pas de point, contrairement à point+complexe inexact. Je vois 2 solutions pour contourner le problème pour l'instant, faire un evalf dans le calcul de b:= et c:=, ou travailler avec des affixes tout du long et mettre les point, etc. une fois le calcul fait.
P.S.: ça donne un affichage convaincant!

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

Re: angles et longueurs des côtés d'un triangle

Message par alb » lun. nov. 01, 2010 4:03 pm

J'ai modifié le programme en ajoutant quelques evalf et en essayant de tenir compte des cas où les coordonnées sont irrationnelles.

Code : Tout sélectionner

Angle_degre(A,B,C):={
  local a,b,c,val,lm;
  lm:=min(longueur(A,B),longueur(A,C))/10;
  a:=evalf(A);
  b:=evalf(A+(B-A)*lm/longueur(A,B));
  c:=evalf(A+(C-A)*lm/longueur(A,C));
  si simplifier(angle(A,B,C)-pi/2)==0 alors
    return carre(a,b),legende(affixe(similitude(a,sqrt(2),pi/4,b)),"90°");
  fsi;
  si simplifier(angle(A,B,C)+pi/2)==0 alors 
    return carre(a,c),legende(affixe(similitude(a,sqrt(2),pi/4,c)),"-90°");
  fsi;
  val:=round(angle(A,B,C)*180/pi,1);//valeur en degré à 0.1 près
  return angle(A,B,C,val+"°");
}
:;
Triangle(A,B,C):={
  local L,a,b,c,T,Titre,S,S2;
  T:=type(abscisse(A)),type(ordonnee(A)),type(abscisse(B)),type(ordonnee(B)),type(abscisse(C)),type(ordonnee(C));
  si member(DOM_SYMBOLIC,[T]) alors 
   //pour des coordonnees irrationnelles du type p+q*sqrt(k)
    Titre:=titre="les angles et le carré des longueurs des côtés";
    a:=simplifier(longueur2(B,C));
    b:=simplifier(longueur2(A,C));
    c:=simplifier(longueur2(A,B));
    S2:=simplifier((1/4)*b*c*(sin(abs(angle(A,B,C))))^2);
    si size(cat(S2))>49 alors //modifier 49 ? pour éviter affichage long ou rootof
       L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+round(sqrt(S2),1));
    sinon 
       L:=L,legende(point(evalf((1/3)*(A+B+C))),"S^2="+S2);
    fsi;
  sinon 
   //pour des coordonnees rationnelles
    Titre:=titre="les angles et les longueurs des côtés";
    a:=simplifier(longueur(B,C));
    b:=simplifier(longueur(A,C));
    c:=simplifier(longueur(A,B));
    S:=simplifier((1/2)*b*c*sin(abs(angle(A,B,C))));
    L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+S);
  fsi;
  L:=L,triangle(A,B,C),
  Angle_degre(A,B,C),Angle_degre(B,C,A),Angle_degre(C,A,B),
  legende(milieu(A,B),cat(c)),
  legende(milieu(B,C),cat(a)),
  legende(milieu(C,A),cat(b));
  return Titre,L;
}
:;
J'ai rencontré une première difficulté pour éviter l'affichage de rootof dans le cas de racine de racine: je n'ai rien trouvé de mieux que le test sur size(cat(S2)) pour renvoyer une valeur approchée de S2. D'où ma première question: comment tester si un résultat est un rootof ?
Ensuite j'ai tenté 3 exemples:
1)A:=point(-2*sqrt(2)+3,-1);B:=point(4,-4*sqrt(2));C:=point(-5+2*sqrt(2),-5*sqrt(2));
Triangle(A,B,C);
2)A:=point(9,5);B:=point(2,-2);C:=point(-6,6);
Triangle(A,B,C);
3)A:=point(-5,-1);B:=point(7*sqrt(2),-2);C:=point(-6,8*sqrt(3));
Triangle(A,B,C);
Ma deuxième question concerne ce troisième exemple, je modifie l'ordonnée de B pour la rendre positive, par exemple ceci:
A:=point(-5,-1);B:=point(7*sqrt(2),2);C:=point(-6,8*sqrt(3));
Triangle(A,B,C);
et là j'obtiens un crash qui pour simplifier est obtenu avec:
A:=point(-5,-1);B:=point(7*sqrt(2),2);C:=point(-6,8*sqrt(3));
a:=simplifier(longueur2(B,C));
b:=simplifier(longueur2(A,C));
c:=simplifier(longueur2(A,B));
simplifier((1/4)*b*c*(sin(abs(angle(A,B,C))))^2)

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

Re: angles et longueurs des côtés d'un triangle

Message par alb » lun. nov. 01, 2010 5:59 pm

J'aurais dû faire coiffeur !
Tout s'arrange avec S:=abs(aire(triangle(A,B,C)))
Restent deux questions:
1)comment détecter un rootof ?
2)A:=point(-5,-1+sqrt(3));B:=point(7*sqrt(2),2);C:=point(-6,8*sqrt(3));
pourquoi aire(triangle(A,B,C)) renvoie un résultat simplifié
alors que simplifier(longueur(A,B)) renvoie un rootof ?
Le programme modifié:

Code : Tout sélectionner

Angle_degre(A,B,C):={
  local a,b,c,val,lm;
  lm:=min(longueur(A,B),longueur(A,C))/10;
  a:=evalf(A);
  b:=evalf(A+(B-A)*lm/longueur(A,B));
  c:=evalf(A+(C-A)*lm/longueur(A,C));
  si simplifier(angle(A,B,C)-pi/2)==0 alors
    return carre(a,b),legende(affixe(similitude(a,sqrt(2),pi/4,b)),"90°");
  fsi;
  si simplifier(angle(A,B,C)+pi/2)==0 alors 
    return carre(a,c),legende(affixe(similitude(a,sqrt(2),pi/4,c)),"-90°");
  fsi;
  val:=round(angle(A,B,C)*180/pi,1);//valeur en degré à 0.1 près
  return angle(A,B,C,val+"°");
}
:;
Triangle(A,B,C):={
  local L,a,b,c,T,Titre,S;
  S:=abs(aire(triangle(A,B,C)));
  T:=type(abscisse(A)),type(ordonnee(A)),type(abscisse(B)),type(ordonnee(B)),type(abscisse(C)),type(ordonnee(C));
  si member(DOM_SYMBOLIC,[T]) alors 
   //pour des coordonnees irrationnelles du type p+q*sqrt(k)
    Titre:=titre="les angles et le carré des longueurs des côtés";
    a:=simplifier(longueur2(B,C));
    b:=simplifier(longueur2(A,C));
    c:=simplifier(longueur2(A,B));
    si size(cat(S))>29 alors //modifier 29 ? pour éviter affichage trop long
       L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+round(S,1));
    sinon 
       L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+S);
    fsi;
  sinon 
   //pour des coordonnees rationnelles
    Titre:=titre="les angles et les longueurs des côtés";
    a:=simplifier(longueur(B,C));
    b:=simplifier(longueur(A,C));
    c:=simplifier(longueur(A,B));
    L:=L,legende(point(evalf((1/3)*(A+B+C))),"S="+S);
  fsi;
  L:=L,triangle(A,B,C),
  Angle_degre(A,B,C),Angle_degre(B,C,A),Angle_degre(C,A,B),
  legende(milieu(A,B),cat(c)),
  legende(milieu(B,C),cat(a)),
  legende(milieu(C,A),cat(b));
  return Titre,L;
}
:;

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

Re: angles et longueurs des côtés d'un triangle

Message par parisse » mar. nov. 02, 2010 9:05 am

Merci pour le bug, je viens de le corriger, les binaires devraient etre mis a jour d'ici demain
(edit c'est fait pour win et linux 32 bits).
Concernant les rootof, on peut les detecter comme n'importe quel fonction au sommet d'un symbolique en testant
si sommet(variable)==rootof alors ...
Par exemple si a:=normal(sqrt(sqrt(2)+1)) (fraction contenant un rootof)
lvar(a) renvoie la liste des "variables" dont depend a, ici un rootof, donc sommet(l[0]) est egal a 'rootof'
Sinon, on est en train de reflechir a ajouter la detection des rootof qui sont solutions d'equations bicarrees, cela permettrait de reecrire un certain nombre de rootof sous une forme plus comprehensible pour le lycee. Concernant l'aire, elle est calculee en utilisant le determinant, ce qui evite d'introduire des racines carrees supplementaires (en general en geometrie, j'ai essaye d'appliquer des formules qui minimisent le nombre d'extensions algebriques).

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

Re: angles et longueurs des côtés d'un triangle

Message par alain974 » mer. nov. 03, 2010 9:49 am

parisse a écrit :des rootof qui sont solutions d'equations bicarrees, cela permettrait de reecrire un certain nombre de rootof sous une forme plus comprehensible pour le lycee.
Il y a des solutions d'équations bicarrées qui s'affichent déjà très bien: http://revue.sesamath.net/spip.php?article294 (article en cours d'évaluation, ne pas hésiter à le commenter, il sera publié définitivement à la fin du mois).

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

Re: angles et longueurs des côtés d'un triangle

Message par alb » jeu. nov. 04, 2010 10:20 pm

Un exercice ouvert qui permet de manipuler les commandes du menu Scolaire->seconde mais plutôt avec des élèves de Première:
Chercher un polynôme à coefficients entiers de degré 2 (resp 4) de telle sorte que sqrt(129+16*sqrt(2)) (resp sqrt(130+16*sqrt(2))) soit une racine de ce polynôme.
Pour ceux qui trouvent rapidement: factoriser ces polynômes ou bien trouver toutes les racines de ces polynômes.

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

Re: angles et longueurs des côtés d'un triangle

Message par parisse » ven. nov. 05, 2010 7:36 pm

alain974 a écrit :[
Il y a des solutions d'équations bicarrées qui s'affichent déjà très bien: http://revue.sesamath.net/spip.php?article294 (article en cours d'évaluation, ne pas hésiter à le commenter, il sera publié définitivement à la fin du mois).
J'ai une question proche du thème de l'article, que pensez-vous de l'input en 2-d? Après quelques essais, je ne l'ai pas mis par défaut, il semble que c'est finalement plus difficile à maitriser comme interface et surtout beaucoup plus difficile à éditer.

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

Re: angles et longueurs des côtés d'un triangle

Message par alain974 » sam. nov. 06, 2010 12:54 pm

parisse a écrit :que pensez-vous de l'input en 2-d?
J'en pense que je ne suis pas certain de comprendre la question. S'il s'agit de l'utilisation des flèches du clavier pour naviguer dans l'aborescence des expressions algébriques, je suis tout-à-fait pour en tant que prof, mes élèves ayant des lacunes dans ce domaine (je leur ai fait faire des exos sur le dessin d'arbres syntaxiques, qui les a intéressés). C'était d'ailleurs considéré comme un des atouts majeurs de la hp40: Déroutant au début, très pratique une fois qu'on est dedans. Mes rares élèves ayant eu une hp40 (ou 38) semblaient plutôt à l'aise avec.

Répondre