|
Текст подпрограммы и версий ids2r_p.zip |
Тексты тестовых примеров tids2r_p.zip |
Вычисляются значения вторых производных вещественной табличной функции от одной переменной в узлах неравномерной сетки методом интерполирующих кубических сплайнов при известных значениях первых производных в концевых точках.
Пусть в узлах сетки xk : x1 <x2 < ... < xN известны значения yk = y (xk), а в концевых точках также значения первых производных y'i = y' (xi), y'N = y' (xN). Интерполирующая функция y (x) на каждом из отрезков [xk, xk + 1] представляется кубическим полиномом Эрмита [1], построенным по значениям yk, y''k и yk + 1, y''k + 1, где y''k = y'' (xk) определяются из условия непрерывности первой производной функции y (x) в узлах сетки [2]. Это обеспечивает гладкость второго порядка y (x) на всем отрезке [x1, xN].
| 1. |
И.С.Березин, Н.П.Жидков, Методы вычислений, т. 1, Физматгиз, 1962. |
| 2. | Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., "Мир", 1972. |
procedure IDS2R(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) = y'1, Y2 (N) = y'N (тип: вещественный); |
| F, G - | одномерные рабочие массивы размерности N (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
На сетке
xk = (k-1)*π/5
брались значения yk = cos (xk),
k = 1, ..., 6,
y'1 = -y1 ,
y'6 = -y6 .
Unit tids2r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IDS2R_p;
function tids2r: String;
implementation
function tids2r: 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 6 do
begin
X[K-1] := (K-1)*PI;
Y[K-1] := Cos(X[K-1]);
_1:
end;
Y2[0] := 0.0;
Y2[N-1] := -Sin(X[N-1]);
IDS2R(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 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('tids2r',Result); { вывод результатов в файл tids2r.res }
exit;
end;
end.
Результат: Y2 = ( -1.03, -0.84, -0.32, 0.32, 0.84, 1.03 )