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

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

Назначение

Вычисление определенного интеграла от комплекснозначной функции вещественного аргумента по квадратурной формуле Гаусса.

Математическое описание

Пусть f (x) = f1 (x) + i f (x) - комплекснозначная функция вещественного аргумента, определенная на конечном отрезке [a, b], вычисляется

               b
               ∫ f (x) dx ≈
              a
                                          N
                          ≈ (b - a)   ∑ cj f ( (b - a) yj / 2 + (a + b) / 2 ) / 2 = JN ,
                                         j=1 

где JN = J1N + i J2N,  yj и  cj соответственно узлы и веса Гаусса для отрезка [-1,1],  i = √-1.

Число узлов интегрирования N принимает только следующие значения: 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96. Пусть n - номеp элемента указанного списка; обозначим J1N и J2N (N принимает перечисленные значения) через J1(n) и J2(n) соответственно.

B качестве приближенного значения интеграла берется J1 (n + 1) + i J2 (n + 1), если величина

     E(n) = [  (J1(n+1) - J1(n))2 + (J2(n+1) - J2(n))2] / [(J1(n+1))2 + (J2(n+1))2  ]1/2 

меньше или pавна заданной относительной точности вычисления интеграла E.

Использование

    int qs14r_c (real *rint, real *a, real *b, S_fp f, real *e,
            integer *n, integer *ierr)

Параметры

rint - вещественный вектоp длины 2 для вычисленных значений J1 (n + 1) и J2 (n + 1);
a, b - заданные нижний и верхний пределы интегрирования (тип: вещественный);
f - имя подпрограммы, вычисляющей подинтегральную функцию f (x);
e - заданная относительная погрешность вычисления интеграла (тип: вещественный);
n - целая переменная, задающая начальное число узлов интегрирования;
ierr - целая переменная для диагностических сообщений:
ierr = 65 - когда список узлов исчерпан, а заданная точность не достигнута, или
(J1(n + 1))2 + (J2(n + 1))2 ≤ 10-10 ;
ierr = 66 - когда заданное число узлов интегрирования не принадлежит списку допустимых значений узлов.

Версии: нет

Вызываемые подпрограммы

utqs10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы qs14r_c.

Замечания по использованию

  1. 

Если ierr = 65, то n полагается равным -1.

  2. 

При e ≤ 0 происходит вычисление интеграла только с заданным n.

  3. 

Первый оператор подпрограммы f должен иметь вид:

    int f(float *x, float *f1, float *f2)
Здесь:
x   - аргумент функции f(x) (тип: вещественный);
f1 - вещественная переменная, f1 = re f(x);
f2 - вещественная переменная, f2 = im f(x).

Пример использования

int main(void)
{
    /* Local variables */
    static int ierr;
    extern int qs14r_c(float *, float *, float *, U_fp, float *, int *, int *);
    static float rint[2], a, b, e;
    extern int f_c();
    static int n;

    a = 1.f;
    b = 20.085536923186663f;
    e = 1e-5f;
    n = 2;
    qs14r_c(rint, &a, &b, (U_fp)f_c, &e, &n, &ierr);

    printf("\n %5i \n",n);
    printf("\n %16.7e %16.7e \n",rint[0],rint[1]);
    return 0;
} /* main */

int f_c(float *x, float *f1, float *f2)
{
    /* Builtin functions */
    double log(double), sqrt(double);

    *f1 = 1.f / (*x * (float)sqrt((float)((float)log(*x) + 1.f)));
    *f2 = 1.f / *x;
    return 0;
} /* f_c */


Результаты:

      rint (1)  =  1.9999999999
      rint (2)  =  3.0000000000

      n  =  32