Текст подпрограммы и версий
qs19r_c.zip  qs19d_c.zip 
Тексты тестовых примеров
tqs19r_c.zip  tqs19d_c.zip 

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

Назначение

Вычисление определенного интеграла от осциллирующих функций методом Лонгмана.

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

Пусть отрезку [A, B], a ≤ B, принадлежат  n0 + 1 нулей  x0, x1,..., xn0 функции  f (x),  n0 ≥ 2. По квадратурной формуле Гаусса с 32 узлами вычисляются интегралы по отрезкам [A, x0] и [xn0, B], затем вычисляются интегралы

                                 B1
           Vi  =  (- 1) i    ∫   f (x) dx ,
                              A1
 где     A1  =  x i  ,
           B1  =  x i +1  ,
           ( i = 0, 1, ..., k - 1, n0 - k, n0 - k + 1, ... , n0 - 1 )  , 

и за значение интеграла по отрезку [x0, xn0] принимается сумма

            k-1 
(1)        ∑    [(- 1)i Δi V0 +  (- 1)n0 - 1 Δi Vn0 - i - 1 ] / 2i +1  ,           
            i =0 

причем значение  k  выбирается подпрограммой в соответствии с заданной величиной абсолютной погрешности  Е.

Longman I.M. A Method for the Numerical Evaluation of Finite Integrals of Oscillatory Functions. - Math. Comput., 1960, Vol.14, N 69, p.53 - 59.

Жилейкин Я.М., Кукаркин А.Б. Приближенное вычисление интегралов от быстроосциллирующих функций - М.: Изд - во Моск. ун - та, 1987.

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

    int qs19r_c (real *rint, real *a, real *b, R_fp f, real *e,
            integer *l, real *xa, real *xb, real *ra, real *rb, integer *ierr)

Параметры

rint - вещественная переменная, содержащая вычисленное значение интеграла;
a, b - заданные нижний и верхний пределы интегрирования соответственно, a ≤ b (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию  f (x);
e - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
l - параметр, равный  m + 1, где  m - определяемое пользователем максимально допустимое число членов суммы (1),  l ≥ 3 (тип: целый);
xa - вещественный одномерный массив длины  l, содержащий   l последовательных нулей функции  f (x), принадлежащих отрезку интегрирования, которые расположены в порядке возрастания, начиная с наименьшего;
xb - вещественный одномерный массив длины  l, содержащий   l последовательных нулей функции  f (x), принадлежащих отрезку интегрирования, которые расположены в порядке убывания, начиная с наибольшего;
ra, rb - вещественные одномерные массивы длины  l, используемые как рабочие;
ierr - целая переменная для диагностических сообщений; при этом:
ierr=65 - если заданная точность не может быть достигнута при заданном  l.

Версии

qs19d_c - вычисление с удвоенной точностью определенного интеграла от осциллирующих функций методом Лонгмана.

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

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

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

  Параметр  l пользователь может задавать достаточно произвольно; чем больше  l, тем больше шансов, что заданная точность будет достигнута, но и тем больше места будет занято программой в памяти машины.

  В подпрограмме qs19d_c параметры rint, a, b, f, e, xa, xb, ra, rb имеют тип double.

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

int main(void)
{
    /* Local variables */
    static int ierr;
    static float rint;
    extern  int qs19r_c(float *, float *, float *, R_fp, float *,
                        int *, float *, float *, float *, float *, int *);
    static float a, b, e;
    extern float f_c();
    static int i__, l;
    static float ra[20], rb[20], xa[20], xb[20];

    a = -100.f;
    b = 100.f;
    e = .001f;
    l = 20;
    for (i__ = 1; i__ <= 20; ++i__) {
        xb[i__ - 1] = (319 - i__) * .3141592654f;
/* l1: */
        xa[i__ - 1] = -xb[i__ - 1];
    }
    qs19r_c(&rint, &a, &b, (R_fp)f_c, &e, &l, xa, xb, ra, rb, &ierr);

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

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

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

    ret_val = *x * (float)sin((float)(*x * 10.f));
    return ret_val;
} /* f_c */


Результаты:    rint = - 11.2310439137 ,    ierr  =  0