Текст подпрограммы и версий
sfg6r_c.zip  sfg6d_c.zip 
Тексты тестовых примеров
tsfg6r_c.zip  tsfg6d_c.zip 

Подпрограмма:  sfg6r_c

Назначение

Вычисление неполной бета - функции  Ix (a, b) .

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

Подпрограмма - функция sfg6r_c вычисляет неполную бета - функцию

       Ix(a, b)  =  Bx(a, b) / B(a, b)  =
                                                                     x
                                             =  1/ B(a, b)    ∫   t a -1 (1 - t)b -1 dt
                                                                   0 

где  0 ≤ x ≤ 1,  a > 0,  b > 0,  B (a, b) - значение (полной) бета - функции от параметров  a и  b.

Если  x < (a + 1) / (a + b + 1), то используется представление  Ix (a, b) в виде непрерывной дроби:

  Ix(a, b)  =  [ xa  (1 - x)b / (a B(a, b) ) ]  [ 1/(1+ d1/(1+ d2/(1+ ... ))) ]   , 
 где
           d2m+1  =  - [(a + m) (a + b + m) x ] / [(a + 2m) (a + 2m + 1)]
           d2m     =   [ m (b - m) x] / [(a + 2m - 1) (a + 2m)] 

Для достижения точности примерно в семь значащих цифр требуется приблизительно O ( (max (a, b) ) 1/2) итераций при суммировании непрерывной дроби.

Если  x > (a + 1) / (a + b + 1), то сначала вычисляется  I 1 - x (b, a), а затем  Ix (a, b) = 1 - I 1 - x (b, a).

Справочник по специальным функциям. Под ред. Абрамовица M. и Стиган И. Изд - во "Наука", 1979.

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

    real sfg6r_c (real *x, real *a, real *b, real *eps, integer *itmax,
            integer *ierr)

Параметры

x - заданное значение верхнего предела интегрирования (тип: вещественный);
a, b - заданные значения параметров  a  и  b (тип: вещественный);
eps - заданная относительная точность вычислений (тип: вещественный);
itmax - заданное максимальное количество итераций, предположительно необходимых для достижения заданной точности (тип: целый);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы - функции; при этом:
ierr=65 - когда значение аргумента не принадлежит отрезку [0, 1]; значение функции полагается равным наибольшему представимому на машине числу;
ierr=66 - когда один или оба параметра неполной бета - функции меньше либо равны нулю; значение функции полагается равным наибольшему представимому на машине числу;
ierr=67 - когда заданное максимальное колчиство итераций недостаточно для заданных значений  a, b и eps; значение функции полагается равным наибольшему представимому на машине числу.

Версии

sfg6d_c - вычисление неполной бета - функции  Ix(a, b) в режиме удвоенной точности; при этом параметры x, a, b и eps должны иметь тип double.

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

       sf66r_c -
       sf66d_c  
вычисление натурального логарифма гамма - функции вещественного аргумента в режиме одинарной и удвоенной точности; используются в sfg6r_c и sfg6d_c соответственно;
      utsf12_c -
      utsf13_c  
подпрограммы выдачи диагностических сообщений при работе sfg6r_c и sfg6d_c соответственно.

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

 

В подпрограммах - функциях sfg6r_c и sfg6d_c имеется внешняя структура с именем sfg6r2_ , содержащая элемент целого типа с именем itreal. Переменной itreal присваивается то реальное количество итераций, которое было выполнено при счете.

В sfg6r_c и sfg6d_c используются рабочие подпрограммы - функции sfg6r1_c и sfg6d1_c соответственно.

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

struct {
    int itreal;
} sfg6r2_;

#define sfg6r2_1 sfg6r2_

int main(void)
{
    /* Local variables */
    static int ierr;
    extern float sfg6r_c(float *, float *, float *, float *, int *, int *);
    static float a, b, r__, x;
    static int itmax;
    static float eps;

    x = .6f;
    a = 16.f;
    b = 10.5f;
    eps = 1e-6f;
    itmax = 100;
    r__ = (float)sfg6r_c(&x, &a, &b, &eps, &itmax, &ierr);

    printf("\n %16.7e %5i \n",r__,ierr);
    printf("\n %10i \n",sfg6r2_1.itreal);
    return 0;
} /* main */


Результаты:

       r__ = 0.47322 
       ierr = 0 
       itreal = 7