Source code for spherimatch.euclidean_vs_angular_distance_local

import numpy as np
from scipy.spatial.distance import euclidean
from .utilities_spherical import point_offset

'''
This script provides a detailed analysis of the discrepancies between Euclidean
and angular distances on a spherical coordinate system, particularly examining
how these discrepancies occur for various declinations and angular distances.

The script has two primary functionalities:

1. Compute Relative Error:
   For a given declination and angular distance, the script calculates the maximum
   relative error between the Euclidean and angular distances using the function:
      compute_error(declination, distance)
   This relative error highlights the deviation of the Euclidean approximation
   from the actual angular distance. Though primarily intended for error
   visualization, this function can also be utilized in other scripts, serving as
   an API for determining relative errors based on specific declination and
   angular distance inputs.

2. Visualize Errors: (Removed for brevity, see the original script in the backup branch)
   The script generates three main plots to enhance the understanding of these errors:

   a. Relative Error in Euclidean Distance vs. Declination (Top-left subplot):
      This plot shows how the relative error between Euclidean and angular distances
      varies with declination for different angular distances. Initially, the relative
      error grows slowly nearly as a constant. As declination increases, the error
      follows the trend of the transformation:
          transformed value = (1 - cos(Dec)) / cos(Dec)
      A reference line representing this transformation is plotted to offer a baseline
      comparison. This curve helps in illustrating how the error aligns with this
      cosine transformation.

      Limits:
      -------
      - For minimal angular separations (close to 0°), the relative error follows a power-law:
          error ≈ 1.2694 * 10^(-5) * d^2
        where d represents the angular distance in degrees.

      - Approaching an angular separation of 75°, the relative error aligns with:
          error ≈ (1 - cos(θ)) / cos(θ)

      These limiting behaviors illuminate the approximation error extremes across
      angular separations, guiding modeling efforts for errors across all angles.

   b. Angle Corresponding to Max Relative Error vs. Declination (Bottom-left subplot):
      This plot identifies the direction, represented by θ (theta), where the maximum
      discrepancy or relative error occurs for different declinations. θ is defined
      as the direction in degrees counter-clockwise from the positive DEC axis when
      viewed from the center of the celestial sphere.

   c. Fit of Relative Error vs. Angular Distance (Right subplot):
      Focusing on a near-zero declination, this subplot visualizes how the relative
      error varies with different angular distances. It contrasts observed data
      with a fitted curve, revealing the inherent relationship between relative
      error and angular distance at this specific declination.


Usage:
- Execute the script to generate the three plots described above. (Removed for brevity)
- Import compute_error() to calculate the relative error for a given declination
    and angular distance.

Note:
At low declinations, the maximum relative error typically arises when moving
in a diagonal direction around 45° from the DEC axis. This direction captures
more of the sphere's curvature compared to strictly horizontal or vertical
movements. As declination increases, the direction corresponding to the most
pronounced error shifts, becoming predominantly horizontal (θ = 90°).
'''


[docs] def compute_error(declination, distance): ''' Purpose: Compute the relative error in Euclidean distance given declination and angular distance. Parameters: - declination: float, the declination in degrees - distance: float, the angular distance in degrees Returns: - error: float, the computed relative error defined as (Euclidean - angular) / angular. ''' theta_values = np.linspace(0, 90, 100) # 100 sampling points for different directions max_error, _ = compute_max_relative_error(declination, distance, theta_values) return max_error
[docs] def compute_max_relative_error(dec, distances, theta_values): origin = (180, dec) offset_points_theta = np.array(point_offset(origin, distances, theta_values)) euclidean_distances_theta = np.array([euclidean(origin, offset_point) for offset_point in offset_points_theta.T]) relative_errors = np.abs((euclidean_distances_theta - distances) / distances) max_relative_error = np.max(relative_errors) angle_of_max_error = theta_values[np.argmax(relative_errors)] return max_relative_error, angle_of_max_error