Текст подпрограммы и версий
sf76r_c.zip 
Тексты тестовых примеров
tsf76r_c.zip 

Подпрограмма:  sf76r_c

Назначение

Вычисление функций Эйри  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