215 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import numpy as np
 | |
| 
 | |
| from ._ufuncs import _ellip_harm
 | |
| from ._ellip_harm_2 import _ellipsoid, _ellipsoid_norm
 | |
| 
 | |
| 
 | |
| def ellip_harm(h2, k2, n, p, s, signm=1, signn=1):
 | |
|     r"""
 | |
|     Ellipsoidal harmonic functions E^p_n(l)
 | |
| 
 | |
|     These are also known as Lame functions of the first kind, and are
 | |
|     solutions to the Lame equation:
 | |
| 
 | |
|     .. math:: (s^2 - h^2)(s^2 - k^2)E''(s)
 | |
|               + s(2s^2 - h^2 - k^2)E'(s) + (a - q s^2)E(s) = 0
 | |
| 
 | |
|     where :math:`q = (n+1)n` and :math:`a` is the eigenvalue (not
 | |
|     returned) corresponding to the solutions.
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     h2 : float
 | |
|         ``h**2``
 | |
|     k2 : float
 | |
|         ``k**2``; should be larger than ``h**2``
 | |
|     n : int
 | |
|         Degree
 | |
|     s : float
 | |
|         Coordinate
 | |
|     p : int
 | |
|         Order, can range between [1,2n+1]
 | |
|     signm : {1, -1}, optional
 | |
|         Sign of prefactor of functions. Can be +/-1. See Notes.
 | |
|     signn : {1, -1}, optional
 | |
|         Sign of prefactor of functions. Can be +/-1. See Notes.
 | |
| 
 | |
|     Returns
 | |
|     -------
 | |
|     E : float
 | |
|         the harmonic :math:`E^p_n(s)`
 | |
| 
 | |
|     See Also
 | |
|     --------
 | |
|     ellip_harm_2, ellip_normal
 | |
| 
 | |
|     Notes
 | |
|     -----
 | |
|     The geometric interpretation of the ellipsoidal functions is
 | |
|     explained in [2]_, [3]_, [4]_. The `signm` and `signn` arguments control the
 | |
|     sign of prefactors for functions according to their type::
 | |
| 
 | |
|         K : +1
 | |
|         L : signm
 | |
|         M : signn
 | |
|         N : signm*signn
 | |
| 
 | |
|     .. versionadded:: 0.15.0
 | |
| 
 | |
|     References
 | |
|     ----------
 | |
|     .. [1] Digital Library of Mathematical Functions 29.12
 | |
|        https://dlmf.nist.gov/29.12
 | |
|     .. [2] Bardhan and Knepley, "Computational science and
 | |
|        re-discovery: open-source implementations of
 | |
|        ellipsoidal harmonics for problems in potential theory",
 | |
|        Comput. Sci. Disc. 5, 014006 (2012)
 | |
|        :doi:`10.1088/1749-4699/5/1/014006`.
 | |
|     .. [3] David J.and Dechambre P, "Computation of Ellipsoidal
 | |
|        Gravity Field Harmonics for small solar system bodies"
 | |
|        pp. 30-36, 2000
 | |
|     .. [4] George Dassios, "Ellipsoidal Harmonics: Theory and Applications"
 | |
|        pp. 418, 2012
 | |
| 
 | |
|     Examples
 | |
|     --------
 | |
|     >>> from scipy.special import ellip_harm
 | |
|     >>> w = ellip_harm(5,8,1,1,2.5)
 | |
|     >>> w
 | |
|     2.5
 | |
| 
 | |
|     Check that the functions indeed are solutions to the Lame equation:
 | |
| 
 | |
|     >>> import numpy as np
 | |
|     >>> from scipy.interpolate import UnivariateSpline
 | |
|     >>> def eigenvalue(f, df, ddf):
 | |
|     ...     r = (((s**2 - h**2) * (s**2 - k**2) * ddf
 | |
|     ...           + s * (2*s**2 - h**2 - k**2) * df
 | |
|     ...           - n * (n + 1)*s**2*f) / f)
 | |
|     ...     return -r.mean(), r.std()
 | |
|     >>> s = np.linspace(0.1, 10, 200)
 | |
|     >>> k, h, n, p = 8.0, 2.2, 3, 2
 | |
|     >>> E = ellip_harm(h**2, k**2, n, p, s)
 | |
|     >>> E_spl = UnivariateSpline(s, E)
 | |
|     >>> a, a_err = eigenvalue(E_spl(s), E_spl(s,1), E_spl(s,2))
 | |
|     >>> a, a_err
 | |
|     (583.44366156701483, 6.4580890640310646e-11)
 | |
| 
 | |
|     """  # noqa: E501
 | |
