Подпрограмма: MNN1R (модуль MNN1R_p)
Назначение
Решение задачи минимизации функции многих переменных без
вычисления производных при наличии двухсторонних ограничений
на переменные методом покоординатного спуска с построением
аппроксимирующей параболы с использованием метода
Хука - Дживса.
Математическое описание
Для решения задачи
min f (x) ,
Q = { x: x ∈ En , aj ≤ xj ≤ bj , aj > - ∞ , bj < ∞ , j = 1, ..., n } ,
используется метод покоординатного спуска с построением
аппроксимирующей параболы.
Точка xk ∈ Q
считается точкой минимума f (x) на Q, если
выполнено хотя бы одно из следующих условий:
1.
|
| xjk - xjk - 1 | ≤ EPSX j
для всех j = 1, ..., n, где
xk = (x1k, ..., xnk) -
точка, полученная на k - ой итерации метода,
а EPSX - заданный вектоp точности решения задачи по аргументу;
|
2.
|
| f (xk) - f (xk - 1) | ≤ EPSF,
где xk - точка, вычисленная на
k - ой итерации метода, а EPSF - заданная
точность решения задачи по функционалу;
|
3.
|
NF > KMAX, где NF - фактически выполненное число
вычислений функции, KMAX - заданное максимально допустимое
число вычислений функции.
|
Использование
procedure MNN1R(var N :Integer; var X :Array of Real;
var XE :Array of Real; var A :Array of Real;
var B :Array of Real; FUN :Proc_F1_MN; var F :Real;
var FE :Real; var UP :Array of Real;
var I0 :Array of Integer; var IRM :Array of Integer;
var RM :Array of Real; var IERR :Integer);
Параметры
N -
|
размерность пространства переменных (тип: целый);
|
X -
|
вещественный вектоp длины N, содержащий на входе
заданную начальную точку поиска, на выходе -
точку минимума функции f (x);
|
XE -
|
вещественный вектоp длины N, содержащий заданную
абсолютную точность решения задачи по аргументу;
|
A -
|
вещественный вектоp длины N, задающий
ограничения снизу на переменные;
|
B -
|
вещественный вектоp длины N, задающий
ограничения свеpху на переменные;
|
FUN -
|
имя подпрограммы вычисления функции f (x);
|
F -
|
вещественная переменная, содержащая вычисленное
минимальное значение f (x);
|
FE -
|
заданная абсолютная точность решения задачи по функционалу;
|
UP -
|
вещественный вектоp длины 11, задающий
управляющие параметры алгоритма:
|
UP(1) -
|
заданная вещественная константа, участвующая в формировании начальной
точности вычисления по аргументу
(UP (1) ≥ 1);
|
UP(2) -
|
заданная вещественная константа, участвующая в формировании начальной
точности вычисления по функционалу
(UP (2) ≥ 1);
|
UP(3) -
|
заданная вещественная константа,
используемая при сравнении разностных
производных (0 < UP (3) < 1);
|
UP(4) -
|
заданная вещественная константа,
участвующая в формировании начального шага
(UP (4) > 1);
|
UP(5) -
|
заданная вещественная константа,
используемая для изменения величины шага
(константа дробления) (UP (5) > 1);
|
UP(6) -
|
вещественная константа, участвующая в изменении точности по аргументу,
0 < UP (6) < 1;
|
UP(7) -
|
вещественная константа, участвующая в
изменении точности вычисления по
функционалу, 0 < UP (7) < 1;
|
UP(8) -
|
вещественная константа, используемая в качестве "машинного нуля"
(UP (8) ≈ 103 * min,
где min - минимально представимое число с плавающей
запятой в машине);
|
UP(9) -
|
вещественная константа, используемая
для изменения величины шага (для увеличения шага) (UP > 1);
|
UP(10) -
|
заданная вещественная константа,
указывающая максимальное время работы подпрограммы;
|
UP(11) -
|
вещественная константа, влияющая на
величину шага в подпрограмме MNN09
(0.1 < < UP (11) < 1);
|
I0 -
|
целый вектоp длины N, задающий фиксированные
компоненты вектоpа переменных
(если I0 (I)= 0,
то X (I) - фиксируется, в противном случае
I0 (I) = 1);
|
IRM -
|
целый вектоp длины N, используемый в подпрограмме как рабочий;
|
RM -
|
вещественный вектоp длины 4N;
на входе:
|
RM(1) -
|
заданное максимально допустимое число итераций метода;
|
RM(2) -
|
заданное максимально допустимое число вычислений функции;
|
RM(1) -
|
выполненное число итераций;
|
RM(2) -
|
выполненное число вычислений функции;
|
IERR -
|
целочисленная переменная, указывающая причину
окончания счета:
|
IERR= 1 -
|
если достигнута точность по аргументу;
|
IERR= 2 -
|
если достигнута точность вычисления функции;
|
IERR= 4 -
|
если выполнено заданное число вычислений функции;
|
IERR= 5 -
|
если истекло заданное время вычислений;
|
IERR= 6 -
|
если произошло замедление счета.
|
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Подпрограмма FUN составляется пользователем.
Первый оператор вычисления функции должен иметь вид:
procedure FUN (var X :Array of Real; var F :Real; FE :Real);
Параметры
X - вещественный вектор длины N, содержащий
текущую точку пространства, в которой
вычисляется значение функции;
F - вещественная переменная, содержащая
вычисленное значение функции в точке X;
FE - вещественная переменная, содержащая заданную
точность вычисления значения функции в точке X.
Используются служебные подпрограммы MNN02, MNN04,
MNN05, MNN06, MNN07, MNN08, MNN09, UTMN05, MMKRIT и
структура - _MMKRIC.
|
Пример использования
Найти минимальное значение функции:
F(x) = (x1 - 1)2 + 10(x2 - 1)2 + 100(x3 - 1)2 + 1000(x4 - 1)2
- 4 ≤ x i ≤ 4 , i = 1, ..., 4 ;
начальное приближение
x0 = ( - 1, - 2, - 3, - 4 )
Unit TMNN1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNN1R_p, MNN1R_p;
function TMNN1R: String;
implementation
function TMNN1R: String;
var
N,_i,IERR :Integer;
F :Real;
RM :Array [0..29] of Real;
IRM :Array [0..3] of Integer;
const
X :Array [0..3] of Real = ( -1.0,-2.0,-3.0,-4.0 );
A :Array [0..3] of Real = ( -4.0,-4.0,-4.0,-4.0 );
B :Array [0..3] of Real = ( 4.0,4.0,4.0,4.0 );
ХЕ :Array [0..3] of Real = ( 0.1E-4,0.1E-4,0.1E-4,0.1E-4 );
FE :Real = 0.1E-4;
I0 :Array [0..3] of Integer = ( 1,1,1,1 );
UP :Array [0..10] of Real = ( 0.1E+3,0.1E+3,1.0E-1,0.1E+2,2.0,1E-1,1E-1,
0.1E-15,0.2E+1,0.2E+2,0.8 );
begin
Result := ''; { результат функции }
{ прототип оператора DАТА на FORTRANе }
RM[0] := 200.0;
RM[1] := 200.0;
N := 4;
MNN1R(N,X,XE,A,B,FMNN1R,F,FE,UP,I0,IRM,RM,IERR);
Result := Result + Format('%s',[' F']);
Result := Result + Format('%20.16f ',[F]);
Result := Result + Format('%s',[' FE']);
Result := Result + Format('%20.16f ',[FE]);
Result := Result + Format('%s',[#$0D#$0A + ' X']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%20.16f ',[X[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[#$0D#$0A + ' XE']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
begin
Result := Result + Format('%20.16f ',[XE[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' RM(1),RM(2)']);
Result := Result + Format(' %20.16f %20.16f ',[RM[0],RM[1]]);
Result := Result + Format('%s',[' IERR']);
Result := Result + Format('%4d ',[IERR]);
Result := Result + Format('%s',[' UP']);
Result := Result + Format(' %20.16f ',[UP[8]]) + #$0D#$0A;
UtRes('TMNN1R',Result); { вывод результатов в файл TMNN1R.res }
end;
end.
Unit fmnn1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure fmnn1r(var X :Array of Real; var F :Real; FE :Real);
implementation
procedure fmnn1r(var X :Array of Real; var F :Real; FE :Real);
begin
F := IntPower(X[0]-1.0,2)+10.0*IntPower(X[1]-1.0,2)+100.0*
IntPower(X[2]-1.0,2)+1000.0*IntPower(X[3]-1.0,2);
end;
end.
Результаты:
F = 0.00000
FE = 0.000010
X = 1.00000, 1.00000, 1.00000, 1.00000
XE = 0.00001, 0.00001, 0.00001, 0.00001
RM(1) = 10
RM(2) = 60
IERR = 12
UP = 2.0000
Примечание: IERR=12 означает, что выполнено одновременно два
критерия останова 1 и 2.