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

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

Назначение

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

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

 Подпрограмма qsj2r вычисляет определенный интеграл
            B
           ∫  ( 1 - x )α ( 1 + x ) β  f (x) dx 
         A 

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

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

    int qsj2r_c(real *rint, real *a, real *b, real *alf,
        real *bta, R_fp f, integer *n, real *eps, integer *ierr)

Параметры

rint - вещественная переменная, содержащая вычисленное значение интеграла;
a, b - заданные нижний и верхний пределы интегрирования, соответственно (тип: вещественный);
alf,bta - заданные параметры  α и  β соответственно, в весовом множителе (1 - x)α (1 + x) β (тип: вещественный);
f - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию  f (x);
n - целая переменная, задающая число узлов интегрирования (2 ≤ n ≤ 512);
eps - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=0 - когда заданная точность eps достигнута,  n при этом полагается равным числу узлов интегрирования, при котором достигнута заданная точность и вычислено значение интеграла;
ierr=1 - когда заданная точность не может быть достигнута при максимально возможном числе узлов интегрирования (n ≤ 512).

Версии: нет

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

qsjac_c - подпрограмма, вычисляющая узлы и веса квадратурной формулы Гаусса - Якоби;
utqsj2_c - подпрограмма выдачи диагностических сообщений.

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

 

Перед началом работы подпрограммы число узлов интегрирования  n должно быть задано как целое из интервала 2 ≤ n ≤ 256.

  Если интеграл не может быть вычислен с заданной абсолютной погрешностью eps, выдается диагностическое сообщение:
Подпрограмма qsj2r_c: заданная точность не может быть достигнута.

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

int main(void)
{
    /* Local variables */
    static int ierr;
    static float rint, a, b;
    extern int qsj2r_c(float *, float *, float *, float *,
                       float *, R_fp, int *, float *, int *);
    extern float f_c();
    static int n;
    static float alf, bta, eps;

    alf = 1.f;
    bta = alf;
    a = -1.f;
    b = 1.f;
    eps = 1e-5f;
    n = 2;
    qsj2r_c(&rint, &a, &b, &alf, &bta, (R_fp)f_c, &n, &eps, &ierr);

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

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

/* Computing 15th power */
    r__1 = *x, r__2 = r__1, r__1 *= r__1, r__2 *= r__1, r__1 *= r__1,
            r__2 *= r__1;
    ret_val = r__2 * (r__1 * r__1);
    return ret_val;
} /* f_c */

Результаты:

       rint  = 0.0000000000
       n        =  8
       ierr   =  0