Текст подпрограммы и версий
iib8r_c.zip , iib8d_c.zip
Тексты тестовых примеров
tiib8r_c.zip , tiib8d_c.zip

Подпрограмма:  iib8r_c

Назначение

Вычисление значения в заданной точке интерполируемой функции двух переменных, определенной на прямоугольной неравномерной сетке, по известным значениям на этой сетке ее второй частной производной по второй переменной методом бикубических сплайнов

Математическое описание

Пусть заданы узлы неравном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