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

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

Назначение

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

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

 qs13r_c вычисляет интеграл
                             B
                             ∫ f (x) dx 
                            A
с заданной абсолютной  погрешностью E по формулам Гаусса. 

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

Заданная точность достигается:
1.  За счет последовательного увеличения числа узлов квадратурной формулы при фиксированном K.
2.  За счет удвоения числа частичных отрезков разбиения при фиксированном N.

Счет заканчивается, если модуль разности приближенных значений интеграла, полученных при двух последовательных расчетах, не привосходит заданной величины E. За приближенное значение интеграла принимается результат последнего расчета.

Л.Г.Васильева. Набор стандартных программ численного интегрирования с фиксированным распределением узлов. Сб. "Численный анализ на ФОРТРАНе", вып. 8, Изд-во МГУ, 1974.

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

    int qs13r_c (real *rint, real *a, real *b, R_fp f, real *e,
            integer *k, integer *n, integer *l, integer *ierr)

Параметры

rint - вещественная переменная, содержащая вычисленное значение интеграла;
a, b - заданные нижний и верхний пределы интегрирования (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x);
e - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
k - целая переменная, задающая начальное число частичных отрезков разбиения (k ≤ 524288);
n - целая переменная, задающая начальное число узлов интегрирования; может принимать только следующие значения: 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96;
l - задает режим работы подпрограммы (тип: целый); при этом, если:
l = 0 - то заданная точность достигается за счет увеличения n при фиксированном k;
l = 1 - то заданная точность достигается за счет увеличения k при фиксированном n;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr = 65 - когда заданная точность не может быть достигнута.

Версии: нет

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

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

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

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

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

int main(void)
{
    /* Local variables */
    static int ierr;
    extern int qs13r_c(float *, float *, float *, R_fp, float *,
                       int *, int *, int *, int *);
    static float rint, a, b, e;
    extern float f_c();
    static int k, l, n;

    a = 1.f;
    b = 20.085536923186663f;
    e = 1e-4f;
    k = 1;
    n = 2;
    l = 0;
    qs13r_c(&rint, &a, &b, (R_fp)f_c, &e, &k, &n, &l, &ierr);

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

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

    /* Builtin functions */
    double log(double), sqrt(double);

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


Результаты:

       rint  =  1.9999999999
       n  =  32
       k  =  1
       ierr  =  0