Текст подпрограммы и версий ii10r_c.zip , ii10d_c.zip |
Тексты тестовых примеров tii10r_c.zip , tii10d_c.zip |
Вычисление центральных разностей таблично заданной функции на равномерной сетке.
Пусть мы имеем таблицу знач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.