Текст подпрограммы и версий
qs17r_c.zip  qs17d_c.zip 
Тексты тестовых примеров
tqs17r_c.zip  tqs17d_c.zip 

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

Назначение

 Вычисление интегралов
              b
(1)         ∫  f (x) sin( w*g(x) ) dx    и
            a
              b
(2)         ∫  f (x) cos( w*g(x) ) dx
            a 

с заданной абсолютной погрешностью по квадратурной формуле Гаусса.

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

Отрезок интегрирования [A, b] разбивается на K равных частичных отрезков; на каждом из них интеграл вычисляется по квадратурной формуле Гаусса с 64 узлами.
Полученные значения интеграла по всем частичным отрезкам суммируются.
Аналогичные вычисления проводятся для удвоенного числа частичных отрeзков.

Если модуль paзности приближенных значений интегралов по этим двум разбиениям нe превосходит заданной величины E, то счет заканчивaeтся, и за значения интегралов принимаются результаты последнего расчета.
B противном случае число частичных отрезков снова удваивается, и процесс повторяется.

Если число частичных отрезков разбиения становится больше 524288, то вычисления заканчиваются.

А.Б.Кукаркин. Применение формул Гаусса для приближенного вычисления интегралов от быстроосциллирующих функций. B сб. "Численный анализ на ФОРТРАНе. Методы и алгоритмы". M: Изд-во МГУ, 1979.

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

    int qs17r_c (real *rint1, real *rint2, real *a, real *b,
        R_fp f, R_fp g, real *w, real *e, integer *k, integer *l1,
            integer *l2, integer *ierr)

Параметры

rint1 -
rint2  
вещественные переменные, содержащие вычисленные значения интегралов (1) и (2) соответственно;
a, b - заданный нижний и верхний пределы интегрирования соответственно (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x);
g - имя вещественной подпрограммы - функции, вычисляющей функцию g (x);
w - заданное значение параметра w (тип: вещественный);
e - заданная абсолютная погрешность вычисления интегралов (тип: вещественный);
k - целая переменная, задающая начальное число частичных отрезков разбиения (k ≤ 524288);
l1, l2 - задают режим работы подпрограммы (тип: целый); при этом, если:
 

l1 = 1 и l2 = 0, то вычисляется интеграл (1);

l1 = 0 и l2 = 1, то вычисляется интеграл (2);

l1 = 1 и l2 = 1, то вычисляются интегралы (1) и (2);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr = 65 - когда заданная точность не может быть достигнута при максимально возможном числе отрезков разбиения.

Версии

qs17d_c - вычисление с удвоенной точностью интегралов (1) и (2) с заданной абсолютной погрешностью по квадратурной формуле Гаусса.

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

utqs11_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы qs17r_c.
utqs13_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы qs17d_c.

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

 

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

Если заданная точность не может быть достигнута, то rint1 и rint2 полагаются равными результатам последнего расчета, а подпрограммы utqs11_c, utqs13_c выдают сообщение "заданная точность не может быть достигнута".

При выходе из подпрограммы значение k полагается равным числу частичных отрезков разбиения, при котоpом проводился последний расчет интегралов.

В подпрограмме qs17d_c параметры rint1, rint2, a, b, f, g, w, e имеют тип double.

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

int main(void)
{
    /* Local variables */
    static int ierr;
    extern int qs17r_c(float *, float *, float *, float *, R_fp, R_fp,
                       float *, float *, int *, int *, int *, int *);
    static float rint1, rint2, a, b, e;
    extern float f_c(), g_c();
    static int k;
    static float w;
    static int l1, l2;

    a = -2.f;
    b = -5.f;
    w = -100.f;
    e = 1e-5f;
    k = 1;
    l1 = 1;
    l2 = 1;
    qs17r_c(&rint1, &rint2, &a, &b, (R_fp)f_c, (R_fp)g_c, &w, &e, &k, &l1, &l2,
            &ierr);

    printf("\n %16.7e %16.7e \n",rint1,rint2);
    printf("\n %5i %5i \n",k,ierr);
    return 0;
} /* main */

float f_c(float *x)
{
    /* System generated locals */
    float ret_val;

    /* Builtin functions */
    double cos(double);

    ret_val = (float)cos(*x);
    return ret_val;
} /* f_c */

float g_c(float *x)
{
    /* System generated locals */
    float ret_val;

    /* Builtin functions */
    double sin(double);

    ret_val = (float)sin(*x);
    return ret_val;
} /* g_c */


Результаты:

      rint1  =  0.0091068963
      rint2  =  0.0117280438

      k  =  4
      ierr  =  0