Текст подпрограммы и версий ip01r_c.zip , ip01r_c.zip |
Тексты тестовых примеров tip01r_c.zip , tip01r_c.zip |
Вычисление коэффициентов интерполяционного полинома
Пусть заданы узлы сетки 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 )