Текст подпрограммы и версий ids7r_c.zip |
Тексты тестовых примеров tids7r_c.zip |
Вычисление вторых и третьих производных табличной функции в узлах неравномерной сетки методом интерполяционных сплайнов 5 - й степени по известным значениям первых производных в узлах сетки и значениям вторых производных в концевых точках.
Пусть в узлах неравномерной сетки xK : x1<x2< ...<xN заданы значения функции y(x) : yK = y(xK) и ее первой производной: y'K = y'(xK), и известны значения ее второй производной в концевых точках : y''1 = y''(x1), y''N = y''(xN). Интерполяционный сплайн S(x) 5 - й степени на каждом из отрезков [xK, xK+1] является многочленом 5 - й степени
AK(x-xK)5 + BK(x-xK)4 + CK(x-xK)3 + DK(x-xK)2 + EK(x-xK) + FK , где AK = 1/(ΔxK)4 [ 6 (ΔyK/ΔxK) - 3 (y'K + y'K+1) + ΔxK/2 (y''K+1 - y''K) ] , BK = 1/(ΔxK)3 [ -15(ΔyK/ΔxK) + 8y'K + 7y'K+1 + ΔxK/2 (3y''K - 2y''K+1) ] , CK = y'''K / 6 = = 1/(ΔxK)2 [ 10 ΔyK/ΔxK - 6y'K - 4 y'K+1 + ΔxK/2 (y''K+1 - 3y''K) ] , DK = y''K / 2 , EK = y'K , FK = yK , ΔxK = xK+1 - xK , ΔyK = yK+1 - yK ,
а вторые производные y''K определяются из условия непрерывности третьей производной S''' (x) сплайна S (x).
Подпрограмма ids7r_c вычисляет в узлах сетки значения второй и третьей производной сплайна S (x).
Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., Мир, 1972.
int ids7r_c (integer *n, real *x, real *y, real *y1, real *y2, real *y3)
Параметры
n - | заданное число узлов сетки, n ≥ 3 (тип: целый); |
x, y - y1 | вещественные одномерные массивы длины n, содержащие заданные значения xk, yk и y'k соответственно; |
y2 - | вещественный одномерный массив длины n, в который помещаются вычисленные значения второй производной y''k; на входе y2 (1) = y''1, y2 (n) = y''n; |
y3 - | вещественный одномерный массив длины n, в который помещаются вычисленные значения третьей производной y'''k. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
На сетке xk = (k-1)*π/4 брались значения y = sin (xk) , k = 1, 2, ..., 5, y'k = cos (xk), y''1 = -sin (x1), y''5 = -sin (x5).
int main(void) { /* Initialized data */ static float x[5] = { 0.f,.7854f,1.5708f,2.3562f,3.1416f }; static float y[5] = { 0.f,.7071f,1.f,.7071f,0.f }; static float y1[5] = { 1.f,.7071f,0.f,-.7071f,-1.f }; /* Local variables */ extern int ids7r_c(int *, float *, float *, float *, float *, float *); static int n, i; static float y2[5], y3[5]; y2[0] = 0.f; y2[4] = 0.f; n = 5; ids7r_c(&n, x, y, y1, y2, y3); /* l2: */ for (i = 0; i <= 2; i += 2) { printf("\n %16.7e %16.7e ",y[i], y[i+1]); } printf("\n %16.7e \n",y[4]); for (i = 0; i <= 2; i += 2) { printf("\n %16.7e %16.7e ",y1[i], y1[i+1]); } printf("\n %16.7e \n",y1[4]); for (i = 0; i <= 2; i += 2) { printf("\n %16.7e %16.7e ",y2[i], y2[i+1]); } printf("\n %16.7e \n",y2[4]); for (i = 0; i <= 2; i += 2) { printf("\n %16.7e %16.7e ",y3[i], y3[i+1]); } printf("\n %16.7e \n",y3[4]); return 0; } /* main */ Результаты: y2 = ( 0., -7074, -1.0004, -0.7074, 0. ) y3 = ( -1.002, -0.7089, -0.00002, 0.7090, 1.003 )