Текст подпрограммы и версий
qsr1r_c.zip  qsr1d_c.zip 
Тексты тестовых примеров
tqsr1r_c.zip  tqsr1d_c.zip 

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

Назначение

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

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

 qsr1r_c вычисляет интеграл
            b
           ∫ f (x) dx 
          a 

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

Н.С.Бахвалов. "Численные методы", т.1, "Hаука", 1973.

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

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

Параметры

rint - вещественная переменная, содержащая вычисленное значение интеграла;
a, b - заданные нижний и верхний пределы интегрирования (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию  f (x);
k - целая переменная, определяющая число узлов интегрирования N ( N = 2k + 1, 0 < k≤ 20 );
ierr - целая переменная, указывающая причину окончания вычислений: если интеграл сосчитан, то ierr = 0, в противном случае ierr = 65.

Версии

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

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

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

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

 

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

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

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

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

    a = 0.f;
    b = 1.f;
    k = 10;
    qsr1r_c(&rint, &a, &b, (R_fp)f_c, &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 exp(double);

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


Результаты:
 
      rint  =  0.37988549298

      k = 10
      ierr = 0