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