Текст подпрограммы и версий ii21r_p.zip |
Тексты тестовых примеров tii21r_p.zip |
Построение интерполирующего сплайна K - го порядка с произвольными узлами интерполяции.
Пусть задана сетка узлов (узлы сплайна):
t1 ≤ t2 ≤ ... ≤ tk < tk + 1 < ... < tn < tn + 1 ≤ tn + 2 ≤ ... ≤ tn + k ,
определяющая для i = 1, 2, ..., n нормированные В - сплайны Ni k (x) порядка k, соответствующие узлам
ti , ti + 1 , ... , ti + k .
Строится сплайн - функция
n f (x) = ∑ a i Ni k (x) , t1 ≤ x ≤ tn + 1 , i = 1
коэффициенты ai, i = 1, 2, ..., n, которой определяются условиями интерполяции
n ∑ a i Ni k ( z j ) = bj , j = 1, 2, ... , n , i = 1
где Z1 < Z2 < ... < Zn узлы интерполяции, такие что [Z1, Zn] ⊆ [ t1, tn + 1 ] , а bj - заданные значения.
C.de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14 (3), 1977, pp. 441 - 472.
procedure II21R(N :Integer; K :Integer; var T :Array of Real; var Z :Array of Real; var A :Array of Real; var B :Array of Real; var R :Array of Real; var R1 :Array of Real; var R2 :Array of Real; var IERR :Integer);
Параметры
N - | заданное число узлов интерполяции (тип: целый); |
K - | заданный порядок В - сплайна (тип: целый); |
T - |
вещественный вектоp длины N + K значений
узлов сплайна: T (1) ≤ T (2) ≤ ... ≤ T (K) < T (K + 1) < T (K + 2) < T (N) < T (N + 1) ≤ T (N + 2) ≤ ... ≤ T (N + K); |
Z - | вещественный вектоp длины N значений узлов интерполяции: T (1) ≤ Z (1) < Z (2) < ... < Z (N) ≤ T (N + K); |
A - | вещественный вектоp длины N: aI = A (I), I = 1, 2, ..., N; |
B - | вещественный вектоp длины N: bI = B (I), I = 1, 2, ..., N; |
R - | вещественный двумерный рабочий массив размера N * (2*K - 1); |
R1 - | вещественный рабочий вектоp длины K; |
R2 - | вещественный двумерный рабочий массив размера N*K; |
IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
IERR=65 - | когда какой - то узел Z (I) не принадлежит [T (1), T (N + 1)]; |
IERR=66 - | когда матрица для определения коэффициентов вырождена. |
Версии: нет
Вызываемые подпрограммы
UTI I10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы I I21R ; |
ASB1R - | подпрограмма решения системы с ленточной матрицей, заданной в компактной форме, с выбором ведущего элемента по столбцу; |
I I21R1 - | служебная подпрограмма; |
I I21R2 - | служебная подпрограмма. |
Замечания по использованию: нет
Unit TII21R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, II21R_p; function TII21R: String; implementation function TII21R: String; var N,K,I,_i,IERR :Integer; ZX :Real; A :Array [0..5] of Real; B :Array [0..5] of Real; R :Array [0..29] of Real; R1 :Array [0..2] of Real; R2 :Array [0..17] 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 ); Z :Array [0..5] of Real = ( 1.0,3.0,4.0,5.0,6.0,7.0 ); label _5; begin Result := ''; { результат функции } N := 6; K := 3; for I:=1 to N do begin ZX := Z[I-1]; B[I-1] := ZX*ZX*ZX; _5: end; Result := Result + Format('%s', [' ТЕСТОВЫЙ ПРИМЕР ДЛЯ II21R']) + #$0D#$0A; II21R(N,K,T,Z,A,B,R,R1,R2,IERR); Result := Result + Format('%s',[' PEЗYЛЬTATЫ:' + #$0D#$0A + ' IERR=']); Result := Result + Format('%3d ',[IERR]); Result := Result + Format('%s',[#$0D#$0A + ' КОЭФФИЦИЕНТЫ A= ']); Result := Result + #$0D#$0A; for _i:=0 to 5 do begin Result := Result + Format('%20.16f ',[A[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TII21R',Result); { вывод результатов в файл TII21R.res } exit; end; end. Результаты: IERR = 0 , A = 0., -2., 18., 110., 322., 512.