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

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

Назначение

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

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

Пусть в узлах сетки  xk :  x1 < x2 <  ...< xN заданы значения  yk = y (xk). Интерполирующая функция  y (x) является периодической на отрезке  [x1, xN] и на каждом из отрезков  [xk, xk + 1] представляется кубическим полиномом Эрмита [1], построенным по значениям  yi, y''i и  yi + 1 , y''i + 1 , где  y''i = y'' (xi) определяются из условия непрерывности первой производной функции  y (x) в узловых точках [2]. Это обеспечивает гладкость второго порядка  y (x) на всем отрезке [x1, xN].

1. 

И.С.Березин, Н.П.Жидков, Методы вычислений, т. 1, Физматгиз, 1962.

2.  Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения. M., "Мир", 1972.

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

    int ids5r_c (integer *n, real *x, real *y, real *y2, real *f,
            real *g, real *h)

Параметры

n - число узлов сетки, n ≥ 3 (тип: целый);
x - одномерный массив размерности n значений узлов сетки (тип: вещественный);
y - одномерный массив размерности n значений табличной функции (тип: вещественный);
y2 - одномерный массив размерности n вычисляемых значений вторых производных в узлах сетки (тип: вещественный);
f, g, h - одномерные рабочие массивы размерности n (тип: вещественный).

Версии: нет

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

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

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

На сетке  xk = (k-1)*2π/5  брались значения  yk = cos (xk) ,   k  =  1,  ..., 6 .

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

    /* Local variables */
    extern int ids5r_c(int *, float *, float *, float *, float *, float *,
                       float *);
    static float f[6], g[6], h__[6];
    static int k, n, i;
    static float x[6], y[6], y2[6], pi;

    pi = 1.2566370612f;
    n = 6;
    for (k = 1; k <= 6; ++k) {
        x[k - 1] = (k - 1) * pi;
        y[k - 1] = (float)cos(x[k - 1]);
/* l1: */
    }
    ids5r_c(&n, x, y, y2, f, g, h__);

    for (i = 1; i <= 6; ++i) {
        printf("\n %16.7e \n",y2[i-1]);
    }
    return 0;
} /* main */


Результат:    ( -1.2,  -0.34,  0.93,  0.85,  -0.10,  -1.20 )