Error Propagation Analysis
There is more to coding mathematical expressions than that of translating
them into C language. The email excerpts below prove that point.
The relative error of a product is the sum of
the relative errors of the factors. When forced to work with simple
precision (4 bytes), each value carries a relative error of +/-0.0000001.
This doesn't seem like much, but let's consider what happens when every
number in the following expression carries such an error:
latitude_table[i]= 180.0 / PI * acos(sqrt((1
- cos(PI / 30.0)) / (1 - cos(2 * PI / (i + 1)))));
The errors of the cos(x) and the sin(x)
functions, are equal to the error in the argument dx multiplied by the
function values of sin(x) or cos(x) respectively, this meaning that they are
a smaller than the error in the angle expressed in radians, but for the square roots,
the error is greater than that of the argument when it is less than one (as
the case goes). Same goes for the acos(x).
Let us neglect the multiplying
effect of the functions for the moment an just count the products. Functions
though, are solved by successive approximations algorithm and/or tables, meaning that, at
least, they introduce as mush error as if squaring the argument.
Even integer constants like 1 or 2 can not be
expressed exactly when promoted to floating point numbers, every single
product must be counted (division counts just as a product when propagating
errors).
The expression (1 - cos(PI / 30.0)) could be a
great contributor to the error.
cos(PI / 30.0) =
0.99452189536827333692269194498057
but the error of evaluating it in single
precision is +/-0.0000003
(1 - cos(PI / 30.0)) = -0.005478 +/-0.0000003
Relative error is 0.00006, this is 600 times the
contribution of a single product.
The error contribution of expression (1 - cos(2
* PI / (i + 1)), will be less for all i <59. For 25 degrees latitude (i =
53), the contribution to the error will be of 0.000044.
The 11 product operations will add to the total
too and that will bring it up to .0001 in a best case scenario. Actual
values have been seen farther off than that. In geodesic terms, this error
at 25 degrees is about
0.006 degrees or one sixth of a nautical mile (~1000 ft), this
accounts pretty well for the observed glitch.
If instead of making the table by calculating
the expression for each integer from 1 - 60, the table could go
hard coded
with values calculated using double precision in EXCEL. This way we can
bring down the above error to the tens of feet range (50 ft). Better yet, if
instead of one table, we split it in 2; a table of shorts for the degrees
and one of doubles for the fraction of degrees, then were are down to the
feet range (2 feet).
***************************************************************************************************
Before plunging into coding all this ECEF (Earth
Centered Earth Fixed reference system) stuff ,a task that I regard as a
fun one, I decided to do some math to estimate what kind of an error are
we introducing by considering a constant radius to the earth (the point
of going into ECEF is for dealing with a variable one).
The relative difference in earth radius from the
poles to the equator is 2.4 x 10-3. In the range we run our
intruders, which is 190 miles, the change in earth radius is only 8.4x10-5.
Ignoring such a change may introduce a maximum error in the Latitude or
Longitude of dynamic intruders of 0.15 minutes. This will have no
further implications than a very slight change in course of 0.05 seconds. I
don't think such a correction is necessary and more knowing that it comes
with a heavy toll in CPU usage.
This said, the spherical correction must be
introduced. Current algorithm neglects earth curvature and assumes nearness
to equator. this introduces errors in longitude greater than 10 minutes for
a 190 EW range when latitude goes above 20 degrees.
My proposition is to concentrate on that main
source of error and neglect the ellipsoid effect.