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
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
