Текст подпрограммы и версий 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 )