|
Текст подпрограммы и версий 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