|
Текст подпрограммы и версий ii21r_c.zip |
Тексты тестовых примеров tii21r_c.zip |
Построение интерполирующего сплайна k - го порядка с произвольными узлами интерполяции.
Пусть задана сетка узлов (yзлы cплайна):
t1 ≤ t2 ≤ ... ≤ tk < tk + 1 < ... < tn < tn + 1 ≤ tn + 2 ≤ ... ≤ tn + k ,
определяющая для i = 1, 2, ..., n нормированные В - сплайны Ni k (x) порядка k, соответствующие узлам
ti , ti + 1 , ... , ti + k .
Строится сплайн - функция
n
f (x) = ∑ a i Ni k (x) , t1 ≤ x ≤ tn + 1 ,
i = 1
коэффициенты ai, i = 1, 2, ..., n, которой определяются условиями интерполяции
n
∑ a i Ni k ( z j ) = bj , j = 1, 2, ... , n ,
i = 1
где Z1 < Z2 < ... < Zn узлы интерполяции, такие что [Z1, Zn] ⊆ [ t1, tn + 1 ] , а bj - заданные значения.
C.de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14 (3), 1977, pp. 441 - 472.
int ii21r_c (integer *n, integer *k, real *t, real *z,
real *a, real *b, real *r, real *r1, real *r2, integer *ierr)
Параметры
| n - | заданное число узлов интерполяции (тип: целый); |
| k - | заданный порядок B - сплайна (тип: целый); |
| t - |
вещественный вектоp длины n + k значений
узлов сплайна: t (1) ≤ t (2) ≤ ... ≤ t (k) < t (k + 1) < t (k + 2) < t (n) < t (n + 1) ≤ t (n + 2) ≤ ... ≤ t (n + k); |
| z - | вещественный вектоp длины n значений узлов интерполяции: t (1) ≤ z (1) < z (2) < ... < z (n) ≤ t (n + k); |
| a - | вещественный вектоp длины n: ai = a (i), i = 1, 2, ..., n; |
| b - | вещественный вектоp длины n: bi = b (i), i = 1, 2, ..., n; |
| r - | вещественный двумерный рабочий массив размера n * (2*k - 1); |
| r1 - | вещественный рабочий вектоp длины k; |
| r2 - | вещественный двумерный рабочий массив размера n*k; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr=65 - | когда какой - то узел z (i) не принадлежит [t (1), t (n + 1)]; |
| ierr=66 - | когда матрица для определения коэффициентов вырождена. |
Версии: нет
Вызываемые подпрограммы
| uti i10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы i i21r_c ; |
| asb1r_c - | подпрограмма решения системы с ленточной матрицей, заданной в компактной форме, с выбором ведущего элемента по столбцу; |
| i i21r1_c - | служебная подпрограмма; |
| i i21r2_c - | служебная подпрограмма; |
Замечания по использованию: нет
int main(void)
{
/* Initialized data */
static float t[9] = { 0.f,0.f,0.f,2.f,4.f,6.f,8.f,8.f,8.f };
static float z__[6] = { 1.f,3.f,4.f,5.f,6.f,7.f };
/* Local variables */
extern int ii21r_c(int *, int *, float *, float *, float *, float *,
float *, float *, float *, int *);
static int ierr;
static float a[6], b[6];
static int i__, k, n;
static float r__[30] /* was [6][5] */, r1[3],
r2[18] /* was [6][3] */, zx;
int i__1, i;
n = 6;
k = 3;
i__1 = n;
for (i__ = 1; i__ <= i__1; ++i__) {
zx = z__[i__ - 1];
b[i__ - 1] = zx * zx * zx;
/* l5: */
}
ii21r_c(&n, &k, t, z__, a, b, r__, r1, r2, &ierr);
printf("\n %5i \n",ierr);
for (i = 1; i <= 6; ++i) {
printf("\n %16.7e \n",a[i-1]);
}
return 0;
} /* main */
Результаты: ierr = 0 , a = 0., -2., 18., 110., 322., 512.