|
Текст подпрограммы и версий mnl1r_p.zip |
Тексты тестовых примеров tmnl1r_p.zip |
Минимизация функции многих переменных по заданному направлению на заданном отрезке методом Фибоначчи.
Для решения задачи
min φ (x0 + λ s) , a0 ≤ λ ≤ b0 ,
λ
где x0, s ∈ En, a0, b0, λ ∈ E1, используется метод Фибоначчи.
Функция φ предполагается строго квазивыпуклой на отрезке [a0, b0] по направлению s.
Hа k - ой итерации метода строится отрезок [ak, bk] такой, что [ak, bk] ⊂ [ak - 1, bk - 1] ⊂ ... ⊂ [a0, b0], и значение λ*k ∈ [ai, bi] для всех i, где λ*k - искомая точка минимума φ (x) по направлению s.
Значение λ*k считается найденым, если для некоторого k выполнено одно из следующих условий:
- длина отрезка [ak, bk] меньше заданного ε > 0;
- | φ (x0 + α s) - φ (x0 + β s) | < ε1
max {| φ (x0 + α s)|, | φ (x0 + β s)|},
где
ak < α < β < bk;
- выполнено максимальное число итераций метода;
- выполнено максимальное число вычислений функции.
В.Г.Карманов. Математическое программирование. M., Изд - во "Наука", 1980.
procedure MNL1R(N :Integer; var X :Array of Real; var XMIN :Real;
var S :Array of Real; FUN :Proc_F1_MN; AA :Real; BB :Real;
XE :Real; var FE :Real; var UP :Array of Real;
var RM :Array of Real; var IERR :Integer);
Параметры
| N - | размерность пространства переменных (тип: целый); |
| X - | вещественный вектоp длины N, задающий начальную точку поиска минимума по направлению; |
| XMIN - | вещественная переменная, содержащая на выходе шаг по направлению до вычисленной точки минимума; |
| S - | вещественный вектоp длины N, задающий направление одномерной минимизации; |
| FUN - | имя подпрограммы вычисления значения функции (см. замечания по использованию); |
| AA - | вещественная переменная, задающая нижнюю гpаницу исходного отрезка неопределенности; |
| BB - | вещественная переменная, задающая верхнюю границу исходного отрезка неопределенности; |
| XE - | заданная точность ε вычисления точки минимума по аpгументу - длина конечного отрезка неопределенности (тип: вещественный); |
| FE - | заданная точность ε1 вычисления точки минимума по функционалу (тип: вещественный); |
| UP - | вещественный вектоp длины 3, содержащий упpавляющие параметры алгоритма (см. замечания по использованию); |
| RM - | вещественный вектоp длины N, используемый в подпрограмме как рабочий; |
| IERR - | целая переменная, указывающая пpичину окончания процесса: |
| IERR= 1 - | если достигнута точность XE; |
| IERR= 2 - | если достигнута точность FE; |
| IERR= 4 - | если выполнено максимальное число итераций; |
| IERR= 5 - | если выполнено максимальное число вычислений функции; |
| IERR=65 - | если XE ≤ 0; |
| IERR=66 - | если (BB - AA) < 0 или XE > (BB - AA). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Подпрограмма FUN составляется пользователем. Первый оператор подпрограммы должен иметь вид:
procedure FUN (var X :Array of Real; var F :Real; FE :Real);
Параметры
X - точка, в которой вычисляется значение функции;
F - вычисленное значение функции;
FE - точность, с которой вычисляется значение F.
Вектоp UP должен быть задан следующим образом: UP (1) - максимальное допустимое число итераций метода; UP (2) - максимальное допустимое число вычислений функции; UP (3) - определяет вариант алгоритма, т.е. если UP (3) = 1, то на каждой итерации вычисляется только одна контрольная точка, если UP (3) = 2, то вычисляются обе точки. |
min φ (x) , 4.2 ≤ x ≤ 4.8
φ (x) = 100 e -x + x , x* = - ln(0.01)
Unit TMNL1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNL1R_p, MNL1R_p;
function TMNL1R: String;
implementation
function TMNL1R: String;
var
IERR :Integer;
XMIN :Real;
X :Array [0..0] of Real;
S :Array [0..0] of Real;
RM :Array [0..0] of Real;
const
N :Integer = 1;
АА :Real = 4.2;
ВВ :Real = 4.8;
FE :Real = 1.0E-16;
ХЕ :Real = 1.0E-6;
UP :Array [0..2] of Real = ( 100.0,100.0,1.0 );
begin
Result := ''; { результат функции }
{ прототип оператора DАТА на FORTRANе }
X[0] := 0.0;
S[0] := 1.0;
Result := Result + Format('%s',
[' ОДНОМЕРНАЯ МИНИМИЗАЦИЯ МЕТОДОМ ФИБОНАЧЧИ ' + #$0D#$0A]);
Result := Result + Format('%s',[' *']);
Result := Result + Format('',[AA,BB,FE,XE]);
MNL1R(N,X,XMIN,S,FMNL1R,AA,BB,XE,FE,UP,RM,IERR);
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%2d ',[IERR]);
Result := Result + Format('%s',[' XMIN=']);
Result := Result + Format('%20.16f ',[XMIN]) + #$0D#$0A;
UtRes('TMNL1R',Result); { вывод результатов в файл TMNL1R.res }
exit;
end;
end.
Unit fmnl1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure fmnl1r(var X :Array of Real; var F :Real; FE :Real);
implementation
procedure fmnl1r(var X :Array of Real; var F :Real; FE :Real);
begin
F := 100.0*Exp(-X[0])+X[0];
end;
end.
Результаты:
IERR = 2
XMIN = 4.60517176