On Fri, Aug 8, 2008 at 10:35 AM, Charles R Harris
<charlesr.har...@gmail.com> wrote:
>
>
> On Mon, Aug 4, 2008 at 11:48 AM, Zane Selvans <z...@ideotrope.org> wrote:
>>
>> Does anyone out there happen to know a simple algorithm for least
>> squares fitting a great circle to a given set of lat/lon points on a
>> sphere?  Seems like it might not be a crazy thing to add to the library.
>
>
> Depends on whether you need distance along the sphere surface or not. But if
> you can deal with saggital distances it reduces to an eigenvalue problem.
> Represent the great circle by a unit vector u perpindicular to the plane
> that determined by the great circle, then minimize the sum
>
> \sum_{i=1}^{n} |dot(u,x_i)|^2
>
> which you can rewrite by setting
>
> A = \sum_{i=1}^{n} (x_i * x^T_i)
>
> so that you end up minimizing
>
> u^T * A * u
>
> subject to the constraint u^T * u = 1. The vector u is then the eigenvector
> corresponding to the smallest eigenvalue of A.
>
> Chuck

I finally ended up needing to implement great circle fitting, and went
ahead and implemented the suggestion below (yes, more than 8 months
later...).  I don't think it's quite right though.  The quantity to
minimize is u^T*A*u, but doing so doesn't make u one of the
eigenvectors of A, does it?

I generated a perfect great circle segment (as a series of lon,lat
points using spherical reckoning) and found its corresponding pole
(good_u) by going pi/2 radians away from it on the sphere,
perpendicular to its path.

I also converted the series of lon,lat points into x,y,z vectors (on
the unit sphere), and constructed A as:

In [552]: A = dot(array([x,y,z]),array([x,y,z]).transpose())

and then found the eigenvalues/vectors:

In [553]: eigvals_A, eigvecs_A = eig(A)

and none of them corresponds to the good_u which I found above, and
they don't minimize the product:

In [554]: [ dot(dot(eigvecs_A[N],A),eigvecs_A[N].transpose()) for N in
range(3) ]
Out[554]: [42.058431684800112, 25.787798426739176, 22.153769888460737]

whereas good_u does.

In [555]: dot(dot(good_u,A),good_u.transpose())
Out[555]: -5.9120729242764932e-15

Have I misunderstood something here?  It's not immediately obvious to
me why choosing u such that it minimizes u^T * A * u would make it an
eigenvector of A.  It has been a long time since I took linear algebra
though...

Thanks for any insights,
Zane

-- 
Zane A. Selvans
Amateur Earthling
http://zaneselvans.org
+1 303 815 6866

------------------------------------------------------------------------------
Stay on top of everything new and different, both inside and 
around Java (TM) technology - register by April 22, and save
$200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.
300 plus technical and hands-on sessions. Register today. 
Use priority code J9JMT32. http://p.sf.net/sfu/p
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to