|
Текст подпрограммы и версий ids5r_c.zip |
Тексты тестовых примеров tids5r_c.zip |
Вычисление значений вторых производных вещественной табличной периодической функции от одного переменного в узлах неравномерной сетки, методом интерполирующих кубических сплайнов.
Пусть в узлах сетки xk : x1 < x2 < ...< xN заданы значения yk = y (xk). Интерполирующая функция y (x) является периодической на отрезке [x1, xN] и на каждом из отрезков [xk, xk + 1] представляется кубическим полиномом Эрмита [1], построенным по значениям yi, y''i и yi + 1 , y''i + 1 , где y''i = y'' (xi) определяются из условия непрерывности первой производной функции y (x) в узловых точках [2]. Это обеспечивает гладкость второго порядка y (x) на всем отрезке [x1, xN].
| 1. |
И.С.Березин, Н.П.Жидков, Методы вычислений, т. 1, Физматгиз, 1962. |
| 2. | Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения. M., "Мир", 1972. |
int ids5r_c (integer *n, real *x, real *y, real *y2, real *f,
real *g, real *h)
Параметры
| n - | число узлов сетки, n ≥ 3 (тип: целый); |
| x - | одномерный массив размерности n значений узлов сетки (тип: вещественный); |
| y - | одномерный массив размерности n значений табличной функции (тип: вещественный); |
| y2 - | одномерный массив размерности n вычисляемых значений вторых производных в узлах сетки (тип: вещественный); |
| f, g, h - | одномерные рабочие массивы размерности n (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
На сетке xk = (k-1)*2π/5 брались значения yk = cos (xk) , k = 1, ..., 6 .
int main(void)
{
/* Builtin functions */
double cos(double);
/* Local variables */
extern int ids5r_c(int *, float *, float *, float *, float *, float *,
float *);
static float f[6], g[6], h__[6];
static int k, n, i;
static float x[6], y[6], y2[6], pi;
pi = 1.2566370612f;
n = 6;
for (k = 1; k <= 6; ++k) {
x[k - 1] = (k - 1) * pi;
y[k - 1] = (float)cos(x[k - 1]);
/* l1: */
}
ids5r_c(&n, x, y, y2, f, g, h__);
for (i = 1; i <= 6; ++i) {
printf("\n %16.7e \n",y2[i-1]);
}
return 0;
} /* main */
Результат: ( -1.2, -0.34, 0.93, 0.85, -0.10, -1.20 )