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