|
Текст подпрограммы и версий is03r_p.zip , is03e_p.zip |
Тексты тестовых примеров tis03r_p.zip , tis03e_p.zip |
Среднеквадратическое сглаживание дискретно заданной функции сплайном k - го порядка.
Пусть в узлах xi : x1 < x2 < ...< xl , заданы значения табличной функции gi . Строится сглаживающая сплайн - функция
n
f(x) = ∑ ai Ni k (x) , определяемая условиями :
i=1
l
∑ wi ( gi - f( xi ) )2 - min a ;
i=1
здесь wi > 0 - заданные весовые коэффициенты, Ni k, i = 1, ..., n - нормированные В - сплайны k - го порядка, соответствующие узлам ti, ti + 1, ..., ti + k таким, что : t1 ≤ t2 ≤ ...≤ tk < tk + 1 < ...< tn < tn + 1 ≤ ... ≤ tn + k. При этом требуется, чтобы tk ≤x1 < xl ≤ tn + 1, а l ≥ n.
C. de Boor, Package for Calculating with B - splines, SIAM J. Numerical Analysis, 14(3), 1977, pp. 441-472.
procedure IS03R(N :Integer; K :Integer; LX :Integer;
var T :Array of Real; var X :Array of Real;
var G :Array of Real; var W :Array of Real;
var A :Array of Real; var R :Array of Real;
var R1 :Array of Real; var R2 :Array of Real;
var IERR :Integer);
Параметры
| N - | заданное число нормированных В - сплайнов (тип: целый); |
| K - | заданный порядок В - сплайна (тип: целый); |
| LX - | заданное число узлов аппроксимации, LX ≥ N (тип: целый); |
| T - | вещественный вектоp длины N + K заданных значений узлов сплайна: T (1) ≤ T (2) ≤ ...≤ T (k) < T (k + 1) < ...< T (N + 1) ≤ T (N + 2) ≤ ...≤ T (N + K); |
| X - | вещественный вектоp длины LX заданных значений узлов аппроксимации: T (K) ≤ X (1) < X (2) < ... < X (LX) ≤ T (N + 1); |
| G - | вещественный вектоp длины LX заданных значений сглаживаемой функции, G (I) = gi , I = 1, 2, ..., LX; |
| W - | вещественный вектоp длины LX весовых коэффициентов W (I) = WI > 0 , I = 1, 2, ..., LX; |
| A - | вещественный вектоp длины N, коэффициентов сглаживающего сплайна, aI = A (I) , I = 1, 2, ..., N; |
| R - | вещественный двумерный рабочий массив размера N на (2*K - 1); |
| R1 - | вещественный рабочий вектоp длины K; |
| R2 - | вещественный двумерный рабочий массив размера N на K; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| IERR=65 - | если матрица нормальной системы уpавнений для определения коэффициентов сглаживающего сплайна вырождена. |
Версии
| IS03E - | среднеквадратическое сглаживание дискретно заданной функции сплайном k - го порядка с расширенной (Extended) точностью. Массивы T, X, G, W, A, R, R1, R2 имеют тип Extended. |
Вызываемые подпрограммы
| UTIS10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы IS03R. |
| UTIS11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы IS03E. |
| ASB1R - | решение системы линейных алгебраических уpавнений с ленточной матрицей, заданной в компактной форме, с выбором ведущего элемента по столбцу. |
| ASB1E - | решение системы линейных алгебраических уpавнений с ленточной матрицей, заданной в компактной форме с расширенной (Extended) точностью (выбор ведущего элемента по столбцу). |
Замечания по использованию
| В подпрограммах IS03R, IS03E используются служебные подпрограммы I I21R1, I I21E1. |
Unit TIS03R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IS03R_p;
function TIS03R: String;
implementation
function TIS03R: String;
var
N,LX,K,I,_i,IERR :Integer;
ХХ :Real;
X :Array [0..11] of Real;
G :Array [0..11] of Real;
A :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 );
W :Array [0..11] of Real = ( 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 );
label
_5;
begin
Result := ''; { результат функции }
N := 6;
LX := 12;
K := 3;
for I:=1 to LX do
begin
ХХ := 0.5+0.5*(I);
X[I-1] := XX;
G[I-1] := XX*XX*XX;
_5:
end;
Result := Result + Format('%s',
[' ТЕСТОВЫЙ ПРИМЕР ДЛЯ IS03R ']) + #$0D#$0A;
IS03R(N,K,LX,T,X,G,W,A,R,R1,R2,IERR);
Result := Result + Format('%s',[' REЗYЛЬTATЫ:' + #$0D#$0A + ' IERR=']);
Result := Result + Format('%3d ',[IERR]);
Result := Result + Format('%s',[' КОЭФФИЦИЕНТЫ A=' + #$0D#$0A]);
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('TIS03R',Result); { вывод результатов в файл TIS03R.res }
exit;
end;
end.
Результаты:
IERR = 0
A = ( .290, -2.236, 18.081, 110., 321.72, 520.93 )