MathGroup Archive 1995

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: [mg 1129] Find the center!

  • To: mathgroup at christensen.cybernetics.net
  • Subject: [mg1170] Re: [mg1120] [mg 1129] Find the center!
  • From: Allan Hayes <hay at haystack.demon.co.uk>
  • Date: Sat, 20 May 1995 03:33:27 -0400

Gottfried Mayer-Kress <gmk at pegasos.ccsr.uiuc.edu> wrote in   
[mg1120] Find the center!

> There are a bunch of points in 3-space and they are supposed to be 
> scattered around the surface of a sphere. You want to find the
> center of the sphere and the radius.

Jorma Virtamo ([mg 1129]) gave a function for doing this.

In[1]:=
(*Virtamo*)
center[pts_] := Module[ {R,r=Plus@@pts/Length[pts]},
   { R =  Inverse[ Plus@@(Outer[Times,#-r,#-r]& /@ pts) ].
          Plus@@(#.#(#-r)& /@ pts)/2,
     Sqrt[Plus@@((#-R).(#-R)& /@ pts)/Length[pts]] } ]


We can use Fit and the standard equation for a circle to get a  
different function.

In[2]:=
CenterRad[pts_]:=
   Block[{data, f,g,h,c},
      data = {Sequence@@#,#.#}&/@pts;
      {c,f,g,h} = List@@Fit[data, {1,x,y,z}, {x,y,z}]/{1,2x,2y,2z};  
      {{f,g,h}, Sqrt[f^2+g^2+h^2 +c]}
   ]

This is faster than Virtamo's function on the test that he uses

TEST

First generate some points, roughly on a sphers center {1,2,3}, radius 1.

In[3]:=
rndnrm[x_] := (.98+.04Random[])x/Sqrt[x.x]

In[4]:=
points = ({1,2,3}+#)& /@ rndnrm /@ Table[Random[]-.5,{10},{3}];


Now try to find the center and radius

In[5]:=
CenterRad[points]
Do[CenterRad[points],{10}]//Timing//First

Out[5]=
	{{0.995855, 1.98329, 3.00476}, 1.00521}
Out[6]=
	0.55 Second

In[7]:=
center[points]
Do[center[points],{10}]//Timing//First
Out[7]=
	{{0.995855, 1.98329, 3.00476}, 1.00521}
Out[8]=
	1.46667 Second
	
Allan Hayes
hay at haystack.demon.co.uk


  • Prev by Date: Re: Sort[] accuracy problem, etc.
  • Next by Date: Kernel Shutting Down - Help
  • Previous by thread: Re: Sort[] accuracy problem, etc.
  • Next by thread: Kernel Shutting Down - Help