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