Текст подпрограммы и версий
qst2r_c.zip  qst2d_c.zip 
Тексты тестовых примеров
tqst2r_c.zip  tqst2d_c.zip 

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

Назначение

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

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

 Подпрограмма  qst2r_c вычисляет интеграл 
                     B
                    ∫   F(x) dx 
                   A 
от векторной функции      F(x)  =  { f i (x) } ,   i =1, ... , N
с покомпонентной  погрешностью 
                            B
         ЕРS ( 1 + |  ∫  f i (x) dx | )
                           A 

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

Я.М.Жилейкин, М.В.Соколовский. Набор стандартных программ для вычисления интегралов от векторных функций, Сб. "Методы и алгоритмы в численном анализе", Изд - во МГУ, 1981.

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

    int qst2r_c (real *rint, real *a, real *b, S_fp f, integer *n,
            real *eps, integer *k, integer *ind, real *r, integer *ierr)

Параметры

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

Версии

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

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

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

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

  1. 

Первый оператор подпрограммы  f должен иметь вид:

int f(float *x, float *y, int *i)
Здесь: x - аргумент функции f (тип: вещественный);
y - вещественный вектоp длины n вычисленных значений функции f;
i - целый вектоp длины n; если его j - ая компонента отлична от нуля, то интеграл от этой компоненты функции f не вычисляется.

  2. 

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

  3. 

Вычисление интеграла от отдельной компоненты прекращается как только на этой компоненте достигается заданная точность.

  4. 

Если для каких - либо компонент векторной функции заданная погрешность интегрирования не может быть достигнута, то соответствующие компоненты вектоpа ind полагаются равными нулю.

  5. 

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

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

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

int main(void)
{
    /* Local variables */
    static int ierr;
    static float rint[5];
    extern int qst2r_c(float *, float *, float *, U_fp, int *, float *,
                       int *, int *, float *, int *);
    static float r__[10];
    static int ind[5];
    extern int fun_c();

    qst2r_c(rint, &c_b1, &c_b2, (U_fp)fun_c, &c__5, &c_b4, &c__1, ind, r__,
            &ierr);

    printf("\n %16.7e %16.7e %16.7e \n",rint[0],rint[1],rint[2]);
    printf("\n %16.7e %16.7e \n",rint[3],rint[4]);
    printf("\n %5i %5i %5i %5i %5i \n",ind[0],ind[1],ind[2],ind[3],ind[4]);
    return 0;
} /* main */

int fun_c(float *x, float *y, int *i__)
{
    static int j;

    /* Parameter adjustments */
    --i__;
    --y;

    /* Function Body */
    y[1] = 1.f;
    for (j = 1; j <= 4; ++j) {
/* l1: */
        y[j + 1] = y[j] * *x;
    }
    return 0;
} /* fun_c */


Результаты:

                rint                          ind
        1.0000000000 + 00                 1
        5.0000000000 - 01                  1
        3.3333349227 - 01              512
        2.5000023841 - 01              512
        2.0000031788 - 01              512

     ierr  =  0