Текст подпрограммы и версий
ids0r_p.zip
Тексты тестовых примеров
tids0r_p.zip

Подпрограмма:  IDS0R (модуль IDS0R_p)

Назначение

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

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

Пусть в узлах сетки  xk :  x1 <x2 <  ... < xN заданы значения  yk = y (xk),  а в концевых точках также значения вторых производных  y''(x1) = y''1,  y''(xN) = y''N. Интерполирующая функция  y (x) на каждом из отрезков  [xk, xk + 1] представляется кубическим полиномом Эрмита [1], построенным по значениям  yi,  y''i и  yi + 1,  y''i + 1,  где  y''i = y'' (xi) определяются из условия непрерывности первой производной функции  y (x) в узлах сетки [2]. Это обеспечивает гладкость второго порядка  y (x) на всем отрезке  [x1, xN].

1. 

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

2.  Дж.Алберг, Э.Нильсон, Дж.Уолш. Теория сплайнов и ее приложения, M., "Мир", 1972.

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

procedure IDS0R(N :Integer; var X :Array of Real;
                var Y :Array of Real; var Y2 :Array of Real;
                var F :Array of Real; var G :Array of Real);

Параметры

N - число узлов сетки, N ≥ 3 (тип: целый);
X - одномерный массив значений узлов сетки размерности N (тип: вещественный);
Y - одномерный массив значений табличной функции размерности N (тип: вещественный);
Y2 - одномерный массив вычисляемых значений вторых производных в узлах сетки размерности N (тип: вещественный); на входе  Y2 (1) = y1,  Y2 (N) = yN
F, G - одномерные рабочие массивы размерности N (тип: вещественный).

Версии: нет

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

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

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

На сетке  x = (k-1)*π/5  брались значения  y = cos (xk) ,  k = 1, ..., 6 ,
y''1 = -y1 ,  y''6 = -y6.

Unit tids0r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IDS0R_p;

function tids0r: String;

implementation

function tids0r: String;
var
N,K,_i :Integer;
PI :Real;
X :Array [0..5] of Real;
Y :Array [0..5] of Real;
Y2 :Array [0..5] of Real;
F :Array [0..5] of Real;
G :Array [0..5] of Real;
label
_1;
begin
Result := '';  { результат функции }
PI := 3.141592653/5.0;
N := 6;
for K:=1 to N do
 begin
  X[K-1] := (K-1)*PI;
  Y[K-1] := Cos(X[K-1]);
_1:
 end;
Y2[0] := -Y[0];
Y2[N-1] := -Y[N-1];
IDS0R(N,X,Y,Y2,F,G);
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[Y2[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tids0r',Result);  { вывод результатов в файл tids0r.res }
exit;
end;

end.


Результат:    Y2  =  ( -1.00,  -0.85,  -0.32,  0.32,  0.85,  1.00 )