Solving (systems of) non-linear equations?



Alasdair,

Here is an example which may help (tested Maxima 5.11.0, Windows)

(See http://personal.atl.bellsouth.net/e/d/edwin222/ellipsedevice.htm for 
mathematical background)

load("format/coeflist");
load("format/format");
load("Grobner/grobner.lisp");

poly_depends_varsp(ex,vars):=block([sov],sov:setify(listofvars(ex)),vars:setify(vars),subsetp(sov,vars))$

/* Takes a list of polynomials (Grobner basis) gb, and */
/* a list of variables vars, and returns the expressions in gb which 
depend only on the vars */
poly_isolate(gb,vars):= if listp(gb) then
                           if gb#[] then
                                 if poly_depends_varsp(first(gb),vars)
                                 then 
append([first(gb)],poly_isolate(rest(gb),vars))
                                 else poly_isolate(rest(gb),vars)
                           else []
                         else []$

/* Trammel of Archimedes */
/* (0,t): coordinate of one end of line, constrained to move on the y-axis 
*/
/* (s,0): coordinate of one end of line, constrained to move on the x-axis 
*/
/* (x,y): point on line */
P1:s^2+t^2-a^2;         /* line is of fixed length */
P2:s*y+t*x-s*t;         /* (x,y) lies on the line through (0,t) and (s,0) 
*/
P3:(x-s)^2+y^2-b^2;     /* constrain point on line to be b away from (s,0) 
*/
                         /* Note, this gives two solutions */
P4:x^2+(y-t)^2-(b-a)^2; /* constrain point on line to be b-a away from 
(0,t) */

sgen:ev([P1,P2,P3,P4]);

/*pg:poly_grobner(sgen,[s,t,a,b,x,y]);*/
prg:poly_reduced_grobner(sgen,[s,t,a,b,x,y]);

map(listofvars,prg);
map(lambda([ex],poly_depends_varsp(ex,[a,b,x,y])),prg);

sol:poly_isolate(prg,[a,b,x,y]);
/* Now we can really see that the trammel of Archemedes is an ellipse.... 
!*/
format(sol[1],%poly(y,x),factor);
print("This is an ellipse....");