|
Текст подпрограммы и версий ias1r_c.zip |
Тексты тестовых примеров tias1r_c.zip |
Вычисления значения кубического аппроксимирующего сплайна или его производной до третьего порядка при заданном значении аргумента на заданной (возможно неравномерной) сетке сплайна при заданных коэффициентах.
Пусть заданы сетка сплaйнa TX (I) , I = 1, ..., NX + 4 и его коэффициенты CX (I), I = 1, ..., NX + 2, где NX - число узлов исходной сетки.
Для вычисления значения сплайна или его производной до третьего порядка при заданном аргументе XX определяется номер интервала на массиве TX такой, чтобы XX принадлежал отрезку [ТХ (IХ), ТХ (IХ + 1)] , где 3 ≤ IX ≤ NX + 1.
Тогда из свойств локальных базисных сплайнов выводятся рекурентные формулы для вычисления производной порядка IDX, где 0 ≤ IDX ≤ 3 :
A(I) = CX(IX - 3 + I) , I = 1, ..., 4 ;
A(I) = (4 - J) * ( A(I + 1) - A(I) ) / ( TX(IX + I) - TX(IX - 4 + I + J) ) ,
I = 1, ..., 4-J , J = 1 ,..., IDX ;
B(I) = TX(IX + I) - XX , I = 1, ..., 3-IDX ;
C(I) = XX - TX(IX + 1 - I) , I = 1,..., 3-IDX ;
A(I) = ( C(5 - I - J)*A(I + 1) + B(I)*A(I) ) / ( C(5 - I - J) + B(I) ) ,
I = 1 ,..., 4-J , J = IDX + 1 ,..., 3 .
После проведения этих вычислений значение содержится в A (1).
real ias1r_c (real *tx, integer *nx, real *cx, integer *idx, real *xx)
Параметры
| tx - | вещественный вектоp длины nx + 4, содержащий значения узлов сетки сплайна; |
| nx - | заданное число узлов исходной сетки, nx ≥ 4 (тип: целый); |
| cx - | вещественный вектоp длины nx + 2, содержащий значения коэффициентов сплайна; |
| idx - | заданный порядок вычисляемой производной, 0 ≤ idx ≤ 3 (тип: целый); |
| xx - | заданное значение аргумента, при котоpом производятся вычисления, tx (3) ≤ xx ≤ tx (nx + 2) (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Подпрограмма - функция использует рабочие подпрограммы - функции ias1r1_c и ias1r2_c. Для вычисления сетки и коэффициентов сплайна рекомендуется воспользоваться подпрограммой iac1r_c. |
int main(void)
{
/* Initialized data */
static float x[4] = { 2.f,3.f,4.f,5.f };
static float fx[4] = { 8.f,27.f,64.f,125.f };
/* Local variables */
extern int iac1r_c(float *, int *, float *, int *, int *, float *,
int *, float *, float *, float *);
extern float ias1r_c(float *, int *, float *, int *, float *);
static float s, cx[8], tx[8];
iac1r_c(x, &c__4, fx, &c__1, &c__1, &c_b4, &c__2, &c_b6, tx, cx);
s = (float)ias1r_c(tx, &c__4, cx, &c__1, &c_b9);
printf("\n %16.7e \n",s);
return ;
} /* main */
Результат: s = 17.280