|
Текст подпрограммы и версий sf74r_c.zip |
Тексты тестовых примеров tsf74r_c.zip |
Вычисление модифицированных функций Бесселя первого рода In (x) для последовательности целых индексов.
sf74r_c вычисляет значения модифицированных функций Бесселя первого рода Ip (x) для действительного аргумента x и последовательности целых индексов p от n до 0. Расчеты осуществляются по рекуррентной формуле:
Ip-1(x) = (2p/x)*Ip(x) + Ip+1(x) .
Ошибка вычисления Ip (x) не возрастает в pекуppентном процессе, применяемом при убывании p.
Вычисления начинаются с задания значений Ik + 1 = 0, Ik = 1 и числа k.
Величина k выбирается в зависимости от значений x и n. Затем последовательно вычисляются значения функций для p = k - 1, k - 2, ..., 0. Для достижения заданной точности eps рекурсия повторяется с большим k до тех пор, пока разность между pезультатами двух последних рекурсий не станет меньше eps.
| 1. | Абрамовиц М., Стиган И. Справочник по специальным функциям - М. Наука, 1979. |
| 2. | Goldstein M., Thaler R.M. Recurrence techniques for the calculation of Bessel functions. - M TAC, 1959, V. 13, N 66. |
int sf74r_c (real *x, integer *n1, real *eps, logical *s,
real *t, real *t1)
Параметры
| x - | заданное значение аргумента x (тип: вещественный); |
| n1 - | максимальный порядок последовательности функций Ip (x), увеличенный на единицу (тип: целый); |
| eps - | относительная точность вычисления последней функции последовательности In (x) (тип: вещественный); |
| s - |
логическая переменная, задающая режим работы
подпрограммы; при этом: если s = TRUE_, то вычисляются функции Ip(x), если s = FALSE_, то вычисляются функции e - x Ip(x); |
| t - | вещественный вектоp длины n1 вычисленных значений функций Бесселя порядков от 0 до n; Ij (x) = t (j + 1), j = 0, ..., n (n = n1 - 1); |
| t1 - | вещественный вектоp длины n1, используемый как рабочий. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
| Для значений x, при которых e - x меньше положительного наименьшего представимого в машине числа, значение s полагается равным FALSE_ |
int main(void)
{
/* Initialized data */
static float x = 5.f;
static float eps = 1e-9f;
static int n1 = 21;
/* Local variables */
extern int sf74r_c(float *, int *, float *, logical *, float *, float *);
static logical s;
static float t[21], t1[21];
int i;
s = TRUE_;
sf74r_c(&x, &n1, &eps, &s, t, t1);
for (i = 1; i <= 19; i += 3) {
printf("\n %16.7e %16.7e %16.7e ",t[i-1], t[i], t[i+1]);
}
printf("\n\n ");
return 0;
} /* main */
Результаты:
t(5) = 5.1082347636e+00
t(11) = 4.580044192e-03
t(16) = 1.0479776754e-06
t(21) = 5.0242393580e-11