Текст подпрограммы и версий
qss1r_c.zip  qss1d_c.zip 
Тексты тестовых примеров
tqss1r_c.zip  tqss1d_c.zip 

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

Назначение

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

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

 Подпрограмма qss1r_c вычисляет интеграл
            B
           ∫ f (x) dx 
          A 

с заданной абсолютной погрешностью E по обобщенной квадратурной формуле Симпсона с шагом  h = (B - A)/K,  где K - число частичных отрезков разбиения.

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

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

    int qss1r_c (real *rint, real *a, real *b, R_fp f, real *e,
            integer *k, integer *ierr)

Параметры

rint - вещественная переменная, содержащая вычисленное значение интеграла;
a, b - заданные нижний и верхний пределы интегрирования (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию  f (x);
e - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
k - целая переменная, задающая число частичных отрезков разбиения;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr = 65 - когда заданная точность не может быть достигнута при максимально возможном числе частичных отрезков разбиения; значение k полагается равным 1048576.

Версии

qss1d_c - вычисление с удвоенной точностью определенного интеграла по обобщенной квадратурной формуле Симпсона.

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

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

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

 

Проводятся два последовательных просчета интеграла по всему отрезку интегрирования по k и 2k частичным отрезкам. Если абсолютная величина разности этих двух последовательных просчетов не превосходит e, то счет заканчивается и за значение интеграла принимается результат последнего просчета. B противном случае, значение k удваивается и процесс повторяется.

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

Максимальное значение k, котоpое можно задавать, не должно превосходить 524288. Если заданная точность не может быть достигнута, то k полагается равным 1048676.

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

В подпрограмме qss1d_c параметры rint, a, b, f, e имеют тип double.

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

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

    k = 1;
    e = 1e-5f;
    b = 1.570796326795f;
    a = -b;
    qss1r_c(&rint, &a, &b, (R_fp)f_c, &e, &k, &ierr);

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

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

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

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


Результаты:

      rint  =  2.0000000012

      k  =  256
      ierr  =  0