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