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

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

Назначение

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

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

Пусть в узлах неравномерной сетки  xK :  x1<x2<  ...<xN  заданы значения функции  y(x) :  yK = y(xK) и ее первой производной:  y'K = y'(xK), и известны значения ее второй производной в концевых точках :  y''1 = y''(x1),  y''N = y''(xN). Интерполяционный сплайн S(x)  5 - й степени на каждом из отрезков  [xK, xK+1] является многочленом  5 - й степени

     AK(x-xK)5 + BK(x-xK)4 + CK(x-xK)3 + DK(x-xK)2 + EK(x-xK) + FK ,

 где
   AK = 1/(ΔxK)4  [ 6 (ΔyK/ΔxK) - 3 (y'K + y'K+1) + ΔxK/2  (y''K+1 - y''K) ] ,

   BK = 1/(ΔxK)3 [ -15(ΔyK/ΔxK) + 8y'K + 7y'K+1 + ΔxK/2 (3y''K - 2y''K+1) ] ,

   CK = y'''K / 6 =
          = 1/(ΔxK)2  [ 10 ΔyK/ΔxK  -  6y'K - 4 y'K+1 + ΔxK/2  (y''K+1 - 3y''K) ] ,

   DK = y''K / 2 ,   EK = y'K ,   FK = yK ,
   ΔxK = xK+1 - xK ,   ΔyK = yK+1 - yK , 

а вторые производные  y''K определяются из условия непрерывности третьей производной S''' (x) сплайна S (x).

Подпрограмма ids7r_c вычисляет в узлах сетки значения второй и третьей производной сплайна S (x).

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

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

    int ids7r_c (integer *n, real *x, real *y, real *y1, real *y2,
            real *y3)

Параметры

n - заданное число узлов сетки, n ≥ 3 (тип: целый);
            x, y -
            y1  
вещественные одномерные массивы длины n, содержащие заданные значения  xk,  yk и  y'k соответственно;
y2 - вещественный одномерный массив длины n, в который помещаются вычисленные значения второй производной  y''k; на входе  y2 (1) = y''1,  y2 (n) = y''n;
y3 - вещественный одномерный массив длины n, в который помещаются вычисленные значения третьей производной  y'''k.

Версии: нет

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

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

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

На сетке  xk = (k-1)*π/4 брались значения  y = sin (xk) ,  k = 1, 2, ..., 5,  y'k = cos (xk),  y''1 = -sin (x1),  y''5 = -sin (x5).

int main(void)
{
    /* Initialized data */
    static float x[5] = { 0.f,.7854f,1.5708f,2.3562f,3.1416f };
    static float y[5] = { 0.f,.7071f,1.f,.7071f,0.f };
    static float y1[5] = { 1.f,.7071f,0.f,-.7071f,-1.f };

    /* Local variables */
    extern int ids7r_c(int *, float *, float *, float *, float *, float *);
    static int n, i;
    static float y2[5], y3[5];

    y2[0] = 0.f;
    y2[4] = 0.f;
    n = 5;
    ids7r_c(&n, x, y, y1, y2, y3);
/* l2: */
    for (i = 0; i <= 2; i += 2) {
        printf("\n %16.7e %16.7e ",y[i], y[i+1]);
    }
    printf("\n %16.7e \n",y[4]);
    for (i = 0; i <= 2; i += 2) {
        printf("\n %16.7e %16.7e ",y1[i], y1[i+1]);
    }
    printf("\n %16.7e \n",y1[4]);
    for (i = 0; i <= 2; i += 2) {
        printf("\n %16.7e %16.7e ",y2[i], y2[i+1]);
    }
    printf("\n %16.7e \n",y2[4]);
    for (i = 0; i <= 2; i += 2) {
        printf("\n %16.7e %16.7e ",y3[i], y3[i+1]);
    }
    printf("\n %16.7e \n",y3[4]);
    return 0;
} /* main */


Результаты:

       y2  =  ( 0.,  -7074,  -1.0004,  -0.7074,  0. )

       y3  =  ( -1.002,  -0.7089,  -0.00002,  0.7090,  1.003 )