|
Текст подпрограммы и версий is02r_p.zip |
Тексты тестовых примеров tis02r_p.zip |
Сглаживание экспериментально заданной дискретной функции одномерным периодическим кубическим сплайном.
Пусть в узлах неравномерной сетки X1 < X2 < ... < XN приближенно заданы дискретные значения Uk, k = 1, 2, ..., N. Обозначим через D множество дважды непрерывно дифференцируемых функций g (x), удовлетворяющих условиям периодичности:
g(u) (X1) = g(u) (XN) , u = 0, 1, 2 .
Требуется найти сглаженные значения y (Xk), y" (Xk) периодического кубического сплайна y (X), минимизирующего функционал
N
∑ pk( g(xk) - uk )2 +
k=1
XN
+ ∫ ( g"(x) )2 dx , g ∈ D
X1
Здесь pk > 0, k = 1, 2, ..., N, суть заданные веса, определяемые точностью задания uk и требуемой мерой их сглаживания. В частности, при
pk = σk2 / α , σk2 = M ( uk - M uk )2 ,
где M - символ математического ожидания, получаем регуляризованный периодический кубический сплайн y (x), соответствующий параметру регуляризации α > 0.
Для контроля за степенью сглаживания вычисляются такие характеристики:
XN
E1 = ∫ [ y"(x) ]2 dx ,
X1
N
E2 = ( ∑ pk ( yk - uk )2 ) / ( p1 + ... + pN )
k=1
Сплайн y (x) на отрезке [Xk, Xk + 1] может быть восстановлен по формуле
(xk+1-x)3 (x-xk)3
y(x) = y"(xk) * ------------- + y"(xk+1) * ------------- +
6*δxk 6*δxk
y"(xk)*(δxk)2 xk+1-x
+ ( y(xk) - ----------------------- ) * ----------------- +
6 δxk
y"(xk+1)*(δxk)2 x-xk
+ ( y(xk+1) - ---------------------- ) * --------------- ,
6 xk
где Δxk = xk + 1 - xk .
Морозов B.A. O задачах дифференцирования и некоторых алгоритмах приближения экспериментальной информации. "Вычислительные методы и программирование", 1970, вып.14, МГУ, 46 - 62.
procedure IS02R(N :Integer; var X :Array of Real;
var U :Array of Real; var P :Array of Real;
var Y :Array of Real; var Y2 :Array of Real;
var DX :Array of Real; var E :Array of Real;
var R :Array of Real; var IERR :Integer);
Параметры
| N - | заданное число узлов сетки, N ≥ 3 (тип: целый); |
| X - | вещественный вектоp длины N, содержащий заданные значения узлов сетки и упорядоченный так, что X (1) < X (2) < ...< X (N); |
| U - | вещественный вектоp длины N, содержащий заданные значения сглаживаемой функции; |
| P - | вещественный вектоp длины N, содержащий заданные веса, P (I) > 0, I = 1, 2, ..., N; |
| Y - | вещественный вектоp длины N, содержащий вычисленные в узлах сетки значения сглаживающего периодического кубического сплайна; |
| Y2 - | вещественный вектоp длины N, содержащий вычисленные в узлах сетки значения второй производной сглаживающего периодического кубического сплайна; |
| DX - | вещественный вектоp длины N - 1, содержащий вычисленные значения шагов сетки DX (K) = X (K + 1) - X (K), K = 1, 2, ..., N - 1; |
| E - | вещественный вектоp длины 2, E (1) = E1, E (2) = E2; |
| R - | вещественный двумерный рабочий массив размера 6 на N; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| IERR=65 - | если N < 3; |
| IERR=66 - | если элементы вектоpа X не упорядочены строго по возрастанию; |
| IERR=67 - | если хотя бы один элемент вектоpа P меньше или pавен нулю. |
Версии: нет
Вызываемые подпрограммы
| UTI I10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы IS02R. |
Замечания по использованию
| Подпрограмма IS02R может быть использована для сглаживания приближенно заданных на неравномерной сетке t1 < t2 < ...< tN значений uk = u (tk), vk = v (tk), k = 1, 2, ..., N параметрической циклической функции u = u (t), v = v (t). Для этого достаточно дважды обратиться к подпрограмме IS02R. |
Unit tis02r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IS02R_p;
function tis02r: String;
implementation
function tis02r: String;
var
N,I,_i,IERR :Integer;
PI,PI2,H :Real;
X :Array [0..8] of Real;
U :Array [0..8] of Real;
P :Array [0..8] of Real;
Y :Array [0..8] of Real;
Y2 :Array [0..8] of Real;
DX :Array [0..7] of Real;
E :Array [0..1] of Real;
R :Array [0..53] of Real;
label
_1;
begin
Result := ''; { результат функции }
PI := 3.141592;
PI2 := 2*PI;
N := 9;
H := PI2/(N-1);
X[0] := 0.0;
U[0] := 0.0;
P[0] := 1.0;
for I:=2 to N do
begin
X[I-1] := X[I-2]+H;
U[I-1] := Sin(X[I-1]);
P[I-1] := 1.0;
_1:
end;
IS02R(N,X,U,P,Y,Y2,DX,E,R,IERR);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 8 do
begin
Result := Result + Format('%20.16f ',[Y[_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 8 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;
Result := Result + #$0D#$0A;
for _i:=0 to 7 do
begin
Result := Result + Format('%20.16f ',[DX[_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 1 do
begin
Result := Result + Format('%20.16f ',[E[_i]]);
if ( ((_i+1) mod 2)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('tis02r',Result); { вывод результатов в файл tis02r.res }
exit;
end;
end.
Результаты:
IERR = 0
Y(1) = 0.002020 Y2(1) = 0.14309
Y(2) = 0.392894 Y2(2) = -0.410578
Y(3) = 0.555974 Y2(3) = -0.588419
Y(4) = 0.391777 Y2(4) = -0.417586
Y(5) = -0.004407 Y2(5) = 0.001235
Y(6) = -0.399604 Y2(6) = 0.423318
Y(7) = -0.558361 Y2(7) = 0.603963
Y(8) = -0.380293 Y2(8) = 0.437473
Y(9) = 0.002020 Y2(9) = 0.014309
DX(I) = 0.785398 , I = 1, 2, ..., 8
E(1) = 1.009781
E(2) = 0.087973