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