Текст подпрограммы и версий iib8r_c.zip , iib8d_c.zip |
Тексты тестовых примеров tiib8r_c.zip , tiib8d_c.zip |
Вычисление значения в заданной точке интерполируемой функции двух переменных, определенной на прямоугольной неравномерной сетке, по известным значениям на этой сетке ее второй частной производной по второй переменной методом бикубических сплайнов
Пусть заданы узлы неравномepнoй прямоугольной сетки:
X1A = { x1(1), x2(1), ...,xM(1) } ; X2A = { x1(2), x2(2), ..., xN(2) } , а также значения интерполируемой функции f (x(1), x(2)) и ее второй частной производной ∂2 f (x(1), x(2)) / ∂x(2) 2 в узлах этой сетки: YA(I, J) = f (X1A(I), X2A(J)) ; Y2A(I, J) = ∂2 f (X1A(I), X2A(J)) / ∂x(2) 2 , I = 1, 2, ..., M ; J = 1, 2, ..., N .
Подпрограмма i ib8r_c вычисляет значение Y функции f (x(1), x(2)) в заданной точке с координатами (X1, X2), лежащей внутри сеточного прямоугольника, методом бикубических сплайнов.
Н.С.Бахвалов, Численные методы. Изд - во "Наука", 1973.
int iib8r_c (real *x1a, real *x2a, real *ya, real *y2a, integer *m, integer *n, real *x1, real *x2, real *y, real *yt, real *y2t, real *yyt, real *u)
Параметры
x1a - x2a | вещественные векторы длины m и n, содержащие узлы {x1 (1), x2 (1), ...,xm (1)} и {x1 (2), x2 (2), ..., xn (2)} соответственно; |
ya - | вещественный двумерный массив размеров m на n, содержащий значения интерполируемой функции f (x (1), x (2)) двух переменных в узлах заданной сетки; |
y2a - | вещественный двумерный массив размеров m на n, содержащий значения второй частной производной функции f по второй переменной в узлах заданной сетки; |
m, n - | длины векторов X1A и X2A соответственно (тип: целый); |
x1, x2 - | координаты заданной точки внутри сеточного прямоугольника, в которой ищется значение интерполируемой функции f (тип: вещественный); |
y - | вещественная переменная, содержащая вычисленное значение интерполируемой функции f в точке (x1, x2); |
yt - | вещественный вектор длины n, используемый в подпрограмме в качестве рабочего; |
y2t - | вещественный вектор длины max (m, n), используемый в подпрограмме в качестве рабочего; |
yyt, u - | вещественные векторы длины m, используемые в подпрограмме в качестве рабочих. |
Версии
i ib8d_c - | вычисление значения в заданной точке интерполируемой функции двух переменных, определенной на прямоугольной неравномерной сетке, по известным значениям на этой сетке ее второй частной производной по второй переменной методом бикубических сплайнов режиме удвоенной точности. |
Вызываемые подпрограммы
ids8r_c - ids8d_c | вычисление вторых производных таблично - заданной функции в узлах неравномерной сетки методом кубических или натуральных кубических сплайнов при заданных первых производных функции в концевых узлах сетки в режиме одинарной и удвоенной точности соответственно; используются в подпрограммах i ib8r_c и i ib8d_c соответственно; |
i is8r - i is8d | вычисление значения в заданной точке интерполируемой табличной функции, определенной в узлах неравномерной сетки, упорядоченной по возрастанию, по известным значениям ее второй производной в узлах этой сетки методом кубических сплайнов в режиме одинарной и удвоенной точности соответственно; используются в подпрограммах i ib8r_c и i ib8d_c соответственно. |
Замечания по использованию: нет
int main(void) { /* Builtin functions */ double sin(double); /* Local variables */ extern int iib8r_c(float *, float *, float *, float *, int *, int *, float *, float *, float *, float *, float *, float *, float *); static int i__, j, m, n; static float r__, u[5], y, x1, x2, ya[20] /* was [5][4] */, yt[4], x1a[5], x2a[4], y2a[20] /* was [5][4] */, yt1, y2t[5], yyt[5]; int i__1, i__2; #define ya_ref(a_1,a_2) ya[(a_2)*5 + a_1 - 6] #define y2a_ref(a_1,a_2) y2a[(a_2)*5 + a_1 - 6] m = 5; n = 4; r__ = 0.f; i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { x1a[i__ - 1] = r__; /* l1: */ r__ += .1f; } r__ = 0.f; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { x2a[i__ - 1] = r__; /* l2: */ r__ += .1f; } i__1 = m; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = n; for (j = 1; j <= i__2; ++j) { ya_ref(i__, j) = (float)sin(x1a[i__ - 1]) * (float)sin(x2a[j - 1]); /* l4: */ y2a_ref(i__, j) = -ya_ref(i__, j); } } x1 = .55f; x2 = .65f; iib8r_c(x1a, x2a, ya, y2a, &m, &n, &x1, &x2, &y, yt, y2t, yyt, u); yt1 = (float)sin(x1) * (float)sin(x2); printf("\n %16.7e %16.7e \n",y, yt1); return 0; } /* main */ Результат: y=0.321498