Подпрограмма: ip02r_c
Назначение
Вычисление значения интерполяционного полинома в заданной точке
по модифицированной схеме Невилла.
Математическое описание
Пусть заданы узлы сетки
x1, x2, ..., xNA,
упорядоченные по возрастанию:
x1 < x2 < ...< xNA
и значения y1, y2,
..., yNA интерполируемой
функции f (x) в узлах этой сетки. ip02r_c вычисляет значение Y
интерполяционного полинома степени NP в заданной точке X и оценку
ошибки DY полученного значения по модифицированной схеме Невилла.
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1973.
Использование
int ip02r_c (real *xa, real *ya, integer *na, integer *np,
real *x, real *y, real *dy, real *c, real *d, integer *ierr)
Параметры
xa -
|
вещественный вектор длины na, содержащий узлы заданной сетки
x1, x2, ..., xna,
упорядоченные по возрастанию;
|
ya -
|
вещественный вектор длины na, содержащий значения
y1, y2, ..., yna
интерполируемой функции в узлах заданной сетки;
|
na -
|
количество узлов сетки,
na ≥ np + 1
(тип: целый);
|
np -
|
заданная степень интерполяционного полинома,
np ≥ 1 (тип: целый);
|
x -
|
заданная точка, в которой ищется значение
интерполяционного полинома (тип: вещественный);
|
y -
|
вещественная переменная, содержащая вычисленное
значение интерполяционного полинома в точке x;
|
dy -
|
вещественная переменная, содержащая оценку ошибки
вычисленного значения интерполяционного полинома в точке x;
|
c, d -
|
вещественные векторы длины np + 1, используемые в
подпрограмме в качестве рабочих;
|
ierr -
|
целая переменная, служащая для сообщения об ошибках,
обнаруженных в ходе работы подпрограммы; при этом
|
ierr=65 -
|
когда по крайней мере два узла сетки совпадают;
|
ierr=66 -
|
когда число узлов сетки меньше или равно
степени интерполяционного полинома.
|
Версии
ip02d_c -
|
вычисление значения интерполяционного полинома по
модифицированной схеме Невилла в режиме удвоенной
точности. При этом параметры xa, ya, x, y, dy, c и d
должны иметь тип double.
|
Вызываемые подпрограммы
utip10_c -
|
подпрограмма выдачи диагностических сообщений при
работе подпрограммы ip02r_c;
|
utip11_c -
|
подпрограмма выдачи диагностических сообщений при
работе подпрограммы ip02d_c.
|
Замечания по использованию
|
Точка x не обязательно должна лежать внутри заданной сетки.
В случае, когда x < x1 или
x > xna, подпрограммы ip02r_c и ip02d_c
строят экстраполяционный полином степени np и вычисляют его
значение в точке x.
|
Пример использования
int main(void)
{
/* Builtin functions */
double sin(double);
/* Local variables */
extern int ip02r_c(float *, float *, int *, int *, float *, float *,
float *, float *, float *, int *);
static int ierr;
static float c__[5], d__[5];
static int i__;
static float r__, x, y, y1;
static int na;
static float xa[20], ya[20], dy;
static int np;
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;
np = 4;
ip02r_c(xa, ya, &na, &np, &x, &y, &dy, c__, d__, &ierr);
y1 = (float)sin(x);
printf("\n %16.7e %16.7e \n",x, y);
printf("\n %16.7e %16.7e \n",dy, y1);
printf("\n %5i \n",ierr);
return 0;
} /* main */
Результаты:
y = 0.89121
dy = 0.000034719
ierr = 0