
Глава 5. Специальные функции и алгоритмы их вычисления
Процедура-функция YNX01 тестировалась на IBM
PC/AT-386 при n = 0, 1; x = 2.9, 4, 10. Полученные при
этом результаты представлены в табл. 5.13, значения по-
грешности указаны в сравнении с табличными величи-
нами Y
0
(x) и Y
1
(x) [Справочник ..., 1979].
Таблица 5.13
x n = 0 n = 1
2.9 0.4079117580+1.12e-8 0.2959400312+2.34e-8
4 -0.0169407231-1.62e-8 0.3979257124-0.18e-8
10 0.0556711676+0.03e-8 0.2490154233+0.09e-8
Вычисление функций Ханкеля и (функ-
ций Бесселя III и IV рода) при z ≡ Re z = x и целом значе-
нии порядка v = n реализовано в процедуре HANX12, в
которой на основании формул (5.25) использованы разло-
жение (5.23) функции Бесселя I рода и аппроксимация
функции Неймана многочленом вида (5.29). При
вычислении Re[H
Hz
ν
()
()
1
Hz
ν
()
()
2
Nx
n
()
n
(x)] ≡ J
n
(x) в процедуре применяется
внешняя функция JNX, а при вычислении Im[H
n
(x)] ≡ Y
n
(x)
- функция YNX.
Формальные параметры процедуры. Входные: n (тип
integer) - порядок функции; x (тип double) - значение аргу-
мента; k (тип integer) - задает знак мнимой части функции
Ханкеля: при k = 1 вычисляется , при k = -1-
; eps (тип double) - задаваемая точность. Выходной:
hanx12 (тип complex) - идентификатор вычисленной функ-
ции Ханкеля. В случае если значение аргумента x = 0 (когда
функция не определена), осуществляется выход к про-
грамме обработки ошибки.
()
()
Hx
n
1
()
()
Hx
n
2
FUNCTION HANX12 (N,K : INTEGER;
X,EPS : DOUBLE):DOUBLE;
VAR RE,IM,JNX,YNX : DOUBLE;
BEGIN
IF (X =0.) THEN EXIT;
RE := JNX(N,X,EPS);
IM := K*YNX(N,X);
HANX12 := COMPLEX(RE,IM);
END.
Альтернативный вариант вычисления функций Ханкеля
реализован в более экономичной по времени процедуре
HANX120, не требующей использования внешних функ-
ций, тело которой построено аналогично телу функции
YNX. Назначение формальных параметров такое же, что и
в функции HANX12, однако в отличие от нее процедура
организована как подпрограмма, результатом работы ко-
торой являются передающиеся через формальные
параметры значения действительной и мнимой частей
вычисляемой функции, что иногда может оказаться более
удобным. В процедуре используются константы: 2С =
1.1544... и 1/π = =0.318... .
PROCEDURE HANX120 (NN , K : INTEGER;
VAR X1,RE,IM : DOUBLE);
VAR RE,IM,X,X2,A,R,B,S,D,P,T : DOUBLE;
X1 : REAL; NN,K,NNA,I,I1 : INTEGER;
BEGIN IF(X1 = 0.) THEN EXIT;
RE := 0.; IM := 0.;
NNA := ABS(NN);
X := DOUBLE(X1/2.);
X2 := X*X;
A := 1.; R := 1.;
B := 0.; S := 0.;
IF (NN <> 0) THEN
FOR I := 1 TO NNA DO
BEGIN R := R*I;
S := S+1./I;
END;
D := 0.;
IF(NN <>0) THEN
D := R/NNA;
R := 1./R;
P := EXP (NNA * LN(X2));
T := LN(X2)+1.1544313298031D0;
I := 0;
WHILE (I <=NNA) AND (B <>IM) DO
BEGIN B := IM;
RE := RE+A*R;
IM := IM+A*R*(T-S);
IF(I < NNA) THEN
IM := IM-A*D/P;
I1 := I+1; A := A*X2/I1;
R := -R/(I1+NNA);
S := S+1./I1+1./(I1+NNA);
IF(I1.LT.NNA)D := D/(NNA-I1)
I := I1
END;
P := EXP ( NNA * LN(X));
RE := RE*P;
IM := 0.318309886184D0*IM*P;
IF(NN <>0)THEN
BEGIN RE := (-1)**NNA*RE;
IM := (-1)**NNA*IM;
END;
IF(K < 0) THEN IM := -IM;
END.
Тестирование процедур HANX12 и HANX120 на IBM
PC/AT-386 показало, что их точностные характеристики
примерно одинаковы (при задаваемом в процедуре
HANX12 eps = 1e-8), но процедура HANX120 ра ботает не-
сколько быстрее. Pезультаты расчетов для k = 1 приведены в
табл. 5.14.
Таблица 5.14
n/x HANX12 HANX120
1/8 0.2346363-i*0.1580554 0.2346331-i*0.1580554
1/-8 -0.2346363+i*0.1580554 0.2346331+i*0.1580554
7/4 1.517608e-2-i*3.706224 1.517607e-2-i*3.706224
-7/4 -1.517608e-2-i*3.706224 -1.517607e-2+i*3.706224
102