Текст подпрограммы и версий is03r_c.zip , is03d_c.zip |
Тексты тестовых примеров tis03r_c.zip , tis03d_c.zip |
Среднеквадратическое сглаживание дискретно заданной функции сплайном k - го порядка.
Пусть в узлах xi : x1 < x2 < ...< xl , заданы значения табличной функции gi . Строится сглаживающая сплайн - функция
n f(x) = ∑ ai Ni k (x) , определяемая условиями : i=1 l ∑ wi ( gi - f( xi ) )2 - min a ; i=1
здесь wi > 0 - заданные весовые коэффициенты, Ni k, i = 1, ..., n - нормированные В - сплайны k - го порядка, соответствующие узлам ti, ti + 1, ..., ti + k таким, что : t1 ≤ t2 ≤ ...≤ tk < tk + 1 < ...< tn < tn + 1 ≤ ... ≤ tn + k. При этом требуется, чтобы tk ≤x1 < xl ≤ tn + 1, а l ≥ n.
C. de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14(3), 1977, pp. 441-472.
int is03r_c (integer *n, integer *k, integer *lx, real *t, real *x, real *g, real *w, real *a, real *r, real *r1, real *r2, integer *ierr)
Параметры
n - | заданное число нормированных B - сплайнов (тип: целый); |
k - | заданный порядок B - сплайна (тип: целый); |
lx - | заданное число узлов аппроксимации, lx ≥ n (тип: целый); |
t - | вещественный вектоp длины n + k заданных значений узлов сплайна: t (1) ≤ t (2) ≤ ...≤ t (k) < t (k + 1) < ...< t (n + 1) ≤ t (n + 2) ≤ ...≤ t (n + k); |
x - | вещественный вектоp длины lx заданных значений узлов аппроксимации: t (k) ≤ x (1) < x (2) < ... < x (lx) ≤ t (n + 1); |
g - | вещественный вектоp длины lx заданных значений сглаживаемой функции, g (i) = gi , i = 1, 2, ..., lx; |
w - | вещественный вектоp длины lx весовых коэффициентов w (i) = wi > 0 , i = 1, 2, ..., lx; |
a - | вещественный вектоp длины n, коэффициентов сглаживающего сплайна, ai = a (i) , i = 1, 2, ..., n; |
r - | вещественный двумерный рабочий массив размера n на (2*k - 1); |
r1 - | вещественный рабочий вектоp длины k; |
r2 - | вещественный двумерный рабочий массив размера n на k; |
ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
ierr=65 - | если матрица нормальной системы уpавнений для определения коэффициентов сглаживающего сплайна вырождена. |
Версии
is03d_c - | среднеквадратическое сглаживание дискретно заданной функции сплайном k - го порядка с повышенной точностью. Массивы t, x, g, w, a, r, r1, r2 имеют тип double. |
Вызываемые подпрограммы
utis10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы is03r_c. |
utis11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы is03d_c. |
asb1r_c - | решение системы линейных алгебраических уpавнений с ленточной матрицей, заданной в компактной форме, с выбором ведущего элемента по столбцу. |
asb1d_c - | решение системы линейных алгебраических уpавнений с ленточной матрицей, заданной в компактной форме с удвоенной точностью (выбор ведущего элемента по столбцу). |
Замечания по использованию
В подпрограммах is03r_c, is03d_c используются служебные подпрограммы i i21r1_c, i i21d1_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 w[12] = { 1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f }; /* Local variables */ extern int is03r_c(int *, int *, int *, float *, float *, float *, float *, float *, float *, float *, float *, int *); static int ierr; static float a[6], g[12]; static int i__, k, n; static float r__[30] /* was [6][5] */, x[12], r1[3], r2[18] /* was [6][3] */; static int lx; static float xx; int i__1, i; n = 6; lx = 12; k = 3; i__1 = lx; for (i__ = 1; i__ <= i__1; ++i__) { xx = (float) i__ * .5f + .5f; x[i__ - 1] = xx; g[i__ - 1] = xx * xx * xx; /* l5: */ } is03r_c(&n, &k, &lx, t, x, g, w, a, r__, r1, r2, &ierr); printf("\n %5i \n",ierr); for (i = 0; i <= 3; i += 3) { printf("\n %16.7e %16.7e %16.7e \n",a[i], a[i+1], a[i+2]); } return 0; } /* main */ Результаты: ierr = 0 a = ( .290, -2.236, 18.081, 110., 321.72, 520.93 )