Bonjour,
  J'utilise maxima depuis environ une semaine, il est donc fort possible que
j'aie commis une erreur. J'ai un programme dans lequel une application de la
fonction 'ratsimp' modifie le résultat. La documentation de cette fonction me
laissait croire, en tant que simplification, que le résultat devait être égal à
l'argument, exprimé différemment, mais c'est peut-être là que je commets une
erreur.

  Plus en détails je génère un ensemble de droites, par paires parallèles. Je
génère ensuite l'ensemble des points d'intersection de ces droites, et je
cherche ensuite l'ensemble des points qui sont situés entre les deux droites de
chaque paire parallèle. A la base, en fait, j'ai un domaine dont je veux
calculer l'aire. Il est défini par un ensemble d'équations (0<=ax + by + c <=1).
S'il existe une solution plus imple je suis preneur aussi.

  Une droite correspondant à l'équation (ax+by+c=0) est codée par ([a,b,c]).
Le programme d'intersection de deux droites est

intersectDroite(droite1,droite2):=
  block([result,det,a1,b1,c1,a2,b2,c2],
    [a1,b1,c1] : droite1,
    [a2,b2,c2] : droite2,
    det : a2*b1-a1*b2,
    if det=0
    then return([])
    else return([(b2*c1-b1*c2)/det,(a1*c2-a2*c1)/det])
  );

  Si à la place de la dernière ligne je mets
return(ratsimp([(b2*c1-b1*c2)/det,(a1*c2-a2*c1)/det])), le résultat de
l'algorithme sera différent. Je vous donne également le détail du calcul
ensuite, et je vous joints le fichier .mac

  Ensuite je réalise l'algo suivant :

genIntersectPoints(droites) :=
  block([copydroites,mypoints,tag],
    copydroites:copylist(droites),

/* generation de l'ensemble des points d'intersections, le listify(setify()) est
le mieux que j'aie trouvé pour retirer les doublons. Le 1 à la fin des
coordonnées du point sert à faire un produit scalaire avec le vecteur de la
droite pour calculer le positionnement du point par rapport à la droite */

mypoints:listify(setify(create_list(endcons(1,intersectDroite(d1,d2)),d1,droites,d2,copydroites
: rest(copydroites,1)))),
/*suppression des solutions invalides, lorsqu'on a intersecté des droites
parallèles*/
    mypoints : delete([1],mypoints),

/*les droites sont dans un ordre qui fait qu'alternativement, on cherche un
point tel que p.d <= 0 puis p.d >= 0*/
    tag:false,

    for d in droites do
    block([tmpoints],
      tmpoints:[],
      for p in mypoints do
      block([test],
        test : p.d,
        if tag then test : -test,
        if test>=0
        then
          tmpoints : cons(p,tmpoints)
      ),
      mypoints : copylist(tmpoints),
      tag : not tag
    ),

    mypoints : create_list([p[1],p[2]],p,mypoints),
    return(mypoints)
  );

Le retour de cette fonction me donne 5 points, les bons, sans ratsimp, et moins
de points lorsque j'utilise ratsimp.

merci de votre attention et désolé d'avance si le problème vient de mon novisme.
Cordialement,
Vincent Nivoliers

Attachment: computePolygons.mac
Description: Binary data

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Maxima-lang-fr mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr

Répondre à