Текст подпрограммы и версий ids4r_c.zip |
Тексты тестовых примеров tids4r_c.zip |
Вычисление значений вторых производных вещественной табличной параметрической функции в узлах неравномерной сетки методом интерполирующих кубических сплайнов.
Пусть заданы пары значений (xi, yi). Считается, что xi = x (ti), yi = y (ti) , i = 1, 2, ... N, а величины ti = ti - 1 + di, i = 2, 3, ... N, t1 = 0. Шаги по параметру di могут определятся из следующих формул:
а) 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 .
Далее по парам значений (ti, xi), (ti, yi) , i = 1, ..., N и известным значениям вторых производных в концевых точках x''1, x''N и y''1, y''N методом кубических сплайнов [1] вычисляются значения вторых производных x''i и y''i, i = 2, ...,N - 1.
Интерполирующие функции x = x (t) и y = y (t) на каждом из отрезков [ti, ti + 1] представляют из себя кубические полиномы, построенные по значениям (ti, xi), (ti, x''i), (ti + 1,xi + 1), (ti + 1,x''i + 1) и (ti, yi), (ti, y''i), (ti + 1, yi + 1), (ti + 1, y''i + 1) как интерполяционные полиномы Эрмита [2]. Tак построенные функции x (t) и y (t) являются дважды непрерывно дифференцируемыми на всем отрезке [t1, tN] по параметру t.
1. |
Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения. M., "Мир", 1972. |
2. | И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, Физматгиз, 1962. |
int ids4r_c(integer *n, integer *npar, real *t, real *x, real *x2, real *y, real *y2, real *f, real *g)
Параметры
n - | число узлов сетки, n ≥ 3 (тип: целый); |
npar - | одно из целых чисел 1, 2, 3, характеризующих способ параметризации; при npar = 1 величины di вычисляются по формуле а), при npar = 2 - по формуле б), при npar = 3 - по формуле в); |
t - | одномерный массив значений ti размерности n (тип: вещественный); |
x - | одномерный массив значений xi размерности n (тип: вещественный); |
x2 - | одномерный вещественный массив вычисляемых значений вторых производных функции x (t) в узлах сетки ti; на входе x2 (1) = x''1, x2 (n) = x''n; длина масива x2 pавна n; |
y - | одномерный массив значений yi размерности n (тип: вещественный); |
y2 - | одномерный вещественный массив вычисляемых значений вторых производных функции y (t) в узлах сетки ti; на входе y2 (1) = y''1, y2 (n) = y''n; длина массива y2 pавна n; |
f, g - | одномерные рабочие массивы размерности n (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы
ids0r_c - | вычисление значений вторых производных вещественной табличной функции от одного переменного в узлах неравномерной сетки методом интерполирующих кубических сплайнов при известных значениях вторых производных в концевых точках. |
Замечания по использованию: нет
На верхней части единичной полуокружности были взяты десять равноотстоящих точек. Вычислялись значения вторых производных x''i и y''i , i = 2, ..., 9 .
int main(void) { /* Local variables */ extern int ids4r_c(int *, int *, float *, float *, float *, float *, float *, float *, float *); static float f[10], g[10]; static int i__, i; static float t[10], x[10], y[10], x2[10], y2[10]; for (i__ = 1; i__ <= 10; ++i__) { x[i__ - 1] = (float) (i__ - 1) * .22222222222222221f - 1.f; /* L5: */ y[i__ - 1] = 1.f - x[i__ - 1] * x[i__ - 1]; } x2[0] = 1.f; x2[9] = -1.f; y2[0] = 0.f; y2[9] = 0.f; ids4r_c(&c__10, &c__1, t, x, x2, y, y2, f, g); for (i = 0; i <= 8; i+= 2) { printf("\n %16.7e %16.7e \n",x2[i], x2[i+1]); } for (i = 0; i <= 8; i+= 2) { printf("\n %16.7e %16.7e \n",y2[i], y2[i+1]); } return 0; } /* main */ Результат: x2 = ( 1.00, 0.83, 0.55, 0.34, 0.11, -0.11, -0.34, -0.55, -0.83, -1.00 ) y2 = ( 0.00, -0.70, -0.83, -0.96, -1.00, -1.00, -0.96, -0.83, -0.70, 0.00 )