Текст подпрограммы и версий ids6r_c.zip |
Тексты тестовых примеров tids6r_c.zip |
Вычисление вторых производных табличной циклической функции в узлах неравномерной сетки методом интерполирующих кубических сплайнов.
Пусть в узлах сетки x1, x2, ...,xN заданы значения циклической функции yK = y(xK), причем x1 = xN, y1 = yN. Предположим, что xi = x (ti), yi = y (ti), i = 1, 2, ..., N, где величины ti определяются соотношениями:
ti = ti-1 + di , для i = 2, 3, ..., N и t1 = 0 .
Шаги di по параметру ti могут определяться одной из следующих формул:
а) di = ( (Δxi)2 + (Δyi)2 )1/2 б) di = ( Δxi )2 + ( Δyi )2 в) di = | Δxi | + | Δyi | , i = 2, ..., N-1 ,
где Δ xi = xi + 1 - xi , Δ yi = yi + 1 - yi.
Значения вторых производных xi, yi определяются по парам значений (ti, xi), (ti, yi), i = 1, 2, ..., N методом интерполирующих кубических сплайнов.
Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., "Мир", 1972.
int ids6r_c (integer *n, integer *npar, real *t, real *x, real *x2, real *y, real *y2, real *f, real *g, real *h)
Параметры
n - | заданное число узлов сетки, n ≥ 3 (тип: целый); |
npar - | характеризует способ параметризации заданной функции (тип: целый); при этом: |
npar=1 - | если величины di определяются по формуле а); |
npar=2 - | если величины di определяются по формуле б); |
npar=3 - | если величины di определяются по формуле в); |
t - | вещественный одномерный массив значений ti размерности n; |
x - | вещественный одномерный массив значений xi размерности n, причем x (1) = x (n); |
x2 - | вещественный одномерный массив размерности n вычисляемых значений вторых производных x (t) в узлах сетки ti; |
y - | вещественный одномерный массив значений yi размерности n, причем y (1) = y (n); |
y2 - | вещественный одномерный массив размерности n вычисляемых значений вторых производных y (t) в узлах сетки ti; |
f, g, h - | вещественные одномерные рабочие массивы размерности n. |
Версии: нет
Вызываемые подпрограммы
ids5r_c - | вычисление значений вторых производных табличной периодической функции от одного переменного в узлах неравномерной сетки, методом интерполяционных кубических сплайнов. |
Замечания по использованию: нет
На единичной окружности были взяты 17 точек. Вычислялись значения x''i и y''i, i = 1, 2, ..., 17.
int main(void) { /* Initialized data */ static float x[17] = { -1.f,-.75f,-.5f,-.25f,0.f,.25f,.5f,.75f,1.f,.75f, .5f,.25f,0.f,-.25f,-.5f,-.75f,-1.f }; static float y[17] = { 0.f,-.6614f,-.866f,-.9682f,-1.f,-.9682f,-.866f, -.6614f,0.f,.6614f,.866f,.9682f,1.f,.9682f,.866f,.6614f,0.f }; /* Local variables */ static int npar; extern int ids6r_c(int *, int *, float *, float *, float *, float *, float *, float *, float *, float *); static float f[17], g[17], h__[17]; static int n, i; static float t[17], x2[17], y2[17]; n = 17; npar = 1; ids6r_c(&n, &npar, t, x, x2, y, y2, f, g, h__); for (i = 0; i <= 12; i+= 3) { printf("\n %16.7e %16.7e %16.7e ",x2[i], x2[i+1],x2[i+2]); } printf("\n %16.7e %16.7e \n",x2[15], x2[16]); for (i = 0; i <= 12; i+= 3) { printf("\n %16.7e %16.7e %16.7e ",y2[i], y2[i+1], y2[i+2]); } printf("\n %16.7e %16.7e \n",y2[15], y2[16]); return 0; } /* main */ Результаты: x2 = ( 1.10, 0.77, 0.5, 0.25, -0.0002, -0.25, -0.5, -0.76, -0.11, -0.76, -0.5, -0.25, -0.0019, 0.26, 0.48, 0.85, 1.1 ) y2 = ( 0.041, 0.73, 0.87, 0.98, 1., 0.98, 0.086, 0.074, 0.00001, -0.74, -0.86, -0.99, -1., -1., -0.82, -0.89, 0.041 )