|
Текст подпрограммы и версий id23r_c.zip |
Тексты тестовых примеров tid23r_c.zip |
Вычисление значений производных до некоторого порядка функции, линейно представленной через B - сплайн K - го порядка, в заданной точке.
Пусть функция
n
f(x) = ∑ ai Ni k(x) ,
i=1
где ai - заданные кoэффициенты, а ni k (x) - нормированные B - сплайны K - го порядка, построенные по сети узлов
t1 ≤ t2 ≤ ... ≤ tk < tk+1 <...< tn < tn+1 ≤ tn+2 ≤ ... ≤ tn+k .
B заданной точке x ∈ [t1, tn + 1] для некоторого целого числа ND: 0 ≤ ND ≤ K , вычисляются производные функции f : sj = D j - 1 f (x), j = 1, 2,..., ND.
C.de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14(3), 1977, pp. 441-472.
int id23r_c (real *t, real *a, integer *n, integer *k, real *x,
real *s, integer *nd, real *r, real *r1)
Параметры
| t - | вещественный вектоp длины n + k, узлов сплайна t (1) ≤ t (2) ≤ ...≤ t (k) < t (k + 1) < ...< t (n) < t (n + 1) ≤ ...≤ t (n + k); |
| a - | вещественный двумерный массив размера n*nd, ai = a (i, 1), i = 1, 2,..., n, используемый также как рабочий (тип: вещественный); |
| n - | заданное число B - сплайнов, n ≥ 2*k (тип: целый); |
| k - | порядок B - сплайна (тип: целый); |
| x - | заданное значение точки, в которой вычисляются производные функции, t (1) ≤ x ≤ t (n + 1) (тип: вещественный); |
| s - | вещественный вектоp длины nd, sj = s (j), j = 1, 2,..., nd; |
| nd - | заданное целое число, 0 ≤ nd ≤ k; |
| r - | рабочий вектоp длины k (тип: вещественный); |
| r1 - | вещественный двумерный рабочий массив размера 2k. |
Версии: нет
Вызываемые подпрограммы
| 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 a[18] /* was [6][3] */ = { 0.f,-2.f,18.f,110.f,322.f,512.f,
0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };
/* Local variables */
extern int id23r_c(float *, float *, int *, int *, float *, float *,
int *, float *, float *);
static int k, n;
static float r__[3], s[3], x, r1[6] /* was [2][3] */;
static int nd;
n = 6;
k = 3;
nd = 3;
x = 5.f;
id23r_c(t, a, &n, &k, &x, s, &nd, r__, r1);
printf("\n %16.7e %16.7e %16.7e \n",s[0],s[1],s[2]);
return 0;
} /* main */
Результаты: s = 125., 76., 30.