Текст подпрограммы и версий ia01r_p.zip |
Тексты тестовых примеров tia01r_p.zip |
Построение наилучшего среднеквадратического приближения одномерной дискретной функции на множестве кусочно - монотонных функций.
Пусть задана дискретная функция F = (f1, f2, ..., fN). Отыскивается дискретная функция T = (t1, t2, ..., tN), для которой
N
∑ pk*( tk - fk )2 =
k=1
N
= inf ∑ pk*( yk - fk )2 ,
Y∈V k=1
где P = (p1, p2, ..., pN) - положительная весовая функция, V - множество дискретных функций Y = (y1, y2, ..., yN) удовлетворяющих условиям кусочной монотонности:
mk ( yk+1 - yk ) ≥ 0 , k = 1, 2, ..., N-1
с заданными параметрами mk, принимающими значения 1, - 1 или 0 и априорно характеризующими поведение искомой функции.
B подпрограмме реализован прямой метод решения задачи, требующий не более 3n2 арифметических операций.
Самарин M.K. Среднеквадратическая аппроксимация кусочно - монотонными функциями, Сб. "Численный анализ на ФОРТРАНе", вып.15, Изд-во МГУ, 1976.
procedure IA01R(var F :Array of Real; var T :Array of Real; var P :Array of Real; var M :Array of Integer; N :Integer);
Параметры
F - | вектоp значений заданной дискретной функции (тип: вещественный); |
T - | вектоp значений искомой функции (тип: вещественный); |
P - | вектоp весовых коэффициентов (тип: вещественный); |
M - | вектоp размерности N, в первых N - 1 компонентах которого заданы параметры mk, определяющие условия кусочной монотонности, а последняя компонента является рабочей (тип: целый); |
N - | размерность вещественных вектоpов F, T и P. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Для приближения дискретной функции F = (0., 2., - 5., 1., - 1.) при весовых коэффициентах, равных единице, на множестве Y, удовлетворяющих условиям
yk+1 - yk ≥ 0 , k = 1, 2, 3, 4 ,
обращение к подпрограмме имеет вид:
Unit tia01r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, IA01R_p; function tia01r: String; implementation function tia01r: String; var N,_i :Integer; T :Array [0..4] of Real; const F :Array [0..4] of Real = ( 0.0,2.0,-5.0,1.0,-1.0 ); P :Array [0..4] of Real = ( 1.0,1.0,1.0,1.0,1.0 ); M :Array [0..4] of Integer = ( 1,1,1,1,0 ); begin Result := ''; { результат функции } N := 5; IA01R(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('tia01r',Result); { вывод результатов в файл tia01r.res } exit; end; end. Результат: T = (-1., -1., -1., 0., 0.)