Текст подпрограммы и версий
ip01r_c.zip , ip01r_c.zip
Тексты тестовых примеров
tip01r_c.zip , tip01r_c.zip

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

Назначение

Вычисление коэффициентов интерполяционного полинома

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

Пусть заданы узлы сетки  x1, x2, ..., xN, упорядоченные по возрастанию:  x1 < x2 < ...< xN и значения  y1, y2, ..., yn функции  f (x) в узлах этой сетки. Подпрограмма ip01r_c вычисляет коэффициенты  ci  ( i = 1, 2, ..., N ) интерполяционного полинома

                   P(x)  =  c1 + c2 x + c3 x2 + ... + cN xN-1

 степени N - 1. 

Отметим, что коэффициенты  ci интерполяционного полинома удовлетворяют системе линейных алгебраических уравнений

   |   1   x1   x12   ...   x1N-1   |         |   c1   |          |   y1   |
   |   1   x2   x22   ...   x2N-1   |         |   c2   |    =    |   y2   |
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
   |   1   xN   xN2  ...   xNN-1  |         |   cN  |          |   yN  |

 с матрицей Вандермонда.

Решение этой системы с транспонированной матрицей осуществляется подпрограммой asv1r_c .

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

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

    int ip01r_c(real *x, real *y, integer *n, real *cof, real *s)

Параметры

x - вещественный вектор длины n, содержащий узлы заданной сетки  x1, x2, ..., xn, упорядоченной по возрастанию;
y - вещественный вектор длины n, содержащий значения  y1, y2, ..., yn функции  f (x) в узлах заданной сетки;
n - количество узлов сетки, n ≥ 2 (тип: целый);
cof - вещественный вектор длины n, содержащий вычисленные коэффициенты интерполяционного полинома;
s - вещественный вектор длины n, используемый в подпрограмме в качестве рабочего.

Версии

ip01d_c - вычисление коэффициентов интерполяционного полинома в режиме удвоенной точности; при этом параметры x, y, cof и s должны иметь тип double.

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

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

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

int main(void)
{
    /* Initialized data */
    static float sys001 = 3.14159265f;

    /* Builtin functions */
    double cos(double), sin(double);

    /* Local variables */
    extern int ip01r_c(float *, float *, int *, float *, float *);
    static float a, b;
    static int i, j, k, n;
    static float s[5], x[5], y[5], x1[5], y1[5], cof[5];
    int i__1;

    n = 5;
    a = 0.f;
    b = 1.f;
    i__1 = n;
    for (k = 1; k <= i__1; ++k) {
        x1[k - 1] = (b + a) / 2 + (b - a) / 2 *
                (float)cos((float)(((k << 1) - 1) * sys001 / (n << 1)));
/* L1: */
        y1[k - 1] = (float)sin(x1[k - 1]) / x1[k - 1];
    }
    i__1 = n;
    for (j = 1; j <= i__1; ++j) {
        k = n - j + 1;
        x[k - 1] = x1[j - 1];
/* L5: */
        y[k - 1] = y1[j - 1];
    }
    ip01r_c(x, y, &n, cof, s);

    for (i = 1; i <= 5; ++i) {
        printf("\n %16.7e \n",cof[i-1]);
    }
    return 0;
} /* main */

      
Результаты:
     
        cof  =  ( 0.999999, 0.202257e-04, 
                       -0.166825, 0.464717e-03, 0.781631e-02 )