|
Текст подпрограммы и версий ia02r_p.zip |
Тексты тестовых примеров tia02r_p.zip |
Наилучшая среднеквадратическая аппроксимация дискретными монотонными функциями.
Для заданной дискретной функции F = (f1, f2, ..., fN) вычисляется наилучшее среднеквадратическое приближение T = (t1, t2, ..., tN) на классе дискретных монотонных функций из условия:
N
∑ pK*(fK - tK )2 =
K=1
N
= min ∑ pK*( fK - yK )2 ,
Y∈S(M) K=1
где pK > 0, K = 1, 2, ..., N - заданные весовые коэффициенты, класс
S(M) = { Y∈RN : sign(M) (yK+1 - yK) ≥ 0 , K = 1, 2, ..., N-1 } ,
а заданный параметр M определяет вид монотонности: при M > 0 приближение T ищется на множестве неубывающих функций, при М < 0 - на множестве невозрастающих функций, а при M = 0 функция T полагается равной исходной функции F.
М.К.Самарин, Приближение сеточных функций функциями с заданным числом внутренних экстремумов, Сб. "Численный анализ на ФОРТРАНе", вып.7, 1974, 101-110.
procedure IA02R(var F :Array of Real; var T :Array of Real;
var P :Array of Real; M :Integer; N :Integer);
Параметры
| F - | вещественный вектоp длины N заданных значений приближаемой функции; |
| T - | вещественный вектоp длины N вычисленных значений приближающей функции; |
| P - | вещественный вектоp длины N заданных весовых коэффициентов; |
| M - | заданный параметр, определяющий класс приближающих функций (тип: целый): |
| M > 0 , | приближение ищется на классе неубывающих функций; |
| M < 0 , | приближение ищется на классе невозрастающих функций; |
| M = 0 , | приближение полагается равным исходной функции; |
| N - | заданное число значений функции F (тип: целый). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Unit tia02r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, IA02R_p;
function tia02r: String;
implementation
function tia02r: String;
var
N,M,_i :Integer;
T :Array [0..4] of Real;
const
P :Array [0..4] of Real = ( 1.0,1.0,1.0,1.0,1.0 );
F :Array [0..4] of Real = ( 2.0,1.0,0.0,2.0,3.0 );
begin
Result := ''; { результат функции }
N := 5;
M := 1;
IA02R(F,T,P,M,N);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[T[_i]]);
if ( ((_i+1) mod 3)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('tia02r',Result); { вывод результатов в файл tia02r.res }
exit;
end;
end.
Результаты:
T = (1., 1., 1., 2., 3.)