Текст подпрограммы и версий iis4r_c.zip |
Тексты тестовых примеров tiis4r_c.zip |
Вычисление значений интерполяционного кубического сплайна в заданных точках.
Вычисляются значения кубичeckoгo сплайна S (x), соответствующего сетке {xi} и интерполирующего заданные значения табличной функции yi = y (xi), i = 1, 2, ..., N, в точках uk, k = 1, 2, ..., M по формуле:
S (uk) = yj + c1 j ( uk - xj ) + c2 j ( uk - xj )2 + c3 j ( uk - xj )3 ,
где индекс j такой, что uk содержится в отрезке [xj, xj + 1], а c1 j, c2 j, c3 j, j = 1, 2, ..., N - 1, - заданные коэффициенты кубического сплайна.
Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., Мир, 1972.
int iis4r_c (real *x, real *y, integer *nx, real *c, real *u, real *s, integer *m, integer *ierr)
Параметры
x - | вещественный вектоp длины nx, содержащий заданные значения узлов сетки и упорядоченный так, что x (1) < x (2) < ... < x (nx); |
y - | вещественный вектоp длины nx, содержащий заданные в узлах сетки значения интерполируемой функции; |
nx - | заданное число узлов сетки, nx ≥ 2 (тип: целый); |
c - | вещественный двумерный массив размера 3 * (nx - 1), содержащий заданные коэффициенты интерполяционного кубического сплайна; |
u - | вещественный вектоp длины m, содержащий заданные точки, в которых вычисляются значения интерполяционного кубического сплайна, x (1) ≤ u (k) ≤ x (nx), k = 1, 2, ..., m; |
s - | вещественный вектоp длины m, содержащий вычисленные значения интерполяционного кубического сплайна; |
m - | заданное число точек, в которых вычисляются значения интерполяционного кубического сплайна (тип: целый); |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr= 1 - | когда одна или несколько заданных точек меньше x (1); |
ierr= 2 - | когда одна или несколько заданных точек больше x (nx); |
ierr=65 - | когда заданное число узлов сетки меньше 2; |
ierr=66 - | когда элементы вектоpа x не упорядочены по возрастанию. |
Версии: нет
Вызываемые подпрограммы
uti i10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i is4r_c. |
Замечания по использованию: нет
int main(void) { /* Initialized data */ static float x[5] = { 1.f,2.f,3.f,4.f,5.f }; static float u[8] = { 1.5f,4.5f,3.f,4.9f,2.1f,4.f,2.7f,1.8f }; /* Local variables */ static float bpar[4]; static int ierr; extern int iis3r_c(float *, float *, int *, float *, float *, int *), iis4r_c(float *, float *, int *, float *, float *, float *, int *, int *); static float c__[12] /* was [3][4] */; static int i__, m; static float s[8], y[5]; static int nx; int i__1, i; nx = 5; i__1 = nx; for (i__ = 1; i__ <= i__1; ++i__) { y[i__ - 1] = ((x[i__ - 1] - 4.f) * x[i__ - 1] - 1.f) * x[i__ - 1] + 5.f; /* l5: */ } bpar[0] = 1.f; bpar[1] = 6.f / (x[1] - x[0]) * ((y[1] - y[0]) / (x[1] - x[0]) + 6.f); bpar[2] = 1.f; bpar[3] = 6.f / (x[4] - x[3]) * (34.f - (y[4] - y[3]) / (x[4] - x[3])); iis3r_c(x, y, &nx, bpar, c__, &ierr); m = 8; iis4r_c(x, y, &nx, c__, u, s, &m, &ierr); printf("\n %5i \n",ierr); for (i = 0; i <= 6; i += 2) { printf("\n %16.7e %16.7e \n",s[i], s[i+1]); } return 0; } /* main */ Результаты: ierr =0 s(1) = -2.125 s(5) = -5.479 s(2) = 10.625 s(6) = 1.000 s(3) = -7.000 s(7) = -7.177 s(4) = 21.709 s(8) = -3.928