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

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

Назначение

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

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

Пусть в узлах неравномерной ceтки t1 < t2 ... < tN известны значения параметрически заданной циклической функции x = x(t) и y = y(t) и ее вторых производных x'' = x''(t) и y'' = y''(t). Требуется найти значение этой функции в некоторой точке  t0: t1 < t0 ≤ tN. Эта задача интерполяции решается в i is1r_c посредством построения кубических полиномов по значениям ( 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 ) как интерполяционных полиномов Эрмита [1], [2].

1. 

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

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

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

    int iis1r_c (real *to, integer *n, real *t, real *x, real *y,
            real *x2, real *y2, real *xo, real *yo, integer *ierr)

Параметры

to - значение t0, в котоpом ищется параметрически заданная циклическая функция (тип: вещественный);
n - заданное число узлов сетки,  n ≥ 3 (тип: целый);
t - вещественный одномерный массив значений  ti размерности  n;
x - вещественный одномерный массив значений  xi размерности  n;
x2 - вещественный одномерный массив вторых производных  x''i размерности  n;
y - вещественный одномерный массив значений  yi размерности  n;
y2 - вещественный одномерный массив вторых производных  y''i размерности  n;
xo - вещественная переменная, содержащая вычисленное значение  x (t0);
yo - вещественная переменная, содержащая вычисленное значение  y (t0);
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
ierr=65 - когда заданное значение  to не принадлежит полуинтервалу (t1, tn].

Версии: нет

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

uti i10_c - подпрограмма выдачи диагностических сообщений при работе подпрограммы i is1r_с.

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

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

На единичной окружности были взяты 17 точек. Значения векторов t, x, y, x2 и y2 определены в примере использования подпрограммы ids6r.

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,-.66143775f,-.8660253f,-.9682457f,-1.f,
                 -.9682457f,-.8660253f,-.66143775f,0.f,.66143775f,.8660253f,
                  .9682457f,1.f,.9682457f,.8660253f,.66143775f,0.f };

    /* Local variables */
    static int npar, ierr;
    extern int ids6r_c(int *, int *, float *, float *, float *, float *,
                       float *, float *, float *, float *),
               iis1r_c(float *, int *, float *, float *, float *, float *,
                       float *, float *, float *, int *);
    static float f[17], g[17], h__[17];
    static int n, i;
    static float t[17], t0, x0, y0, 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]);

    t0 = 1.f;
    n = 17;
    iis1r_c(&t0, &n, t, x, y, x2, y2, &x0, &y0, &ierr);

    printf("\n %5i \n",ierr);
    printf("\n %16.7e %16.7e \n",x0, y0);
    return 0;
} /* main */


Результаты:

       x0  = - 0.526 ,     y0  = - 0.8505 ,

       ierr  =  0