|
Текст подпрограммы и версий sfg6r_c.zip sfg6d_c.zip |
Тексты тестовых примеров tsfg6r_c.zip tsfg6d_c.zip |
Вычисление неполной бета - функции 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