Текст подпрограммы и версий
qtscr_c.zip  qtscd_c.zip 
Тексты тестовых примеров
tqtscr_c.zip  tqtscd_c.zip 

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

Назначение

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

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

Вычисляются значения неопрeдeлeнного интеграла на отрезках [x1, xi]  i = 1, ..., N, от табличной функции f (x), заданной на равномерной сетке xi = x1 + (i - 1) h,  i = 1, ..., N, по квадратурной формуле, точной для многочленов второй степени.

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

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

    int qtscr_c (real *rint, real *h, real *f, integer *n)

Параметры

rint - вещественный вектоp длины n, содержащий вычисленные значения неопределенного интеграла;
h - заданный шаг равномерной сетки (тип: вещественный);
f - вещественный вектоp длины n, содержащий значения функции f (x);
n - заданное число узлов сетки (тип: целый).

Версии

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

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

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

 

Требуется, чтобы  n ≥ 3.

В подпрограмме qtscd_c параметры rint, h, f имеют тип double.

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

int main(void)
{
    /* Builtin functions */
    double sin(double);

    /* Local variables */
    static float rint[50], f[50];
    static int i__, n;
    static float x, h1;
    extern int qtscr_c(float *, float *, float *, int *);
    static float x1[50];
    int i__1;

    h1 = .064114081632653058f;
    x1[0] = 0.f;
    n = 50;
    i__1 = n;
    for (i__ = 2; i__ <= i__1; ++i__) {
/* l1: */
        x1[i__ - 1] = x1[i__ - 2] + h1;
    }
    i__1 = n;
    for (i__ = 1; i__ <= i__1; ++i__) {
        x = x1[i__ - 1];
/* l2: */
        f[i__ - 1] = (float)sin(x);
    }
    qtscr_c(rint, &h1, f, &n);

    for (i__ = 0; i__ <= 45; i__+= 5) {
        printf("\n  %11.7f %11.7f %11.7f %11.7f %11.7f \n",
               rint[i__], rint[i__+1], rint[i__+2], rint[i__+3], rint[i__+4]);
    }
    return 0;
} /* main */


Результаты:

       rint(1)    =  0.00000
       rint(2)    =  0.00205
       rint(49)  =  1.99794
       rint(50)  =  2.00000