|
Текст подпрограммы и версий iis9r_c.zip |
Тексты тестовых примеров tiis9r_c.zip |
Интерполяция кубическим квази - эрмитовым сплайном табличной функции от одной переменной на неравномерной сетке.
Вычисляются коэффициенты C ( I, 3 ), C ( I, 2 ), C ( I, 1 ) кубического квази - эрмитова сплайна
S (x) = C ( I, 3 ) ( x - x I )3 + C ( I, 2 ) ( x - x I)2 + C ( I, 1 ) ( x - x I) + yI ,
где x ∈ [x I, x I + 1], I =1, 2, ..., N - 1, интерполирующего заданные значения табличной функции yI = y (x I), I = 1, 2, ..., N в узлах сетки {x ( I )}.
Коэффициенты сплайна на отрезке [xI, x I + 1] определяются значениями yI, yI + 1, yI - yI - 1, yI + 2 - yI + 1 и выбираются так, что функция S (x) непрерывна вместе со своей первой производной на всем отрезке [x 1, x N].
Akima H., "A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures", JACM, 17 (4), 1970, 589 - 602.
int iis9r_c (real *x, real *y, integer *nx, real *c,
integer *ierr)
Параметры
| x - | вещественный вектоp длины n, содержащий заданные узлы сетки, при этом x ( i ) < x ( i + 1); |
| y - | вещественный вектоp длины n, содержащий заданные значения интерполируемой функции в узлах сетки: f ( i ) = y ( i ); |
| n - | заданное количество узлов сетки, n ≥ 4 (тип: целый); |
| c - | вещественный двумерный массив размерности n * 3, содержащий вычисленные коэффициенты кубического квази - эрмитова сплайна; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr=65 - | когда заданное количество n узлов сетки меньше четырех; |
| ierr=66 - | когда x ( i ) ≥ x ( i + 1) хотя бы для одного i. |
Версии: нет
Вызываемые подпрограммы
| uti i10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i is9r_c. |
Замечания по использованию: нет
int main(void)
{
/* Local variables */
static int ierr;
extern int iis9r_c(float *, float *, int *, float *, int *);
static float c__[15] /* was [5][3] */;
static int i__, i, n;
static float x[5], y[5];
int i__1;
#define c___ref(a_1,a_2) c__[(a_2)*5 + a_1 - 6]
n = 5;
i__1 = n;
for (i__ = 1; i__ <= i__1; ++i__) {
x[i__ - 1] = (float) i__;
/* l2: */
y[i__ - 1] = ((x[i__ - 1] - 2.f) * x[i__ - 1] - 3.f) * x[i__ - 1] +
4.f;
}
iis9r_c(x, y, &n, c__, &ierr);
for (i = 1; i <= 5; ++i) {
printf("\n %16.7e \n",y[i-1]);
}
printf("\n %5i \n",ierr);
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %16.7e %16.7e %16.7e \n",
c___ref(i__, 1), c___ref(i__, 2), c___ref(i__, 3));
}
return 0;
} /* main */
Результаты:
ierr = 0
| 0.0 |
| -2.0 |
y = | 4.0 |
| 24.0 |
| 64.0 |
| -6.0 5.090909 -1.090909 |
| 0.909091 6.181818 -1.090909 |
c__ = | 10.0 11.764706 -1.764706 |
| 28.235294 13.592412 -1.764706 |
| 5.0 0.0 0.0 |