Текст подпрограммы и версий
sf11r_c.zip  sf11d_c.zip 
Тексты тестовых примеров
tsf11r_c.zip  tsf11d_c.zip 

Функция:  sf11r_c

Назначение

Вычисление модифицированной функции Ханкеля первого порядка K1 (x).

Математическое описание

Модифицированную функцию Ханкеля называют иногда модифицированной функцией Бесселя второго рода или функцией Макдональда.

sf11r_c вычисляет функцию K1 (x)   или   ex K1 (x) для вещественных положительных  x,  используя минимаксные приближения рациональными функциями.

J.F.Hart, E.W.Cheney, C.L.Lawson et al, Computer Approximations, Wiley, New Уork, 1968.

Использование

    real sf11r_c (real *x, integer *l, integer *ierr)

Параметры

x - заданное значение аргумента  x (тип: вещественный);
l - задает режим работы функции (тип: целый); при этом: если
l = 1 - вычисляется функция K1 (x);
l = 2 - вычисляется функция ex K1 (x);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы функции; при этом:
ierr=65 - когда условное число l ≠ 1 и ≠ 2; значение функции полагается равным 3.4e38;
ierr=66 - когда значение аргумента меньше 2.8e - 20; значение функции полагается равным 3.4e38;
ierr=67 - когда значение аргумента больше 44.36; значение функции полагается равным 0.

Версии

sf11d_c - вычисление модифицированной функции Ханкеля первого порядка K1 (x) с повышенной точностью.

Вызываемые подпрограммы

utsf10_c - подпрограмма выдачи диагностических сообщений при работе функции sf11r_c.
utsf11_c - подпрограмма выдачи диагностических сообщений при работе функции sf11d_c.

Замечания по использованию

 

Областью допустимых значений аргумента  x  для функции sf11r_c является отрезок 2.8e - 20 ≤ x ≤ 44.36, а для функции sf11d_c отрезок 1.7e - 308 ≤ x ≤ 2048. kpоме того, для функции sf11d_c аргумент  x  имеет тип двойной точности и при нарушении области допустимых значений функция sf11d_c полагается равной 1.7e308, а не 3.4e38 при ierr = 65 и ierr = 66.

Пример использования

int main(void)
{
    /* Local variables */
    extern float sf11r_c(float *, int *, int *);
    static int ierr, l;
    static float r__, x;

    x = .5f;
    l = 1;
    r__ = (float)sf11r_c(&x, &l, &ierr);

    printf("\n %16.7e %5i \n",x,l);
    printf("\n %5i %16.7e \n",ierr,r__);
    return 0;
} /* main */


Результаты:

       r__  =  1.65644112000
       ierr  =  0