|
Текст подпрограммы и версий iib9r_c.zip , iib9d_c.zip |
Тексты тестовых примеров tiib9r_c.zip , tiib9d_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 ,
а также следующие значения первой частной производной функции f по первой переменной:
YP1 = ∂ f (X1A(1), X2)) / ∂x(1) , YPM = ∂ f (X1A(M), X2) / ∂x(1) .
Здесь X2 - вторая координата заданной точки (X1, X2) внутри сеточного прямоугольника, в которой ищется значение интерполируемой функции: Y = f (X1, X2). Используется метод бикубических сплайнов.
Н.С.Бахвалов, Численные методы. Изд - во "Наука", 1973.
int iib9r_c (real *x1a, real *x2a, real *ya, real *y2a,
integer *m, integer *n, real *x1, real *x2, real *yp1, real *ypm,
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 (тип: вещественный); |
|
yp1 - ypm | заданные значения первой частной производной функции f по первой переменной в точках (x1a (1), x2) и (x1a (m), x2) соответственно (тип: вещественный); |
| y - | вещественная переменная, содержащая вычисленное значение интерполируемой функции f в точке (x1, x2); |
| yt - | вещественный вектор длины n, используемый в подпрограмме в качестве рабочего; |
| y2t - | вещественный вектор длины max (m, n), используемый в подпрограмме в качестве рабочего; |
| yyt, u - | вещественные векторы длины m, используемые в подпрограмме в качестве рабочих. |
Версии
| i ib9d_c - | выполняет те же вычисления, что и подпрограмма i ib9r_c, однако в режиме удвоенной точности. При этом все формальные параметры, кроме m и n, должны иметь тип double. |
Вызываемые подпрограммы
|
ids8r_c - ids8d_c | вычисление вторых производных таблично - заданной функции в узлах неравномерной сетки методом кубических или натуральных кубических сплайнов при заданных первых производных функции в концевых узлах сетки в режиме одинарной и удвоенной точности соответственно; используются в подпрограммах i ib9r_c и i ib9d_c соответственно; |
|
i is8r_c - i is8d_c | вычисление значения в заданной точке интерполируемой табличной функции, определенной в узлах неравномерной сетки, упорядоченной по возрастанию, по известным значениям ее второй производной в узлах этой сетки методом кубических сплайнов в режиме одинарной и удвоенной точности соответственно; используются в подпрограммах i ib9r_c и i ib9d_c соответственно. |
Замечания по использованию: нет
int main(void)
{
/* Builtin functions */
double sin(double), cos(double);
/* Local variables */
extern int iib9r_c(float *, float *, float *, float *, int *, int *,
float *, float *, 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] */,
yp1, y1t, y2t[5], ypm, 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;
yp1 = (float)cos(x1a[0]) * (float)sin(x2);
ypm = (float)cos(x1a[m - 1]) * (float)sin(x2);
iib9r_c(x1a, x2a, ya, y2a, &m, &n, &x1, &x2, &yp1, &ypm, &y, yt, y2t,
yyt, u);
y1t = (float)sin(x1) * (float)sin(x2);
printf("\n %24.14e %24.14e \n",y, y1t);
return 0;
} /* main */
Результат: y = 0.316370