Текст подпрограммы и версий sf76r_c.zip |
Тексты тестовых примеров tsf76r_c.zip |
Вычисление функций Эйри Ai и Bi и их производных Ai ' и Bi '.
Данная подпрограмма вычисляет функции Эйри Ai (z) и Bi (z) и их производныe Ai ' (z) и Bi ' (z) для вещественных значений аргумента при помощи разложений в ряды Чебышева.
(a) Для z ≤ -7 используются такие acимптотические разложения:
Ai (-z) ~ z -1/4 ( sf(z) - cg(z) ); Ai ' (-z) ~ -z 1/4 ( cp(z) + sq(z) ); Bi (-z) ~ z -1/4 ( cf(z) + sg(z) ); Bi ' (-z) ~ z 1/4 ( sp(z) - cg(z) );
где s = sin (ζ + π/4), c = cos (ζ + π/4), ζ = 2/3 z3/2, а функции f, g, p, q приближаются следующими чебышевскими разложениями
m1 m2 f ~ ∑ ar Tr*(t) , g ~ ζ -1 ∑ br Tr*(t) , r=0 r=0 m3 m4 p ~ ∑ cr Tr*(t) , q ~ ζ -1 ∑ dr Tr*(t) , r=0 r=0
Здесь t = -(7/z)3, Tr* являются чебышевскими полиномами со сдвигом; ar, br, cr и dr являются заданными коэффициентами Чебышева.
(б) Для -7 ≤ z ≤ 0 используются следующие разложения в ряды Тейлора
Ai = e1 f(z) - e2 g(z) ; Ai ' = e1 f '(z) - e2 g'(z) Bi = sqrt( 3(e1 f(z) + e2 g(z) ) ) ; Bi ' = sqrt( 3(f '(z) + e2 g'(z) ) ) где e1 и e2 - заданные константы и m1 m2 f ~ ∑ ar Tr*(t) , g ~ z ∑ br Tr*(t) , r=0 r=0 m3 m4 f ' ~ z2 ∑ cr Tr*(t) , g ' ~ ∑ dr Tr*(t) , r=0 r=0 Здесь t = - (z/7)3.
(в) Для 0 < z < 7 предыдущие разложения в ряды Тейлора не позволяют вычислить функции с достаточной точностью во всех точках интервала, поскольку на интервале имеют место значительные отклонения по абсолютной величине значений функций. Поэтому используются следующие чебышевские разложения для взвешенных функций:
m1 Ai exp (1.75z) ~ ∑ ar Tr*(t) ; r=0 m3 Ai ' exp (1.75z) ~ ∑ cr Tr*(t) ; r=0 m2 Bi exp (- 1.75z) ~ ∑ br Tr*(t) ; r=0 m4 Bi ' exp (- 1.75z) ~ ∑ dr Tr*(t) r=0 Здесь t = z / 7.
(г) Для z ≥ 7 используются следующие асимптотические разложения:
m1 Ai (z) ~ z - 1/4 exp(- ζ) ∑ ar Tr*(t) ; r=0 m3 Ai ' (z) ~ - z 1/4 exp(- ζ) ∑ cr Tr*(t) ; r=0 m2 Bi (z) ~ z - 1/4 exp(ζ) ∑ br Tr*(t) ; r=0 m4 Bi ' (z) ~ z 1/4 exp(ζ) ∑ dr Tr*(t) r=0 Здесь t = (7 / z) 3/2.
B каждом из рассмотреных случаях степени аппроксимации mi выбираются такими, чтобы значения функций вычислялись по крайней меpе с девятью значащими цифрами, если функции по абсолютной величине больше единицы, и с девятью десятичными знаками в противном случае.
B случае (a) окончательная точность ограничена точностью, с которой могут быть вычислены значения функций синуса и косинуса от ζ + π / 4.
int sf76r_c (real *z__, real *ai, real *bi, real *aid, real *bid, integer *l1, integer *l2, integer *ierr)
Параметры
z - | заданное значение аргумента (тип: вещественный); |
ai, bi - | вещественные переменные, содержащие вычисленные значения функций Эйри Ai и Bi в точке z; |
aid - bid | вещественные переменные, содержащие вычисленные значения производных функций Эйри Ai ' и Bi ' в точке z; |
l1 - | задает режим работы подпрограммы (тип: целый); |
l1 = -1 - | если необходимо вычислить только Ai ' и Bi '; |
l1 = 0 - | если необходимо вычислить Ai, Bi, Ai ' и Bi '; |
l1 = 1 - | если необходимо вычислить только Ai и Bi; |
l2 - | задает режим масштабирования (тип: целый); |
l2 = 0 - | если масштабирование не должно осуществляться; |
l2 = 1 - |
если необходимо осуществить следующее масштабирование: (Ai, Ai ') = (Ai, Ai ') exp (ζ) , (Bi, Bi ') = (Bi, Bi ') exp (- ζ) , где ζ = 2/3 z 3/2 . |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы, при этом: |
ierr=1 - | когда значение abs (z) > sys053 1/3, где sys053 - максимальное число, представимое на данной машине; значение функций Эйри и их производных полагаются равными нулю; |
ierr=2 - | когда возможна потеря точности вычисления функций синуса и косинуса от промежуточных величин; |
ierr=3 - | когда значение z 3/2 > sys053, где sys053 - максимальное число, представимое на данной машине; значения функций Эйри и их производных полагаются равными нулю; |
ierr=4 - | когда значение 2/3 z 3/2 > sys076, где sys076 - максимальная степень экспоненты для данной машины; значения ai и aid полагаются равными нулю, а значения bi и bid полагаются равными 3.4e38. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
B качестве рабочих используются подпрограммы sf76r1_c, sf76r2_c, sf76r3_c, sf76r4_c, sf76r5_c. |
int main(void) { /* Local variables */ static int ierr; extern int sf76r_c(float *, float *, float *, float *, float *, int *, int *, int *); static float z__; static int l1, l2; static float ai, bi, aid, bid; l1 = 0; l2 = 0; z__ = .99f; sf76r_c(&z__, &ai, &bi, &aid, &bid, &l1, &l2, &ierr); printf("\n %16.7e %16.7e \n",ai, bi); printf("\n %16.7e %16.7e \n",aid, bid); return 0; } /* main */ Результаты: ai = 0.13689065925 bi = 1.198159251377 aid = -0.1605015275572 bid = 0.9204681806696