Текст подпрограммы и версий ids6r_p.zip |
Тексты тестовых примеров tids6r_p.zip |
Вычисление вторых производных табличной циклической функции в узлах неравномерной сетки методом интерполирующих кубических сплайнов.
Пусть в узлах сетки x1, x2, ...,xN заданы значения циклической функции yK = y(xK), причем x1 = xN, y1 = yN. Предположим, что xi = x (ti), yi = y (ti), i = 1, 2, ..., N, где величины ti определяются соотношениями:
ti = ti-1 + di , для i = 2, 3, ..., N и t1 = 0 .
Шаги di по параметру ti могут определяться одной из следующих формул:
а) di = ( (Δxi)2 + (Δyi)2 )1/2 б) di = ( Δxi )2 + ( Δyi )2 в) di = | Δxi | + | Δyi | , i = 2, ..., N-1 ,
где Δ xi = xi + 1 - xi , Δ yi = yi + 1 - yi.
Значения вторых производных xi, yi определяются по парам значений (ti, xi), (ti, yi), i = 1, 2, ..., N методом интерполирующих кубических сплайнов.
Дж.Алберг, Э.Нильсон, Дж.Уолш, Теория сплайнов и ее приложения, M., "Мир", 1972.
procedure IDS6R(N :Integer; NPAR :Integer; var T :Array of Real; var X :Array of Real; var X2 :Array of Real; var Y :Array of Real; var Y2 :Array of Real; var F :Array of Real; var G :Array of Real; var H :Array of Real);
Параметры
N - | заданное число узлов сетки, N ≥ 3 (тип: целый); |
NPAR - | характеризует способ параметризации заданной функции (тип: целый); при этом: |
NPAR=1 - | если величины di определяются по формуле а); |
NPAR=2 - | если величины di определяются по формуле б); |
NPAR=3 - | если величины di определяются по формуле в); |
T - | вещественный одномерный массив значений ti размерности N; |
X - | вещественный одномерный массив значений xi размерности N, причем X (1) = X (N); |
X2 - | вещественный одномерный массив размерности N вычисляемых значений вторых производных x (t) в узлах сетки ti; |
Y - | вещественный одномерный массив значений yi размерности N, причем Y (1) = Y (N); |
Y2 - | вещественный одномерный массив размерности N вычисляемых значений вторых производных y (t) в узлах сетки ti; |
F, G, H - | вещественные одномерные рабочие массивы размерности N. |
Версии: нет
Вызываемые подпрограммы
IDS5R - | вычисление значений вторых производных табличной периодической функции от одного переменного в узлах неравномерной сетки, методом интерполяционных кубических сплайнов. |
Замечания по использованию: нет
На единичной окружности были взяты 17 точек. Вычислялись значения x''i и y''i, i = 1, 2, ..., 17.
Unit tids6r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, IDS6R_p; function tids6r: String; implementation function tids6r: String; var N,NPAR,_i :Integer; T :Array [0..16] of Real; X2 :Array [0..16] of Real; Y2 :Array [0..16] of Real; F :Array [0..16] of Real; G :Array [0..16] of Real; H :Array [0..16] of Real; const X :Array [0..16] of Real = ( -1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75,1.0, 0.75,0.5,0.25,0.0,-0.25,-0.5,-0.75,-1.0 ); Y :Array [0..16] of Real = ( 0.0,-0.6614,-0.8660,-0.9682,-1.0,-0.9682, -0.8660,-0.6614,0.0,0.6614,0.8660,0.9682,1.0, 0.9682,0.8660,0.6614,0.0 ); begin Result := ''; { результат функции } N := 17; NPAR := 1; IDS6R(N,NPAR,T,X,X2,Y,Y2,F,G,H); Result := Result + #$0D#$0A; for _i:=0 to 16 do begin Result := Result + Format('%20.16f ',[X2[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 16 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('tids6r',Result); { вывод результатов в файл tids6r.res } exit; end; end. Результаты: X2 = ( 1.10, 0.77, 0.5, 0.25, -0.0002, -0.25, -0.5, -0.76, -0.11, -0.76, -0.5, -0.25, -0.0019, 0.26, 0.48, 0.85, 1.1 ) Y2 = ( 0.041, 0.73, 0.87, 0.98, 1., 0.98, 0.086, 0.074, 0.00001, -0.74, -0.86, -0.99, -1., -1., -0.82, -0.89, 0.041 )