View Raw SPL
/*****************************************************************************
*                                                                            *
*   BESSELY.SPL  Copyright (C) 2009 DSP Development Corporation              *
*                               All Rights Reserved                          *
*                                                                            *
*   Author:      Randy Race                                                  *
*                                                                            *
*   Synopsis:    Yv(z) bessel function of fractional order                   *
*                                                                            *
*   Revisions:    8 Nov 2009  RRR  Creation                                  *
*                                                                            *
*****************************************************************************/

#include 

#if @HELP_BESSELY

    BESSELY

    Purpose: Evaluates the Bessel function of the second kind, Yv(z)

    Syntax:  BESSELY(v, z, opt)

                 v - A real or real series, the order. The order must
                     be real but need not be an integer.

                 z - Any scalar or series. The input value, can be complex.

               opt - Optional. An integer, the scaling method.

                       0: no scaling (default)
                       1: scale by exp(-mag(imag(z)))

    Returns:
             A scalar or series, the value of Yv(z), where v is the order
             and z is the input.

    Example:
             bessely(0, 3)

             returns 0.376850, the value of Y0(3).

    Example:
             W1: 0..0.2..1
             W2: bessely(1, w1)

             Evaluates Y1(z) for z bewteen 0 and 1. W2 contains the series:

             {-inf, -3.323825, -1.780872, -1.260391, -0.978144, -0.781213}


    Example:
             bessely(3..9, 0..0.2..10)

             Evaluates the bessel function of the second kind for orders 3 
             through 9 with inputs from 0 to 10. Each column of the result
             contains the output for the specified order.

    Remarks:

             Bessel functions are solutions to the differential equation:

                 2
              2 d y     dy     2   2
             z  --- + z -- + (z - v ) y = 0
                  2
                dz      dz

             Yv(z) is a solution of the second kind. For for non-integer v:

                         Jv(z) cos(v pi) - J-v(z)
                Yv(z) =  ------------------------
                                sin(v pi)

             See YN for a faster evaluation of the bessel function of the
             second kind for strictly integer orders.

             If z is real and z < 0, the result is generally complex.

             BESSELY is based on a FORTRAN library written by Donald E. Amos.

   See Also:
             Besselh
             Besseli
             Besselj
             Besselk
             Jn
             Yn

 References:
             [1] Abramowitz and Stegun
                 Handbook of Mathematical Functions (9th printing 1970)
                 US Gov. Printing Office
                 Section 9.1.1, 9.1.89, 9.12

             [2] Amos, D.E.
                 A Subroutine Package for Bessel Functions of a Complex 
                 Argument and Nonnegative Order
                 Sandia National Laboratory Report
                 SAND85-1018, May, 1985. 

             [3] Amos, D.E. 
                 A Portable Package for Bessel Functions of a Complex
                 Argument and Nonnegative Order
                 Trans. Math. Software, 1986

#endif




/* bessel function of the second kind */
ITERATE bessely(v, z, opt)
{
        local y, scalarval;

        if (argc < 3)
        {
                if (argc < 2)
                {
                        if (argc < 1) error("besselj - input required");
                        
                        z = v;
                        v = 0;
                }
                
                opt = 0;
        }

        /* is input a single value */
        scalarval = not(isarray(v)) && not(isarray(z));

        /* use built-in */
        y = besselx("y", {z}, {v}, opt);

        if (scalarval) y = y[1];

        return(y);
}