Текст подпрограммы и версий
ii22r_c.zip , ii22d_c.zip
Тексты тестовых примеров
tii22r_c.zip , tii22d_c.zip

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

Назначение

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

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

Пусть заданы узлы сетки  x1, x2, ..., xNA, упорядоченные по возрастанию:  x1 < x2 < ...< xNA и значения  y1, y2, ..., yNA интерполируемой функции  f (x) в узлах этой сетки. Подпрограмма i i22r_c вычисляет значение Y интерполяционной рациональной функции

    R(x)  =  PNN(x) / QNN(x)  =

             =  ( p0 + p1 x + ... + pNN xNN ) / ( q0 + q1 x + ... + qNN xNN ) 

в заданной точке X и оценку ошибки DY полученного значения по модифицированной схеме Невилла.

Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.

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

    int ii22r_c (real *xa, real *ya, integer *na, integer *nn,
            real *x, real *y, real *dy, real *c, real *d, integer *ierr)

Параметры

xa - вещественный вектор длины na, содержащий узлы заданной сетки  x1, x2, ..., xna, упорядоченные по возрастанию;
ya - вещественный вектор длины na, содержащий значения  y1, y2, ..., yna интерполируемой функции в узлах заданной сетки;
na - количество узлов сетки, na ≥ 2*nn + 1 (тип: целый);
nn - заданная степень полиномов PNN (x) и QNN (x), nn ≥ 1 (тип: целый);
x - заданная точка, в которой ищется значение интерполяционной рациональной функции (тип: вещественный);
y - вещественная переменная, содержащая вычисленное значение интерполяционной рациональной функции в точке x;
dy - вещественная переменная, содержащая оценку ошибки вычисленного значения интерполяционной рациональной функции в точке x;
c, d - вещественные векторы длины 2*nn + 1, используемые в подпрограмме в качестве рабочих;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом
ierr=65 - когда интерполируемая функция имеет полюс в заданной точке x;
ierr=66 - когда число узлов сетки меньше 2*nn + 1 .

Версии

i i22d_c - вычисление значения интерполяционной рациональной функции в заданной точке по модифицированной схеме Невилла в режиме удвоенной точности. При этом параметры xa, ya, x, y, dy, c и d должны иметь тип double .

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

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

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

  Точка x не обязательно должна лежать внутри заданной сетки. В случае, когда x < x1 или x > xna, подпрограммы i i22r_c и i i22d_c строят экстраполяционную рациональную функцию и вычисляют ее значение в точке x .

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

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

    /* Local variables */
    extern int ii22r_c(float *, float *, int *, int *, float *, float *,
                       float *, float *, float *, int *);
    static int ierr;
    static float c__[9], d__[9];
    static int i__;
    static float r__, x, y;
    static int na;
    static float xa[20], ya[20];
    static int nn;
    static float dy;
    int i__1;

    r__ = 0.f;
    na = 20;
    i__1 = na;
    for (i__ = 1; i__ <= i__1; ++i__) {
        xa[i__ - 1] = r__;
        ya[i__ - 1] = (float)sin(xa[i__ - 1]);
/* l1: */
        r__ += .2f;
    }
    x = 1.1f;
    nn = 4;
    ii22r_c(xa, ya, &na, &nn, &x, &y, &dy, c__, d__, &ierr);

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

Результаты:

             y  =  0.89121                                 
          dy  =  0.96018*10 - 8 
       ierr  =  0