Текст подпрограммы и версий sf74r_p.zip |
Тексты тестовых примеров tsf74r_p.zip |
Вычисление модифицированных функций Бесселя первого рода In (x) для последовательности целых индексов.
SF74R вычисляет значения модифицированных функций Бесселя первого рода 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. |
procedure SF74R(X :Real; N1 :Integer; EPS :Real; var S :Boolean; var T :Array of Real; var T1 :Array of Real);
Параметры
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 |
Unit tsf74r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, SF74R_p; function tsf74r: String; implementation function tsf74r: String; var _i :Integer; S :Boolean; T :Array [0..20] of Real; T1 :Array [0..20] of Real; const X :Real = 5.0; EPS :Real = 1.0E-9; N1 :Integer = 21; begin Result := ''; { результат функции } S := True; SF74R(X,N1,EPS,S,T,T1); Result := Result + #$0D#$0A; for _i:=0 to 20 do begin Result := Result + Format('%16.7f ',[T[_i]]); if ( ((_i+1) mod 4)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('tsf74r',Result); { вывод результатов в файл tsf74r.res } exit; end; end. Результаты: T(5) = 5.1082347636E+00 T(11) = 4.580044192E-03 T(16) = 1.0479776754E-06 T(21) = 5.0242393580E-11