|     return _ellip_harm(h2, k2, n, p, s, signm, signn)
 | |
| 
 | |
| 
 | |
| _ellip_harm_2_vec = np.vectorize(_ellipsoid, otypes='d')
 | |
| 
 | |
| 
 | |
| def ellip_harm_2(h2, k2, n, p, s):
 | |
|     r"""
 | |
|     Ellipsoidal harmonic functions F^p_n(l)
 | |
| 
 | |
|     These are also known as Lame functions of the second kind, and are
 | |
|     solutions to the Lame equation:
 | |
| 
 | |
|     .. math:: (s^2 - h^2)(s^2 - k^2)F''(s)
 | |
|               + s(2s^2 - h^2 - k^2)F'(s) + (a - q s^2)F(s) = 0
 | |
| 
 | |
|     where :math:`q = (n+1)n` and :math:`a` is the eigenvalue (not
 | |
|     returned) corresponding to the solutions.
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     h2 : float
 | |
|         ``h**2``
 | |
|     k2 : float
 | |
|         ``k**2``; should be larger than ``h**2``
 | |
|     n : int
 | |
|         Degree.
 | |
|     p : int
 | |
|         Order, can range between [1,2n+1].
 | |
|     s : float
 | |
|         Coordinate
 | |
| 
 | |
|     Returns
 | |
|     -------
 | |
|     F : float
 | |
|         The harmonic :math:`F^p_n(s)`
 | |
| 
 | |
|     See Also
 | |
|     --------
 | |
|     ellip_harm, ellip_normal
 | |
| 
 | |
|     Notes
 | |
|     -----
 | |
|     Lame functions of the second kind are related to the functions of the first kind:
 | |
| 
 | |
|     .. math::
 | |
| 
 | |
|        F^p_n(s)=(2n + 1)E^p_n(s)\int_{0}^{1/s}
 | |
|        \frac{du}{(E^p_n(1/u))^2\sqrt{(1-u^2k^2)(1-u^2h^2)}}
 | |
| 
 | |
|     .. versionadded:: 0.15.0
 | |
| 
 | |
|     Examples
 | |
|     --------
 | |
|     >>> from scipy.special import ellip_harm_2
 | |
|     >>> w = ellip_harm_2(5,8,2,1,10)
 | |
|     >>> w
 | |
|     0.00108056853382
 | |
| 
 | |
|     """
 | |
|     with np.errstate(all='ignore'):
 | |
|         return _ellip_harm_2_vec(h2, k2, n, p, s)
 | |
| 
 | |
| 
 | |
| def _ellip_normal_vec(h2, k2, n, p):
 | |
|     return _ellipsoid_norm(h2, k2, n, p)
 | |
| 
 | |
| 
 | |
| _ellip_normal_vec = np.vectorize(_ellip_normal_vec, otypes='d')
 | |
| 
 | |
| 
 | |
| def ellip_normal(h2, k2, n, p):
 | |
|     r"""
 | |
|     Ellipsoidal harmonic normalization constants gamma^p_n
 | |
| 
 | |
|     The normalization constant is defined as
 | |
| 
 | |
|     .. math::
 | |
| 
 | |
|        \gamma^p_n=8\int_{0}^{h}dx\int_{h}^{k}dy
 | |
|        \frac{(y^2-x^2)(E^p_n(y)E^p_n(x))^2}{\sqrt((k^2-y^2)(y^2-h^2)(h^2-x^2)(k^2-x^2)}
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     h2 : float
 | |
|         ``h**2``
 | |
|     k2 : float
 | |
|         ``k**2``; should be larger than ``h**2``
 | |
|     n : int
 | |
|         Degree.
 | |
|     p : int
 | |
|         Order, can range between [1,2n+1].
 | |
| 
 | |
|     Returns
 | |
|     -------
 | |
|     gamma : float
 | |
|         The normalization constant :math:`\gamma^p_n`
 | |
| 
 | |
|     See Also
 | |
|     --------
 | |
|     ellip_harm, ellip_harm_2
 | |
| 
 | |
|     Notes
 | |
|     -----
 | |
|     .. versionadded:: 0.15.0
 | |
| 
 | |
|     Examples
 | |
|     --------
 | |
|     >>> from scipy.special import ellip_normal
 | |
|     >>> w = ellip_normal(5,8,3,7)
 | |
|     >>> w
 | |
|     1723.38796997
 | |
| 
 | |
|     """
 | |
|     with np.errstate(all='ignore'):
 | |
|         return _ellip_normal_vec(h2, k2, n, p)
 |