|
Текст подпрограммы и версий 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.