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