Текст подпрограммы и версий
ii10r_c.zip , ii10d_c.zip
Тексты тестовых примеров
tii10r_c.zip , tii10d_c.zip

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

Назначение

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

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

Пусть мы имеем таблицу значeний вeщественной функции  y в узлах некоторой равномерной сетки:

        y0 , y1 , y2 , y3 , y4 , ... , yn . 

Тогда центральные разности первого порядка определяются следующими соотношениями:

     δ1 y1/2 = y1 - y0 ,     δ1 y3/2 = y2 - y1 ,     δ1 y5/2 = y3 - y2 , ... 

Центральные разности второго порядка выражаются через центральные разности первого порядка следующим образом:

    δ 2 y1 = δ1 y3/2 - δ1 y1/2 ,    δ 2 y2 = δ1 y5/2 - δ1 y3/2 , ... 

Формулы общего вида для вычисления центральных разностей имеют вид:

   δ 2j + 1 yi + 1/2 = δ 2j yi + 1 - δ 2j yi     и
   δ 2j yi = δ 2j - 1 yi + 1/2 - δ 2j - 1 yi - 1/2 . 

И.С.Березин, Н.П.Жидков, Методы вычислений, т. 1, M., 1962.

Использование

    int ii10r_c (integer *mu, integer *nl, integer *ns,
            integer *nu, integer *no, integer *lo, real *y)

Параметры

mu - заданное число стpок, в описании размерности двумерного массива  y в подпрограмме, вызывающей данную подпрограмму (см. ниже) (тип: целый);
         nl, ns -
         nu  
определяют расположение в двумерном массиве  y заданных значений функции, а именно, значения функции  y0, y1, y2, ..., yn должны быть последовательно расположены в следующих компонентах массива  y: y (nl, 1), y (nl + ns, 1), y (nl + 2 * ns, 1), ..., y (nu, 1) (тип: целый);
no - заданный максимальный порядок вычисляемых разностей (тип: целый);
lo - определяет порядок расположения вычисленных разностей в массиве y (тип: целый); при этом если:
lo=0 - то  δ 2j - 1 yi - 1/2 будет расположена в элементе массива  y (nl + i*ns - [ns/2], 2*j), а  δ 2j yi - в элементе массива  y (nl + i*ns, 2*j + 1);
lo=1 - то  δ 2j - 1 yi - 1/2 будет расположена в элементе массива  y (nl + i*ns - [ns/2], j + 1), а  δ 2j yi - в элементе массива  y (nl + i*ns, j + 1);
lo=2 - то  δ 2j - 1 yi - 1/2 будет расположена в элементе массива  y (nl + i*ns - [ns/2], j + 1), а  δ 2j yi - в элементе массива  y (nl + i*ns, j + 2);
y - вещественный двумерный массив, в котоpом задается таблица значений функции и помещаются вычисленные разности; длина массива  y должна быть при  lo = 0 pавна  mu * (no + 1), при  lo = 1 - mu * [(no + 3)/2], при  lo = 2 - mu * [(no + 4)/2].

Версии

i i10d_с - вычисление центральных разностей таблично заданной функции на равномерной сетке с повышенной точностью.

Вызываемые подпрограммы: нет

Замечания по использованию

  1. 

Для i i10d_с параметр y должен иметь тип double.

  2. 

Значение параметра  mu должно быть больше или pавно значению праметра  nu. Tем самым, двумерный массив  y может быть частью другого двумерного массива большей размерности.

  3. 

Порядок расположения вычисленных разностей в массиве  y при  lo = 0 приводит к довольно большому расходованию памяти, если нужны только либо четные, либо нечетные разности. Поэтому, если нужны только четные разности, следует положить  lo = 1 и  ns = 1. Для получения же только нечетных разностей надо взять  lo = 2 и  ns = 1.

  4.  Значение  ns всегда дожно быть больше или pавно 1.

Пример использования

int main(void)
{
    /* Initialized data */
    static float y[9] /* was [3][3] */ = { .1353352832f,.1053992246f,
                                           .8208499862f };

    /* Local variables */
    extern int ii10r_c(int *, int *, int *, int *, int *, int *, float *);
    static int j, nl, lo, no, ns, mu, nu;

#define y_ref(a_1,a_2) y[(a_2)*3 + a_1 - 4]

    mu = 3;
    nl = 1;
    ns = 1;
    nu = 3;
    no = 2;
    lo = 0;
    ii10r_c(&mu, &nl, &ns, &nu, &no, &lo, y);

    for (j = 1; j <= 3; ++j) {
        printf("\n  %16.7e %16.7e %16.7e \n",
            y_ref(j-1, 0), y_ref(j-1, 1), y_ref(j-1, 2));
        }
    return 0;
} /* main */


Результаты:

   а) значения функции:
      y(1, 1)  =   1.353352832e-01 ,     y(2, 1)  =   1.053992246e-01 ,
      y(3, 1)  =   8.208499862e-01 ;

   б) первые разности:
      y(1, 2)  =   0. ,     y(2, 2)  =  -2.993605860e-02 ,
      y(3, 2)  =   7.154507616e-01 ;

   в) вторые разности:
      y(1, 3)  =  0. ,      y(2, 3)  =   7.453868202e-01 ,     y(3, 3)  =  0.