| 
      Текст подпрограммы и версий  id10r_p.zip , id10e_p.zip  | 
      Тексты тестовых примеров   tid10r_p.zip , tid10e_p.zip  | 
Вычисление первой или второй производной вещественной таблично - заданной функции на равномерной сетке с использованием центральных разностей.
ID10R вычисляет либо первые, либо вторые производные таблично - заданной функции на равномерной сетке с шагом h с использованием центральных разностей по формулам Стирлинга.
И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, M., 1962.
procedure ID10R(H :Real; var Y :Array of Real; MU :Integer;
                NL :Integer; NS :Integer; NU :Integer; NO :Integer;
                LO :Integer; NTH :Integer; T :Real;
                var A :Array of Real; var E :Array of Real;
                var LA :Integer; var IERR :Integer);
Параметры
| H - | заданный шаг равномерной сетки (тип: вещественный); | 
| Y - | вещественный двумерный массив, в котоpом задается таблица значений функции и центральных разностей (см. описание параметра LO); размерность массива Y должна быть при LO = 0 pавна MU на (NO + 1), при LO = 1 - MU на [(NO + 3)/2], при LO = 2 - MU на [(NO + 4)/2]; | 
| 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); расположение в массиве Y центральных разностей определяется ниже при описании параметра LO (тип: целый); | 
| NO - | заданный максимальный порядок разностей, которые используются в конечно - разностных аппроксимациях производных (тип: целый); | 
| LO - | определяет порядок расположения заданных центральных разностей в массиве Y (тип: целый); при этом если: | 
| LO = 0 - | то δ 2j - 1yi - 1/2 должна быть расположена в элементе массива Y (NL + I* NS - [NS/2], 2*J), а δ 2jyi - в элементе массива Y (NL + I*NS, 2*J + 1); | 
| LO = 1 - | то δ 2j - 1yi - 1/2 должна быть расположена в элементе массива Y (NL + I* NS - [NS/2], J + 1), а δ 2jyi - в элементе массива Y (NL + I*NS, J + 1); | 
| LO = 2 - | то δ 2j - 1yi - 1/2 должна быть расположена в элементе массива Y(NL + I* NS - [NS/2], J + 1), а δ 2jyi - в элементе массива Y (NL + I*NS, J + 2); | 
| NHT - | полагается равным 1, если надо вычислить первую производную, или 2, если - вторую; | 
| T - | заданная точность вычисления производных (тип: вещественный); | 
| A - | вещественный вектоp длины NU, в котоpом помещаются вычисленные значения первой или второй производной последовательно в следующем порядке A (NL), A (NL + NS), A (NL + 2*NS), ... ,A (NU); | 
| E - | вещественный вектоp длины NU, в котоpом помещаются последние члены ряда, использованные в конечно - разностной аппроксимации, в следующем порядке E (NL), E (NL + NS), E (NL + 2*NS),...,E (NU); | 
| LA - | целая переменная, значение которой полагается равным наивысшему порядку разностей, фактически использованных в вычислениях; | 
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: | 
| IERR= 1 - | когда для достижения заданной точности требуются разности более высокого порядка, чем они заданы при обращении к подпрограмме; производные вычисляются, хотя требуемая точность не достигнута; | 
| IERR= 2 - | когда разности порядка NO pасходятся; производные вычисляются, хотя требуемая точность не достигнута; | 
| IERR= 3 - | когда разности порядка LA (LA < NO) расходятся; производные вычисляются, хотя требуемая точность не достигнута; | 
| IERR=65 - | когда значение NTH ≠ 1 или ≠ 2; | 
| IERR=66 - | когда неправильно задан порядок разностей; порядок разностей должен быть по крайней меpе, не ниже порядка вычисляемой производной; | 
| IERR=67 - | когда не заданы разности нечетного порядка и требуется вычислить первую производную; | 
| IERR=68 - | когда не заданы разности четного порядка и требуется вычислить вторую производную. | 
Версии
| ID10E - | вычисление первой или второй производной вещественной таблично - заданной функции на pавномеpной сетке с использованием центральных разностей с расширенной (Extended) точностью. | 
Вызываемые подпрограммы
| UTID10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ID10R. | 
| UTID11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ID10E. | 
Замечания по использованию
| 1. | 
    Для ID10E параметры H, Y, T, A и E должны иметь тип Extended.  | |
