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

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

Назначение

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

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

Пусть заданы пары значений (xi, yi). Считается, что  xi = x (ti),  yi = y (ti) ,  i = 1, 2, ... N, а величины ti = ti - 1 + di,  i =  2, 3, ... N,  t1 = 0. Шаги по параметру  di могут определятся из следующих формул:

     а)  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 .

Далее по парам значений (ti, xi),  (ti, yi) ,  i = 1, ..., N и известным значениям вторых производных в концевых точках  x''1,  x''N и  y''1,  y''N методом кубических сплайнов [1] вычисляются значения вторых производных  x''i и  y''i,   i = 2, ...,N - 1.

Интерполирующие функции  x = x (t) и  y = y (t) на каждом из отрезков [ti, ti + 1] представляют из себя кубические полиномы, построенные по значениям (ti, xi),  (ti, x''i),  (ti + 1,xi + 1),  (ti + 1,x''i + 1) и  (ti, yi),  (ti, y''i),  (ti + 1, yi + 1),  (ti + 1, y''i + 1) как интерполяционные полиномы Эрмита [2]. Tак построенные функции  x (t) и  y (t) являются дважды непрерывно дифференцируемыми на всем отрезке [t1, tN] по параметру  t.

1. 

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

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

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

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

Параметры

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

Версии: нет

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

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

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

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

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

int main(void)
{
    /* Local variables */
    extern int ids4r_c(int *, int *, float *, float *, float *, float *,
                       float *, float *, float *);
    static float f[10], g[10];
    static int i__, i;
    static float t[10], x[10], y[10], x2[10], y2[10];

    for (i__ = 1; i__ <= 10; ++i__) {
        x[i__ - 1] = (float) (i__ - 1) * .22222222222222221f - 1.f;
/* L5: */
        y[i__ - 1] = 1.f - x[i__ - 1] * x[i__ - 1];
    }
    x2[0] = 1.f;
    x2[9] = -1.f;
    y2[0] = 0.f;
    y2[9] = 0.f;
    ids4r_c(&c__10, &c__1, t, x, x2, y, y2, f, g);

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


Результат:

       x2  =  ( 1.00,   0.83,   0.55,   0.34,   0.11,  -0.11,  -0.34, 
                    -0.55,  -0.83,  -1.00 )
       y2  =  ( 0.00,  -0.70,  -0.83,  -0.96,  -1.00,  -1.00,  -0.96, 
                    -0.83,  -0.70,   0.00 )