Текст подпрограммы и версий iac1r_c.zip |
Тексты тестовых примеров tiac1r_c.zip |
Вычисление сетки и коэффициентов аппроксимирующего кубического сплайна по заданным значениям функции одной переменной и краевым условиям на заданной (возможно неравномерной) сетке.
Пусть заданы сетка X ( I ),
I = 1, ..., NX и значения функции F (X)
на ней:
FX ( I ) = F ( X ( I ) ) ,
I = 1, ..., NX.
Могут быть заданы краевые условия.
Для определения сетки и вычисления коэффициентов воспользуемся формулами :
TX(I + 2) = X( I ) , CX( I + 2) = FX( I ) , I = 1, ..., NX.
При периодических функциях дополнительные узлы и значения функции определяются из условий периодичности :
TX(1) = X(NX - 2) - X(NX) + X(1) , CX(1) = FX(NX - 2) , TX(2) = X(NX - 1) - X(NX) + X(1) , CX(2) = FX(NX - 1) , TX(NX + 3) = X(2) + X(NX) - X(1) , CX(NX + 3) = FX(2) , TX(NX + 4) = X(3) + X(NX) - X(1) , CX(NX + 4) = FX(3) .
При непериодических функциях дополнительные значения функции вычисляются из краевых условий, приведенных в [1], а узлы определены формулами:
TX(1) = 3 * X(1) - 2 * X(2) , TX(NX + 3) = 2 * X(NX) - X(NX - 1) , TX(2) = 2 * X(1) - X(2) , TX(NX + 4) = 3 * X(NX) - 2 * X(NX - 1) .
После определения сетки сплайна и вычисления дополнительных значений функции вычисляются коэффициенты сплайна в зависимости от порядка аппроксимирующих формул [2].
1. | Гребенников А.И., Казе В.О. - Л. Быстрые алгоритмы аппроксимации функции сплайнами и решение некоторых прикладных задач. - Методы и алгоритмы в численном анализе. M.: Изд - во МГУ, 1984. |
2. | Гребенников А.И. Метод сплайнов и решение некоррректных задач теории приближений. M.: Изд - во МГУ, 1983. |
int iac1r_c (real *x, integer *nx, real *fx, integer *lx, integer *mxa, real *fxa, integer *mxb, real *fxb, real *tx, real *cx)
Параметры
x - | вещественный вектоp длины nx, содержащий значения узлов исходной сетки; |
nx - | заданное число узлов исходной сетки. nx ≥ 4 (тип: целый); |
fx - | вещественный вектоp длины nx, содержащий значения функции в узлах исходной сетки; |
lx - | заданное число, порядок аппроксимирующих формул, 0 ≤ lx ≤ 1 (тип: целый); |
mxa - | заданное число, определяющее периодичность функции или тип краевых условий на левом конце отрезка, 0 ≤ mxa ≤ 3 (тип: целый); |
mxa = 3 - | периодическая функция, |
mxa = 0 - | условие интерполяции, |
mxa=1,2 - | задана производная порядка mxa; |
fxa - | заданное значение производной порядка mxa на левом конце отрезка (тип: вещественный), (используется, если mxa = 1, 2); |
mxb - | заданное число, определяющее тип краевых условий на правом конце отрезка, 0 ≤ mxb ≤ 2 (тип: целый), (используется, если mxa < 3), |
mxb = 0 - | условие интерполяции, |
mxb=1,2 - | задана производная порядка mxb; |
fxb - | заданное значение производной порядка mxb на правом конце отрезка (тип: вещественный), (используется, если mxb = 1, 2); |
tx - | вещественный вектоp длины nx + 4, содержащий вычисленные значения узлов сетки сплайна; |
cx - | вещественный вектоp длины nx + 4, содержащий nx + 2 значений коэффициентов сплайна. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма использует рабочие подпрограммы - функции и подпрограммы iac1r1_c, iac1r2_c, iac1r3_c, iac1r4_c и ias1r2_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 *); static float cx[8], tx[8]; iac1r_c(x, &c__4, fx, &c__1, &c__1, &c_b4, &c__2, &c_b6, tx, cx); printf("\n tx = %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f \n", tx[0], tx[1], tx[2], tx[3], tx[4], tx[5], tx[6], tx[7]); printf("\n cx = %9.2f %9.2f %9.2f %9.2f %9.2f %9.2f \n", cx[0], cx[1], cx[2], cx[3], cx[4], cx[5]); return ; } /* main */ Результаты: tx = ( 0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 ) cx = ( -0.00 6.00 24.00 60.00 120.00 210.00 )