Текст подпрограммы и версий
iam1r_p.zip , iam1e_p.zip
Тексты тестовых примеров
tiam1r_p.zip , tiam1e_p.zip

Подпрограмма:  IAM1R (модуль IAM1R_p)

Назначение

Среднеквадратическая аппроксимация кусочно - постоянной функции монотонной кусочно - постоянной функцией.

Математическое описание

Пусть задана кусочно - постоянная функция  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 )