Текст подпрограммы и версий iam1r_p.zip , iam1e_p.zip |
Тексты тестовых примеров tiam1r_p.zip , tiam1e_p.zip |
Среднеквадратическая аппроксимация кусочно - постоянной функции монотонной кусочно - постоянной функцией.
Пусть задана кусочно - постоянная функция f0 (x), x ∈ (x0, xN]:
f0 (x) = y1 , x ∈ ( x i -1, x1 ] , i = 1,..., N
Строится наилучшая среднеквадратическая аппроксимация функции f0 (x) в классе монотонно возрастающих функций:
xN
∫ [ f(x) - f0(x) ]2 dx = min , f(x) ∈V1 [x0, xN] ,
x0
где V1 [x0, xN] - множество монотонно возрастающих функций. В подпрограмме реализован прямой метод решения этой задачи, разработанный в [1] и требующий CONST*N арифметических операций. Алгоритм основан на построении выпуклой оболочки функции
x F0 (x) = ∫ f(t) dt x0 и последующем ее дифференцировании.
Построенная аппроксимирующая функция является монотонно возрастающей кусочно - постоянной функцией, точки разрыва которой содержатся среди точек разрыва исходной кусочно - постоянной функции.
1. | Малышев В.А. Решение задачи монотонной аппроксимации и выпуклая оболочка кусочно - линейной функции. Сб."Численный анализ: методы, алгоритмы, приложения". Изд - во МГУ, 1985. |
procedure IAM1R(N :Integer; X0 :Real; var X :Array of Real; var Y :Array of Real; var Z :Array of Real; var II :Array of Integer; var F0 :Array of Real);
Параметры
N - | заданное число точек разрыва аппроксимируемой кусочнопостоянной функции (тип: целый); |
X0 - | заданное значение x0 (тип: вещественный); |
X - | вещественный вектор длины N заданных значений точек разрыва; |
Y - | вещественный вектор длины N заданных значений аппроксимируемой кусочно - постоянной функции; |
Z - | вещественный вектор длины N вычисленных в точках x1, ..., xN значений аппроксимирующей кусочно - постоянной функции; |
I I - | целый вектор длины N, содержащий полученные номера i1, ..., ik (k ≤ N) точек разрыва xi 1, ..., xi k аппроксимиющей кусочно - постоянной функции; |
F0 - | вещественный рабочий вектор длины N. |
Версии
IAM1E - | среднеквадратическая аппроксимация кусочно - постоянной функции монотонной кусочно - постоянной функцией в режиме расширенной (Extended) точности. При этом параметры X0, X, Y, Z, F0 должны иметь тип Extended. |
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Для среднеквадратической аппроксимации кусочно - постоянной функции
f0 (x) = y1 , x ∈ ( x i -1, x1 ] , i = 1, ..., 7 такой, что X0 = 0. X = ( 2., 4., 5., 7., 10., 12., 15. ) Y = ( 1., -1., -2., 2., -0.333333, 3., 1. ) обращение к подпрограмме имеет вид:
Unit tiam1r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, IAM1R_p; function tiam1r: String; implementation function tiam1r: String; var N,J,_i :Integer; X0 :Real; Z :Array [0..6] of Real; II :Array [0..6] of Integer; F0 :Array [0..6] of Real; I :Array [0..6] of Integer; const X :Array [0..6] of Real = ( 2.0,4.0,5.0,7.0,10.0,12.0,15.0 ); Y :Array [0..6] of Real = ( 1.0,-1.0,-2.0,2.0,-0.333333,3.0,1.0 ); label _1; begin Result := ''; { результат функции } N := 7; X0 := 0.0; IAM1R(N,X0,X,Y,Z,II,F0); for J:=1 to N do begin _1: I[J-1] := J; end; Result := Result + Format('%s',[' I =']); Result := Result + #$0D#$0A; for _i:=0 to 6 do begin Result := Result + Format('%9d ',[I[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%s',[' X =']); Result := Result + #$0D#$0A; for _i:=0 to 6 do begin Result := Result + Format('%20.16f ',[X[_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 6 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 6 do begin Result := Result + Format('%20.16f ',[Z[_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 6 do begin Result := Result + Format('%5d ',[II[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('tiam1r',Result); { вывод результатов в файл tiam1r.res } exit; end; end. Результат: Z = ( -0.4, -0.4, -0.4, 0.6, 0.6, 1.8, 1.8 )