Текст подпрограммы и версий id23r_p.zip |
Тексты тестовых примеров tid23r_p.zip |
Вычисление значений производных до некоторого порядка функции, линейно представленной через B - сплайн K - го порядка, в заданной точке.
Пусть функция n f(x) = ∑ ai Ni k(x) , i=1
где ai - заданные коэффициенты, а Ni k (x) - нормированные B - сплайны K - го порядка, построенные по сети узлов
t1 ≤ t2 ≤ ... ≤ tk < tk+1 <...< tn < tn+1 ≤ tn+2 ≤ ... ≤ tn+k .
B заданной точке x ∈ [t1, tn + 1] для некоторого целого числа ND: 0 ≤ ND ≤ K , вычисляются производные функции f : sj = D j - 1 f (x), j = 1, 2,..., ND.
C.de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14(3), 1977, pp. 441-472.
procedure ID23R(var T :Array of Real; var A :Array of Real; N :Integer; K :Integer; X :Real; var S :Array of Real; ND :Integer; var R :Array of Real; var R1 :Array of Real);
Параметры
T - | вещественный вектоp длины N + K, узлов сплайна T (1) ≤ T (2) ≤ ...≤ T (K) < T (K + 1) < ...< T (N) < T (N + 1) ≤ ...≤ T (N + K); |
A - | вещественный двумерный массив размера N*ND, aI = A (I, 1), I = 1, 2,..., N, используемый также как рабочий (тип: вещественный); |
N - | заданное число В - сплайнов, N ≥ 2*K (тип: целый); |
K - | порядок В - сплайна (тип: целый); |
X - | заданное значение точки, в которой вычисляются производные функции, T (1) ≤ X ≤ T (N + 1) (тип: вещественный); |
S - | вещественный вектоp длины ND, sJ = S (J), J = 1, 2,..., ND; |
ND - | заданное целое число, 0 ≤ ND ≤ K; |
R - | рабочий вектоp длины K (тип: вещественный); |
R1 - | вещественный двумерный рабочий массив размера 2K. |
Версии: нет
Вызываемые подпрограммы
I I21R1 - | служебная подпрограмма. |
I I21R2 - | служебная подпрограмма. |
Замечания по использованию: нет
Unit TID23R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, ID23R_p; function TID23R: String; implementation function TID23R: String; var N,K,ND,_i :Integer; X :Real; S :Array [0..2] of Real; R :Array [0..2] of Real; R1 :Array [0..5] of Real; const T :Array [0..8] of Real = ( 0.0,0.0,0.0,2.0,4.0,6.0,8.0,8.0,8.0 ); A :Array [0..17] of Real = ( 0.0,-2.0,18.0,110.0,322.0,512.0,0.0,0.0,0.0,0.0, 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 ); begin Result := ''; { результат функции } N := 6; K := 3; ND := 3; X := 5.0; Result := Result + Format('%s', [' ТЕСТОВЫЙ ПРИМЕР ДЛЯ ID23R']) + #$0D#$0A; ID23R(T,A,N,K,X,S,ND,R,R1); Result := Result + Format('%s',[' PEЗYЛЬTATЫ:' + #$0D#$0A + ' S=']); Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[S[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TID23R',Result); { вывод результатов в файл TID23R.res } exit; end; end. Результаты: S = 125., 76., 30.