08-02-26.mw

> read("/home/scott/www/mat331.spr08/problems/lsq_data.txt");
 

defined line_pts(), bad_line_pts(), quadratic_pts(), cubic_pts(), and circle_pts()
 

> cdat:=circle_pts():
 

> plot(cdat,style=point);
 

Plot_2d
 

Idea:  Let's define the distance from [Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( to circle centered (a,b), radius r by  ( (x-a)Typesetting:-mrow(Typesetting:-mmultiscripts(Typesetting:-mrow(Typesetting:-mo( 

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

proc (a, b, r, pt) options operator, arrow; `+`(`*`(`^`(`+`(a, `-`(pt[1])), 2)), `*`(`^`(`+`(b, `-`(pt[2])), 2)), `-`(`*`(`^`(r, 2)))) end proc (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));
 

proc (a, b, r, data) options operator, arrow; sum(`*`(`^`(epsilon(a, b, r, data[i]), 2)), i = 1 .. nops(data)) end proc (2)
 

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

3058.072687 (3)
 

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

302.2526096 (4)
 

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

`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
`+`(`*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(10.26142699)), 2)), `*`(`^`(`+`(b, 3.654532623), 2)), `-`(`*`(`^`(r, 2)))), `*`(`+`(`*`(2, `*`(a)), `-`(20.52285398))))), `*`(2, `*`(`+`(`*`(`^`(`+`(a, `-`(8.0506...
(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});
 

{r = 0., a = 5.892081081, b = .6680745286}, {r = 0., a = `+`(6.407651753, `*`(2.337197998, `*`(I))), b = `+`(1.015424359, `*`(8.068340849, `*`(I)))}, {r = 0., a = `+`(7.295089262, `*`(9.124115275, `*`...
{r = 0., a = 5.892081081, b = .6680745286}, {r = 0., a = `+`(6.407651753, `*`(2.337197998, `*`(I))), b = `+`(1.015424359, `*`(8.068340849, `*`(I)))}, {r = 0., a = `+`(7.295089262, `*`(9.124115275, `*`...
{r = 0., a = 5.892081081, b = .6680745286}, {r = 0., a = `+`(6.407651753, `*`(2.337197998, `*`(I))), b = `+`(1.015424359, `*`(8.068340849, `*`(I)))}, {r = 0., a = `+`(7.295089262, `*`(9.124115275, `*`...
{r = 0., a = 5.892081081, b = .6680745286}, {r = 0., a = `+`(6.407651753, `*`(2.337197998, `*`(I))), b = `+`(1.015424359, `*`(8.068340849, `*`(I)))}, {r = 0., a = `+`(7.295089262, `*`(9.124115275, `*`...
{r = 0., a = 5.892081081, b = .6680745286}, {r = 0., a = `+`(6.407651753, `*`(2.337197998, `*`(I))), b = `+`(1.015424359, `*`(8.068340849, `*`(I)))}, {r = 0., a = `+`(7.295089262, `*`(9.124115275, `*`...
(6)
 

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

> crits[6];
 

{r = 6.076898279, b = .3298824448, a = 5.821085027} (7)
 

> subs(crits[6], r);
 

6.076898279 (8)
 

> subs(crits[4], r);
 

0. (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;
 

proc (s) options operator, arrow; if `<`(0, subs(s, r)) then true else false end if end proc (10)
 

> checkit(crits[3]);
 

false (11)
 

> select( checkit, {crits});
 

{{r = 6.076898279, b = .3298824448, a = 5.821085027}} (12)
 

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

{r = 6.076898279, b = .3298824448, a = 5.821085027} (13)
 

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

[`+`(5.821085027, `*`(6.076898279, `*`(cos(t)))), `+`(.3298824448, `*`(6.076898279, `*`(sin(t))))] (14)
 

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

[`+`(5.821085027, `*`(6.076898279, `*`(cos(t)))), `+`(.3298824448, `*`(6.076898279, `*`(sin(t)))), t = 0 .. `+`(`*`(2, `*`(Pi)))] (15)
 

> plot(mycircle,scaling=constrained);
 

Plot_2d
 

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

Plot_2d
 

>