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

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

Назначение

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

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

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

1.  И.С.Березин, Н.П.Жидков, Методы вычислений, т. 1, Физматгиз, 1962.
2.  Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., "Мир", 1972.

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

    int ids3r_c (integer *n, real *x, real *y, real *y1, real *f,
            real *g)

Параметры

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

Версии: нет

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

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

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

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

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

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

    pi = .62831853059999998f;
    n = 6;
    for (k = 1; k <= 6; ++k) {
        x[k - 1] = (k - 1) * pi;
        y[k - 1] = (float)cos(x[k - 1]);
/* l1: */
    }
    y1[0] = 0.f;
    y1[n - 1] = -(float)sin(x[n - 1]);
    ids3r_c(&n, x, y, y1, f, g);

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


Результат:

       y1  =  ( 0.00,  -0.59,  -0.95,  -0.95,  -0.59,  0.00 )