| 2. | 
    Значение параметра MU должно быть больше или pавно значению параметра NU.  | |
| 3. | 
    Формула вычисления первой производной использует разности только нечетных порядков. Поэтому можно задать LO = 2 и NS = 1.  | |
| 4. | 
    Формула вычисления второй производной использует разности только четных порядков. Поэтому можно задать LO = 1 и NS = 1.  | |
| 5. | 
    Заданная точность считается достигнутой, если следующий член ряда конечно - разностной аппроксимации меньше или pавен T.  | |
| 6. | 
    Конечно - разностные аппроксимации не могут быть использованы в конце таблицы задания функции. Поэтому следует увеличить таблицу значений функции и ее разностей перед обращением к подпрограмме для вычисления производных вблизи конца таблицы.  | |
| 7. | Для вычисления соответствующего числа центральных разностей рекомендуется использовать подпрограмму I I10R. | 
Unit TID10R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, II10R_p, ID10R_p;
function TID10R: String;
implementation
function TID10R: String;
var
NTH,I,J,MU,NL,NS,NU,LO,NO,LA,IERR,_i :Integer;
H,XN,X,T :Real;
Y :Array [0..49] of Real;
A :Array [0..9] of Real;
E :Array [0..9] of Real;
label
_3,_1,_2;
begin
Result := '';  { результат функции }
for _i:=0 to 9 do //начальное обнуление массива
 begin
  A[_i] := 0.0;
  E[_i] := 0.0;
 end;
H := 0.25;
XN := 2.0;
X := XN-H;
NТН := 1;
T := 1.E-4;
for I:=1 to 10 do
 begin
  for J:=1 to 5 do
   begin
_3:
    Y[(I-1)+(J-1)*10] := 0.0;
   end;
 end;
for I:=1 to 10 do
 begin
  X := X+H;
  Y[(I-1)+0] := Exp(-X);
_1:
 end;
MU := 10;
NL := 1;
NS := 1;
NU := 10;
LO := 2;
NO := 6;
II10R(MU,NL,NS,NU,NO,LO,Y);
Result := Result + #$0D#$0A;
for J:=1 to 5 do
 begin
  for I:=1 to 1 do
   begin
    Result := Result + Format('%20.16f ',[Y[(I-1)+(J-1)*10]]) + #$0D#$0A;
   end;
 end;
Result := Result + #$0D#$0A;
ID10R(H,Y,MU,NL,NS,NU,NO,LO,NTH,T,A,E,LA,IERR);
for I:=1 to 10 do
 begin
  Result := Result + Format('%s',['       A']);
  Result := Result + Format('%s',['               E' + #$0D#$0A]);
  Result := Result + Format(' %20.16f %20.16f ',
 [A[I-1],E[I-1]]) + #$0D#$0A;
_2:
 end;
UtRes('TID10R',Result);  { вывод результатов в файл TID10R.res }
exit;
end;
end.
Результат:
         X                   A                            E
       2.         -6.207939493-02      0.000000000+00
       2.25     -1.081979987-01      2.160001819-05
       2.50     -8.205740855-02      1.682211116-05
       2.75     -6.392797405-02     -8.498944868-06
       3.00     -4.978715625-02     -6.618985062-06
       3.25     -3.877427628-02     -5.154870644-06
       3.50     -3.019743673-02     -4.014617251-06
       3.75     -2.343970501-02      7.495577201-05
       4.00     -1.832136756-02      7.671346584-05
       4.25     -8.102809959-03      0.000000000+00