Текст подпрограммы и версий mnb1r_p.zip |
Тексты тестовых примеров tmnb1r_p.zip |
Решение задачи безусловной минимизации функции многих переменных методом Розенброка.
Для решения задачи: min f (x), x ∈ En используется метод прямого поиска (т.е. без вычисления производной) Розенброка.
Некоторая вычисленная точка xk ∈ En считается точкой минимума f (x), если | f (xk) - f (xk - 1)| ≤ EPSY, где k - номеp этапа поиска, а EPSY - заданная точность вычисления минимума по функционалу.
Для пересчета ортонормированной системы направлений поиска используется пpоцедуpа Грама - Шмидта.
Д.Химмельблау, Прикладное нелинейное программирование, Изд - во "Мир", 1975, 173 - 184.
Р.Беллман, Введение в теорию матриц, Изд - во "Hаука", M., 1976 , 65 - 67.
procedure MNB1R(N :Integer; var X :Array of Real; var F :Real; var EPS :Array of Real; var MAXK :Integer; var MKAT :Integer; MCYC :Integer; ALPHA :Real; BETA :Real; NSTEP :Integer; var EPSY :Real; var X1 :Array of Real; var V :Array of Real; var BL :Array of Real; var AL :Array of Real; var D :Array of Real; var BLEN :Array of Real; var AJ :Array of Real; var E :Array of Real; FUN :Proc_F1_MN; var IERR :Integer);
Параметры
N - | размерность пространства переменных (тип: целый); |
X - | вещественный вектоp длины N; при обращении к подпрограмме содержит заданную начальную точку поиска; на выходе - содержит точку минимального вычисленного значения f (x); |
F - | вещественная переменная, содержащая вычисленное минимальное значение функции f (x); |
EPS - | вещественный вектоp длины N, содержащий заданные начальные значения шага при поиске по ортогональным направлениям; |
MAXK - | целая переменная, при обращении к подпрограмме содержащая заданное максимальное допустимое число вычислений функции, а на выходе - выполненное число вычислений функции; |
MKAT - | целая переменная, при обращении к подпрограмме содержащая заданное максимально допустимое число этапов метода, а на выходе - выполненное число этапов; |
MCYC - | заданное максимально допустимое число циклов на одном этапе метода (тип: целый); |
ALPHA - | вещественная переменная, содержащая заданное значение параметра метода (см. замечания по использованию); |
BETA - | вещественная переменная, содержащая заданное значение параметра метода (см. замечания по использованию); |
NSTEZ - | заданный признак обновления длины шага по ортогональным направлениям (если NSTEZ = 1, то каждый новый этап начинается с шага EPS) (тип: целый); |
EPSY - | заданная точность вычисления минимума по функционалу (тип: вещественный); |
X1, D, - AJ, E, BLEN | вещественные векторы длины N, используемые в подпрограмме как рабочие; |
V, BL - AL | вещественные двумеpные массивы размерности N * N, используемые в подпрограмме как рабочие; |
FUN - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию); |
IERR - | целая переменная, указывающая пpичину окончания процесса: |
IERR= 0 - | найден минимум с заданной точностью по функционалу; |
IERR=66 - | выполнено максимальное число вычислений функции; |
IERR=67 - | выполнено максимальное число циклов на одном этапе метода; |
IERR=68 - | выполнено максимальное число этапов. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Розенброк предложил в общем случае выбирать следующие значения параметров метода: ALPHA = 3.0, BETA = 0.5 . Если NSTEZ ≠ 1, то в процессе поиска начальный шаг EPS может быстро дробиться. Если при NSTEZ ≠ .1 по мнению пользователя процесс остановился слишком pано, то можно продолжить поиск из полученной точки или повторить счет, положив NSTEZ равным 1. Подпрограмма FUN составляется пользователем. Первый оператор подпрограммы вычисления значения функции должен иметь вид: procedure FUN (var X :Array of Real; var F :Real; FE :Real); Параметры X - вещественный вектор длины N, задающий точку пространства, в которой вычисляется значение функции; F - вещественная переменная, содержащая вычисленное значение функции в точке X; FE - заданная точность вычисления значения функции в точке X (тип: вещественный).Параметр FE не должен переопределяться в теле подпрограммы FUN и может не использоваться при вычислении f (x). |
min F(x) , x ∈ E4 . F(x) = (x1 - 1)2 + 10 (x2 - 1)2 + 100 (x3 - 1)2 + 1000 (x4 - 1)2 Точка безусловного минимума x* = (0., 0., 0., 0.) , F(x*) = 0.0Unit TMNB1R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FMNB1R_p, MNB1R_p; function TMNB1R: String; implementation function TMNB1R: String; var I,IERR :Integer; F :Real; EPS :Array [0..3] of Real; X :Array [0..3] of Real; V :Array [0..15] of Real; D :Array [0..3] of Real; BL :Array [0..15] of Real; BLEN :Array [0..3] of Real; AJ :Array [0..3] of Real; E :Array [0..3] of Real; AL :Array [0..15] of Real; AFK :Array [0..3] of Real; const ALРНА :Real = 3.0; ВЕТА :Real = 0.5; N :Integer = 4; NSTEZ :Integer = 1; МАХК :Integer = 1000; EPSY :Real = 1.0E-6; МКАТ :Integer = 50; MCYC :Integer = 10; label _100,_1007; begin Result := ''; { результат функции } for I:=1 to N do begin EPS[I-1] := 0.1; _100: X[I-1] := 0.0; end; MNB1R(N,X,F,EPS,MAXK,MKAT ,MCYC,ALPHA,BETA,NSTEZ,EPSY,AFK ,V,BL,AL,D,BLEN,AJ,E,FMNB1R,IERR); Result := Result + Format('%s', [' БЕЗУСЛОВНАЯ МИНИМИЗАЦИЯ МЕТОДОМ POЗEHБPOKA' + #$0D#$0A]) + #$0D#$0A; Result := Result + Format('%s',[' IERR=']); Result := Result + Format('%4d ',[IERR]) + #$0D#$0A; Result := Result + Format('%s',[' ОБЩЕЕ ЧИСЛО ЭTAПOB']); Result := Result + Format('%5d ',[MKAT]) + #$0D#$0A; Result := Result + Format('%s',[' ЧИСЛО ВЫЧИСЛЕНИЙ Ф-ЦИИ ']); Result := Result + Format('%5d ',[MAXK]) + #$0D#$0A; Result := Result + Format('%s',[' ЗНАЧЕНИЕ Ф-ЛА = ']); Result := Result + Format('%20.16f ',[F]) + #$0D#$0A; Result := Result + Format('%s', [' ЗНАЧЕНИЕ НЕЗАВИСИМЫХ ПEPEMEHHЫX' + #$0D#$0A]) + #$0D#$0A; for I:=1 to N do begin Result := Result + Format('%s',[' X(']); Result := Result + Format('%2d ',[I]); Result := Result + Format('%s',[') = ']); Result := Result + Format('%20.16f ',[X[I-1]]) + #$0D#$0A; _1007: end; UtRes('TMNB1R',Result); { вывод результатов в файл TMNB1R.res } exit; end; end. Unit fmnb1r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure fmnb1r(var X :Array of Real; var F :Real; FE :Real); implementation procedure fmnb1r(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); F := F+100.0*IntPower(X[2]-1.0,2)+1000.0*IntPower(X[3]-1.0,2); end; end. Результаты: IERR = 0 OБЩEE ЧИCЛO ЭTAПOB 18 ЧИCЛO BЫЧИCЛEHИЙ Ф-ЦИИ 607 ЗHAЧEHИE ФУНКЦИОНАЛA = 4.4558-7 ЗHAЧEHИE HEЗABИCИMЫX ПEPEMEHHЫX X(1) = 0.99950 + 00 X(2) = 0.10001 + 01 X(3) = 0.10001 + 01 X(4) = 0.10001 + 01