igrf-0.2.0.0: src/Math/SphericalHarmonics/AssociatedLegendre.hs
-- | Provides definitions of associated Legendre functions used in spherical harmonic models.
module Math.SphericalHarmonics.AssociatedLegendre
(
associatedLegendreFunction
, schmidtSemiNormalizedAssociatedLegendreFunction
)
where
import Math.Polynomial hiding (x)
import Math.Polynomial.Legendre
-- definition from http://www.mathworks.com/help/matlab/ref/legendre.html#f89-998354
-- | Computes the associated Legendre function of degree 'n' and order 'm'.
-- Note that the resulting function may not be a polynomial, as when `m` is odd it involves a fractional power of `x`.
-- As used in the geodesy and magnetics literature, these functions do not include the Condon-Shortley phase.
associatedLegendreFunction :: (Floating a, Ord a) => Int -- ^ Degree 'n' of the desired associated Legendre function.
-> Int -- ^ Order 'm' of the desired associated Legendre function.
-> a -> a
associatedLegendreFunction n m = f
where
f x = (nonPolyTerm x) * (evalPoly p' x)
nonPolyTerm x = (1 - (x * x)) ** (fromIntegral m / 2)
p' = polyDerivs p !! m
p = legendre n
-- definition from http://www.mathworks.com/help/matlab/ref/legendre.html#f89-998354
-- | Computes the Schmidt semi-normalized associated Legendre function of degree 'n' and order 'm'.
-- As used in the geodesy and magnetics literature, these functions do not include the Condon-Shortley phase.
schmidtSemiNormalizedAssociatedLegendreFunction :: (Floating a, Ord a) => Int -- ^ Degree 'n' of the desired function.
-> Int -- ^ Order 'm' of the desired function.
-> a -> a
schmidtSemiNormalizedAssociatedLegendreFunction n 0 = associatedLegendreFunction n 0
schmidtSemiNormalizedAssociatedLegendreFunction n m = (* factor) . associatedLegendreFunction n m
where
factor = (sqrt $ 2 / rawFactor)
rawFactor = fromIntegral $ rawFactor' (fromIntegral n) (fromIntegral m)
rawFactor' :: Integer -> Integer -> Integer
rawFactor' n m = product . map (max 1) $ enumFromTo (n - m + 1) (n + m)