|
Текст подпрограммы и версий iam2r_p.zip , iam2e_p.zip |
Тексты тестовых примеров tiam2r_p.zip , tiam2e_p.zip |
Среднеквадратическая аппроксимация кусочно - линейной функции выпуклой кусочно - линейной функцией
Пусть задана кусочно - постоянная функция 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 )