123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- from ._ufuncs import (_spherical_jn, _spherical_yn, _spherical_in,
- _spherical_kn, _spherical_jn_d, _spherical_yn_d,
- _spherical_in_d, _spherical_kn_d)
- def spherical_jn(n, z, derivative=False):
- r"""Spherical Bessel function of the first kind or its derivative.
- Defined as [1]_,
- .. math:: j_n(z) = \sqrt{\frac{\pi}{2z}} J_{n + 1/2}(z),
- where :math:`J_n` is the Bessel function of the first kind.
- Parameters
- ----------
- n : int, array_like
- Order of the Bessel function (n >= 0).
- z : complex or float, array_like
- Argument of the Bessel function.
- derivative : bool, optional
- If True, the value of the derivative (rather than the function
- itself) is returned.
- Returns
- -------
- jn : ndarray
- Notes
- -----
- For real arguments greater than the order, the function is computed
- using the ascending recurrence [2]_. For small real or complex
- arguments, the definitional relation to the cylindrical Bessel function
- of the first kind is used.
- The derivative is computed using the relations [3]_,
- .. math::
- j_n'(z) = j_{n-1}(z) - \frac{n + 1}{z} j_n(z).
- j_0'(z) = -j_1(z)
- .. versionadded:: 0.18.0
- References
- ----------
- .. [1] https://dlmf.nist.gov/10.47.E3
- .. [2] https://dlmf.nist.gov/10.51.E1
- .. [3] https://dlmf.nist.gov/10.51.E2
- .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
- Handbook of Mathematical Functions with Formulas,
- Graphs, and Mathematical Tables. New York: Dover, 1972.
- Examples
- --------
- The spherical Bessel functions of the first kind :math:`j_n` accept
- both real and complex second argument. They can return a complex type:
- >>> from scipy.special import spherical_jn
- >>> spherical_jn(0, 3+5j)
- (-9.878987731663194-8.021894345786002j)
- >>> type(spherical_jn(0, 3+5j))
- <class 'numpy.complex128'>
- We can verify the relation for the derivative from the Notes
- for :math:`n=3` in the interval :math:`[1, 2]`:
- >>> import numpy as np
- >>> x = np.arange(1.0, 2.0, 0.01)
- >>> np.allclose(spherical_jn(3, x, True),
- ... spherical_jn(2, x) - 4/x * spherical_jn(3, x))
- True
- The first few :math:`j_n` with real argument:
- >>> import matplotlib.pyplot as plt
- >>> x = np.arange(0.0, 10.0, 0.01)
- >>> fig, ax = plt.subplots()
- >>> ax.set_ylim(-0.5, 1.5)
- >>> ax.set_title(r'Spherical Bessel functions $j_n$')
- >>> for n in np.arange(0, 4):
- ... ax.plot(x, spherical_jn(n, x), label=rf'$j_{n}$')
- >>> plt.legend(loc='best')
- >>> plt.show()
- """
- if derivative:
- return _spherical_jn_d(n, z)
- else:
- return _spherical_jn(n, z)
- def spherical_yn(n, z, derivative=False):
- r"""Spherical Bessel function of the second kind or its derivative.
- Defined as [1]_,
- .. math:: y_n(z) = \sqrt{\frac{\pi}{2z}} Y_{n + 1/2}(z),
- where :math:`Y_n` is the Bessel function of the second kind.
- Parameters
- ----------
- n : int, array_like
- Order of the Bessel function (n >= 0).
- z : complex or float, array_like
- Argument of the Bessel function.
- derivative : bool, optional
- If True, the value of the derivative (rather than the function
- itself) is returned.
- Returns
- -------
- yn : ndarray
- Notes
- -----
- For real arguments, the function is computed using the ascending
- recurrence [2]_. For complex arguments, the definitional relation to
- the cylindrical Bessel function of the second kind is used.
- The derivative is computed using the relations [3]_,
- .. math::
- y_n' = y_{n-1} - \frac{n + 1}{z} y_n.
- y_0' = -y_1
- .. versionadded:: 0.18.0
- References
- ----------
- .. [1] https://dlmf.nist.gov/10.47.E4
- .. [2] https://dlmf.nist.gov/10.51.E1
- .. [3] https://dlmf.nist.gov/10.51.E2
- .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
- Handbook of Mathematical Functions with Formulas,
- Graphs, and Mathematical Tables. New York: Dover, 1972.
- Examples
- --------
- The spherical Bessel functions of the second kind :math:`y_n` accept
- both real and complex second argument. They can return a complex type:
- >>> from scipy.special import spherical_yn
- >>> spherical_yn(0, 3+5j)
- (8.022343088587197-9.880052589376795j)
- >>> type(spherical_yn(0, 3+5j))
- <class 'numpy.complex128'>
- We can verify the relation for the derivative from the Notes
- for :math:`n=3` in the interval :math:`[1, 2]`:
- >>> import numpy as np
- >>> x = np.arange(1.0, 2.0, 0.01)
- >>> np.allclose(spherical_yn(3, x, True),
- ... spherical_yn(2, x) - 4/x * spherical_yn(3, x))
- True
- The first few :math:`y_n` with real argument:
- >>> import matplotlib.pyplot as plt
- >>> x = np.arange(0.0, 10.0, 0.01)
- >>> fig, ax = plt.subplots()
- >>> ax.set_ylim(-2.0, 1.0)
- >>> ax.set_title(r'Spherical Bessel functions $y_n$')
- >>> for n in np.arange(0, 4):
- ... ax.plot(x, spherical_yn(n, x), label=rf'$y_{n}$')
- >>> plt.legend(loc='best')
- >>> plt.show()
- """
- if derivative:
- return _spherical_yn_d(n, z)
- else:
- return _spherical_yn(n, z)
- def spherical_in(n, z, derivative=False):
- r"""Modified spherical Bessel function of the first kind or its derivative.
- Defined as [1]_,
- .. math:: i_n(z) = \sqrt{\frac{\pi}{2z}} I_{n + 1/2}(z),
- where :math:`I_n` is the modified Bessel function of the first kind.
- Parameters
- ----------
- n : int, array_like
- Order of the Bessel function (n >= 0).
- z : complex or float, array_like
- Argument of the Bessel function.
- derivative : bool, optional
- If True, the value of the derivative (rather than the function
- itself) is returned.
- Returns
- -------
- in : ndarray
- Notes
- -----
- The function is computed using its definitional relation to the
- modified cylindrical Bessel function of the first kind.
- The derivative is computed using the relations [2]_,
- .. math::
- i_n' = i_{n-1} - \frac{n + 1}{z} i_n.
- i_1' = i_0
- .. versionadded:: 0.18.0
- References
- ----------
- .. [1] https://dlmf.nist.gov/10.47.E7
- .. [2] https://dlmf.nist.gov/10.51.E5
- .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
- Handbook of Mathematical Functions with Formulas,
- Graphs, and Mathematical Tables. New York: Dover, 1972.
- Examples
- --------
- The modified spherical Bessel functions of the first kind :math:`i_n`
- accept both real and complex second argument.
- They can return a complex type:
- >>> from scipy.special import spherical_in
- >>> spherical_in(0, 3+5j)
- (-1.1689867793369182-1.2697305267234222j)
- >>> type(spherical_in(0, 3+5j))
- <class 'numpy.complex128'>
- We can verify the relation for the derivative from the Notes
- for :math:`n=3` in the interval :math:`[1, 2]`:
- >>> import numpy as np
- >>> x = np.arange(1.0, 2.0, 0.01)
- >>> np.allclose(spherical_in(3, x, True),
- ... spherical_in(2, x) - 4/x * spherical_in(3, x))
- True
- The first few :math:`i_n` with real argument:
- >>> import matplotlib.pyplot as plt
- >>> x = np.arange(0.0, 6.0, 0.01)
- >>> fig, ax = plt.subplots()
- >>> ax.set_ylim(-0.5, 5.0)
- >>> ax.set_title(r'Modified spherical Bessel functions $i_n$')
- >>> for n in np.arange(0, 4):
- ... ax.plot(x, spherical_in(n, x), label=rf'$i_{n}$')
- >>> plt.legend(loc='best')
- >>> plt.show()
- """
- if derivative:
- return _spherical_in_d(n, z)
- else:
- return _spherical_in(n, z)
- def spherical_kn(n, z, derivative=False):
- r"""Modified spherical Bessel function of the second kind or its derivative.
- Defined as [1]_,
- .. math:: k_n(z) = \sqrt{\frac{\pi}{2z}} K_{n + 1/2}(z),
- where :math:`K_n` is the modified Bessel function of the second kind.
- Parameters
- ----------
- n : int, array_like
- Order of the Bessel function (n >= 0).
- z : complex or float, array_like
- Argument of the Bessel function.
- derivative : bool, optional
- If True, the value of the derivative (rather than the function
- itself) is returned.
- Returns
- -------
- kn : ndarray
- Notes
- -----
- The function is computed using its definitional relation to the
- modified cylindrical Bessel function of the second kind.
- The derivative is computed using the relations [2]_,
- .. math::
- k_n' = -k_{n-1} - \frac{n + 1}{z} k_n.
- k_0' = -k_1
- .. versionadded:: 0.18.0
- References
- ----------
- .. [1] https://dlmf.nist.gov/10.47.E9
- .. [2] https://dlmf.nist.gov/10.51.E5
- .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
- Handbook of Mathematical Functions with Formulas,
- Graphs, and Mathematical Tables. New York: Dover, 1972.
- Examples
- --------
- The modified spherical Bessel functions of the second kind :math:`k_n`
- accept both real and complex second argument.
- They can return a complex type:
- >>> from scipy.special import spherical_kn
- >>> spherical_kn(0, 3+5j)
- (0.012985785614001561+0.003354691603137546j)
- >>> type(spherical_kn(0, 3+5j))
- <class 'numpy.complex128'>
- We can verify the relation for the derivative from the Notes
- for :math:`n=3` in the interval :math:`[1, 2]`:
- >>> import numpy as np
- >>> x = np.arange(1.0, 2.0, 0.01)
- >>> np.allclose(spherical_kn(3, x, True),
- ... - 4/x * spherical_kn(3, x) - spherical_kn(2, x))
- True
- The first few :math:`k_n` with real argument:
- >>> import matplotlib.pyplot as plt
- >>> x = np.arange(0.0, 4.0, 0.01)
- >>> fig, ax = plt.subplots()
- >>> ax.set_ylim(0.0, 5.0)
- >>> ax.set_title(r'Modified spherical Bessel functions $k_n$')
- >>> for n in np.arange(0, 4):
- ... ax.plot(x, spherical_kn(n, x), label=rf'$k_{n}$')
- >>> plt.legend(loc='best')
- >>> plt.show()
- """
- if derivative:
- return _spherical_kn_d(n, z)
- else:
- return _spherical_kn(n, z)
|