|
Текст подпрограммы и версий 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 )