Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

My goal is to trace a ray down to the ground.

I have done:

{re, rp} = GeodesyData["ITRF00", #] & /@ {"SemimajorAxis", "SemiminorAxis"}
sat = {0, 2 re, 0};
point = Normalize[{.2, -1, .28}];
sol = FindRoot[GeoPosition[GeoPositionXYZ[sat + f point, "ITRF00"]][[1, 3]],{f,100}];

The idea is I'm starting at point sat with a ray in the direction of point. If this ray intersects with the earth there should be a point where GeoPosition[] will give a zero height. So far the results I have gotten seem right when I plot them and for simple cases but I get the following error messages:

GeoPositionXYZ::invcoord: {0.18911736861805847*f, 12756274 - 0.9455868430902923*f, 0.2647643160652819*f} is not a valid coordinate specification. >>
GeoPosition::invcoord: GeoPositionXYZ[{0.18911736861805847*f, 12756274 - 0.9455868430902923*f, 0.2647643160652819*f}, "ITRF00"] is not a valid coordinate specification. >>
Part::partw: Part 3 of GeoPositionXYZ[{0.189117 f,12756274-0.945587 f,0.264764 f},ITRF00] does not exist. >>
GeoPositionXYZ::invcoord: {#1, #2, #3} is not a valid coordinate specification. >>

Is there a better way to use GeoPosition[] with FindRoot[]?

share|improve this question
up vote 2 down vote accepted

There are two problems involved here. First, GeoPositionXYZ expects numeric arguments, which can be solved by defining an auxiliary function that only takes numeric arguments:

h[f_?NumericQ] := GeoPosition[GeoPositionXYZ[sat + f point, "ITRF00"]][[1, 3]]

The second is to use good starting values. Yours is much too low for the value range involved. Providing a second step as an indication of the initially required coarseness of the root search approach helps as well:

sol = FindRoot[h[f], {f, 1000000, 2000000}];

GeoPosition[GeoPositionXYZ[sat + f point /. sol, "ITRF00"]][[1, 3]]


share|improve this answer
Thank you this works well. Yes I know my starting values were poor. There are some simple calculations I can do to get good guesses. – c186282 Jul 7 '13 at 23:04

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.