08-02-26.mw

 > cdat:=circle_pts():

 > plot(cdat,style=point);

Idea:  Let's define the distance from [ to circle centered (a,b), radius r by  ( (x-a)

 > epsilon:=(a,b,r,pt) -> (a-pt[1])^2 + (b-pt[2])^2 - r^2;

 (1)

Now minimize sums of squares of that.

 > E:=(a,b,r,data) -> sum( (epsilon(a,b,r,data[i])^2), i=1..nops(data));

 (2)

 > E(6,0,7,cdat);

 (3)

 > E(6,0,6,cdat);

 (4)

 > diff(E(a,b,r,cdat),a);

 (5)

 > crits:=solve( { diff(E(a,b,r,cdat),a)=0, diff(E(a,b,r,cdat),b)=0, diff(E(a,b,r,cdat),r)=0},        {a,b,r});

 (6)

The 6th answer is reasonable, the others are crazy.

 > crits[6];

 (7)

 > subs(crits[6], r);

 (8)

 > subs(crits[4], r);

 (9)

 > select( h -> subs(h,r) > 0, crits);

 Error, selecting function must return true or false

 > select( h -> if (subs(h,r) > 0) then true else false fi, crits);

 Error, (in unknown) cannot determine if this expression is true or false: 0 < r

 > checkit:= s-> if (subs(s,r) > 0) then true else false fi;

 (10)

 > checkit(crits[3]);

 (11)

 > select( checkit, {crits});

 (12)

 > mysol:=op(select( checkit, {crits}));

 (13)

 > mycircle:= subs(mysol, [a+r*cos(t),b+r*sin(t)]);

 (14)

 > mycircle:= subs(mysol, [a+r*cos(t),b+r*sin(t), t=0..2*Pi]);

 (15)

 > plot(mycircle,scaling=constrained);

 > plots[display]( [plot(mycircle,color=blue), plot(cdat,style=point,color=green)]);

 >