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

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

Назначение

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

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

Пусть в узлах сетки  x1,  x2,  ...,xN заданы значения циклической функции  yK = y(xK), причем  x1 = xN,  y1 = yN. Предположим, что  xi = x (ti),  yi = y (ti),  i = 1, 2, ..., N, где величины  ti определяются соотношениями:

     ti  =  ti-1 + di ,  для   i = 2, 3, ..., N    и   t1 = 0 . 

Шаги  di по параметру  ti могут определяться одной из следующих формул:

          а)  di  =  ( (Δxi)2  +  (Δyi)2 )1/2

          б)  di  =  ( Δxi )2  +  ( Δyi )2

          в)  di  =  | Δxi |  +  | Δyi | ,    i = 2, ..., N-1 , 

где  Δ xi = xi + 1 - xi ,  Δ yi = yi + 1 - yi.

Значения вторых производных  xi,  yi определяются по парам значений  (ti, xi),  (ti, yi),  i = 1, 2, ..., N методом интерполирующих кубических сплайнов.

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

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

    int ids6r_c (integer *n, integer *npar, real *t, real *x,
            real *x2, real *y, real *y2, real *f, real *g, real *h)

Параметры

n - заданное число узлов сетки, n ≥ 3 (тип: целый);
npar - характеризует способ параметризации заданной функции (тип: целый); при этом:
npar=1 - если величины  di определяются по формуле а);
npar=2 - если величины  di определяются по формуле б);
npar=3 - если величины  di определяются по формуле в);
t - вещественный одномерный массив значений  ti размерности n;
x - вещественный одномерный массив значений  xi размерности n, причем x (1) = x (n);
x2 - вещественный одномерный массив размерности n вычисляемых значений вторых производных  x (t) в узлах сетки  ti;
y - вещественный одномерный массив значений  yi размерности n, причем y (1) = y (n);
y2 - вещественный одномерный массив размерности n вычисляемых значений вторых производных  y (t) в узлах сетки  ti;
f, g, h - вещественные одномерные рабочие массивы размерности n.

Версии: нет

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

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

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

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

На единичной окружности были взяты 17 точек. Вычислялись значения  x''i и  y''i,  i = 1, 2, ..., 17.

int main(void)
{
    /* Initialized data */
    static float x[17] = { -1.f,-.75f,-.5f,-.25f,0.f,.25f,.5f,.75f,1.f,.75f,
                             .5f,.25f,0.f,-.25f,-.5f,-.75f,-1.f };
    static float y[17] = { 0.f,-.6614f,-.866f,-.9682f,-1.f,-.9682f,-.866f,
            -.6614f,0.f,.6614f,.866f,.9682f,1.f,.9682f,.866f,.6614f,0.f };

    /* Local variables */
    static int npar;
    extern int ids6r_c(int *, int *, float *, float *, float *, float *,
                       float *, float *, float *, float *);
    static float f[17], g[17], h__[17];
    static int n, i;
    static float t[17], x2[17], y2[17];

    n = 17;
    npar = 1;
    ids6r_c(&n, &npar, t, x, x2, y, y2, f, g, h__);

    for (i = 0; i <= 12; i+= 3) {
        printf("\n %16.7e %16.7e %16.7e ",x2[i], x2[i+1],x2[i+2]);
    }
        printf("\n %16.7e %16.7e \n",x2[15], x2[16]);
    for (i = 0; i <= 12; i+= 3) {
        printf("\n %16.7e %16.7e %16.7e ",y2[i], y2[i+1], y2[i+2]);
    }
        printf("\n %16.7e %16.7e \n",y2[15], y2[16]);
    return 0;
} /* main */


Результаты:

       x2  =  ( 1.10,  0.77,  0.5,  0.25,  -0.0002,  -0.25,  -0.5,  -0.76, 
                   -0.11,  -0.76,  -0.5,  -0.25,  -0.0019,  0.26,  0.48,  0.85, 1.1 )
       y2  =  ( 0.041,  0.73,  0.87,  0.98,  1.,  0.98,  0.086,  0.074, 
                   0.00001,  -0.74,  -0.86,  -0.99,  -1.,  -1.,  -0.82,  -0.89, 0.041 )