Текст подпрограммы и версий
iam2r_p.zip , iam2e_p.zip
Тексты тестовых примеров
tiam2r_p.zip , tiam2e_p.zip

Подпрограмма:  IAM2R (модуль IAM2R_p)

Назначение

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

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

Пусть задана кусочно - постоянная функция  f0 (x),  x  [x1, xN], имеющая узловые точки  x1, ..., xN и узловые значения  y1, ..., yN:

   f0(x)  =  (yi+1 - y1) x / (xi+1 - x1)  +  (y1xi+1 - yi+1x1) / (xi+1 - x1) ,

           x  [x1,xi+1] ,   i = 1, ..., N-1  

Строится среднеквадратическая аппроксимация функции  f0 (x) в классе выпуклых функций по методу, разработанному в [1].

Основной процедурой в этом методе является построение интерполяционного кубического сплайна с нулевыми краевыми условиями.

Построенная аппроксимирующая функция является выпуклой кусочно - линейной функцией, узловые точки которой содержатся среди узловых точек исходной функции.

1.  Малышев В.А. Среднеквадратическая аппроксимация выпуклыми функциями. Сб."Численный анализ: методы, алгоритмы, приложения". Изд - во МГУ, 1985.

Использование

procedure IAM2R(N :Integer; 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;
                var F :Array of Real; var A :Array of Real;
                var B :Array of Real; var C :Array of Real;
                var H :Array of Real; var V :Array of Real);

Параметры

N - заданное число узловых точек аппроксимируемой кусочно - линейной функции (тип: целый);
X - вещественный вектор длины N заданных значений узловых точек;
Y - вещественный вектор длины N заданных значений аппроксимируемой кусочно - линейной функции;
Z - вещественный вектор длины N вычисленных в точках  x1, ..., xN значений аппроксимирующей кусочно - линейной функции;
I I - целый вектор длины N, содержащий полученные номера  i1, ...,iK (k ≤ N) узловых точек  xi 1, ..., xi k аппроксимирующей кусочно - линейной функции;
         F0, F, -          A, B, C,            H, V   вещественные рабочие векторы длины N.

Версии

IAM2E - среднеквадратическая аппроксимация кусочно - линейной функции выпуклой кусочно - линейной функцией в режиме расширенной (Extended) точности. При этом параметры X, Y, Z, F0, F, A, B, C, H и V должны иметь тип Extended.

Вызываемые подпрограммы: нет

Замечания по использованию: нет

Пример использования

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

   f0(x)  =  (yi+1 - y1) x / (xi+1 - x1)  +  (y1xi+1 - yi+1x1) / (xi+1 - x1) ,

           x  [x1,xi+1] ,   i = 1, ..., 10

 такой, что
          X  =  ( 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10. )
          Y  =  ( 8., 5., 6., 4., 3., 4., 5., 4., 7., 9., 8. )

 Обращение к подпрограмме имеет вид:
Unit tiam2r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IAM2R_p;

function tiam2r: String;

implementation

function tiam2r: String;
var
N,J,_i :Integer;
Z :Array [0..10] of Real;
II :Array [0..10] of Integer;
F0 :Array [0..10] of Real;
F :Array [0..10] of Real;
A :Array [0..10] of Real;
B :Array [0..10] of Real;
C :Array [0..10] of Real;
H :Array [0..10] of Real;
V :Array [0..10] of Real;
I :Array [0..10] of Integer;
const
X :Array [0..10] of Real = ( 0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 );
Y :Array [0..10] of Real = ( 8.0,5.0,6.0,4.0,3.0,4.0,5.0,4.0,7.0,9.0,8.0 );
label
_1;
begin
Result := '';  { результат функции }
N := 11;
IAM2R(N,X,Y,Z,II,F0,F,A,B,C,H,V);
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 10 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 10 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 + Format('%s',[' Y =']);
Result := Result + #$0D#$0A;
for _i:=0 to 10 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 + Format('%s',[' Z =']);
Result := Result + #$0D#$0A;
for _i:=0 to 10 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 + Format('%s',[' II=']);
Result := Result + #$0D#$0A;
for _i:=0 to 10 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('tiam2r',Result);  { вывод результатов в файл tiam2r.res }
exit;
end;

end.


Результат: 

       Z  =  ( 7.59, 5.83, 5.01, 4.19, 3.38, 3.92, 4.46, 5.00, 6.54, 8.07, 9.61 )