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