Текст подпрограммы и версий mnb3r_p.zip |
Тексты тестовых примеров tmnb3r_p.zip |
Решение задачи безусловной минимизации диффеpенциpуемой функции многих переменных методом Флетчера - Ривса.
Для решения задачи: min f (x) , x ∈ En используется метод Флетчера - Ривса. Некоторая вычисленная точка x* ∈En считается точкой безусловного минимума функции f (x), если || f ' (x*)||2 ≤ EPS , где f ' (x*) - градиент функции f (x) в точке x*, а EPS - заданная точность вычисления минимума по гpадиенту. Если
n ∑ | xjk - xjk-1 | ≤ EPS , j= 1
где k - номеp итерации метода, и в то же время || f ' (x k)||2 > EPS , то считается, что для заданной функции алгоритм не может обеспечить сходимость с точностью EPS.
Для одномерной минимизации функции f (x) вдоль направления спуска используется метод кубической аппроксимации.
Д.Химмельблау, Прикладное нелинейное программирование. Изд - во "Мир", M., 1975.
procedure MNB3R(N :Integer; M :Integer; var X :Array of Real; var F :Real; var G :Array of Real; EST :Real; var EPS :Real; LIMIT :Integer; var IERR :Integer; var H :Array of Real; var KOUNT :Integer; FUN :Proc_F1_MN; GRAD :Proc_F3_MN);
Параметры
N - | размерность пространства переменных (тип: целый); |
M - | целочисленная переменная, равная 2 * N; |
X1 - | вещественный вектоp длины N: при обращении к подпрограмме содержит заданную начальную точку поиска, на выходе содержит точку минимального вычисленого значения f (x); |
F - | вещественная переменная, содержащая вычисленное минимальное значение функции f (x); |
G - | вещественный вектоp длины N, содержащий градиент функции f (x) в вычисленной точке минимума; |
EST - | заданное приближенное значение безусловного минимума функции f (x) (см. замечания по использованию) (тип: вещественный); |
EPS - | заданная точность вычисления минимума по градиенту (тип: вещественный); |
LIMIT - | заданное максимальное допустимое число итераций метода (тип: целый); |
IERR - | целочисленная переменная, указывающая пpичину окончания процесса: |
IERR= -1 - | нет сходимости; |
IERR= 0 - | найден минимум с заданной точностью; |
IERR= 1 - | выполнено LIMIT итераций; |
IERR= 2 - | установлено, что в некотоpом направлении функция f (x) не имеет минимума; |
H - | вещественный вектоp длины M, используемый в подпрограмме как рабочий; |
KOUNT - | целая переменная, содержащая фактически выполненное число итераций метода; |
FUN - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию); |
GRAD - | имя подпрограммы вычисления градиента функции f (x) (см. замечания по использованию). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Оценка EST минимального значения функции f (x) используется в пpоцедуpе одномерной минимизации по направлению. Если приближенное значение минимума можно указать, то это ускоpит процесс минимизации. В противном случае можно положить EST := 0.0. Подпрограммы FUN и GRAD составляются пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид: procedure FUN (var X1 :Array of Real; var F :Real; FE :Real); Параметры X1 - вещественный вектор N длины задающий точку пространства, в которой вычисляется значение функции; F - вещественная переменная, содержащая вычисленное значение функции в точке X1; FE - заданная точность вычисления значения функции в точке X1 (тип: вещественный); Параметр FE не должен переопределяться в теле подпрограммы FUN и может не использоваться для вычисления f (x). Первый оператор подпрограммы вычисления градиента функции f (x)должен иметь вид: procedure GRAD (var X1 :Array of Real; var G :Array of Real; GE :Real; IO :Integer); Параметры X1 - вещественный вектор N длины задающий точку пространства, в которой вычисляется градиент; G - вещественный вектоp длины N, содержащий вычисленный градиент функции в точке X1; GE - заданная точность вычисления компонент градиента (тип: вещественный); IO - целочисленная переменная, используемая как рабочая. Параметры GE и IO не должны переопределяться в теле подпрограммы GRAD и могут не использоваться для вычисления градиента. |
min F(x) , x ∈ E4 . F(x) = 100 ( x2 - x12 )2 + (1 - x1)2 + 90 (x4 - x3)2 + (1 - x3)2 + + (1 - x3)2 + 10.1 ( (x2 - 1)2 + (x4 - 1)2 ) + 19.8 (x2 - 1) (x4 - 1) . Точка абсолютного минимума x* = (1., 1., 1., 1.) , F(x*) = 0.Unit TMNB3R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FMNB3R_p, FGMNB3R_p, MNB3R_p; function TMNB3R: String; implementation function TMNB3R: String; var M,J,IERR,KOUNT :Integer; EPS,EST,F :Real; X :Array [0..3] of Real; G :Array [0..3] of Real; H :Array [0..7] of Real; const N :Integer = 4; LIMIT :Integer = 100; label _100; begin Result := ''; { результат функции } { прототип оператора DАТА на FORTRANе } X[0] := -3.0; X[1] := -1.0; X[2] := -3.0; X[3] := -1.0; EPS := 0.1E-10; EST := 0.0; M := 2*N; MNB3R(N,M,X,F,G,EST,EPS,LIMIT,IERR,H,KOUNT ,FMNB3R,FGMNB3R); Result := Result + Format('%s',[' IERR = ']); Result := Result + Format('%3d ',[IERR]); Result := Result + Format('%s',[' F = ']); Result := Result + Format('%20.16f ',[F]) + #$0D#$0A; for J:=1 to N do begin Result := Result + Format('%s',[' X(']); Result := Result + Format('%2d ',[J]); Result := Result + Format('%s',[') = ']); Result := Result + Format('%20.16f ',[X[J-1]]) + #$0D#$0A; _100: end; Result := Result + Format('%s',[' ИТЕРАЦИЙ - ']); Result := Result + Format('%5d ',[KOUNT]) + #$0D#$0A; UtRes('TMNB3R',Result); { вывод результатов в файл TMNB3R.res } exit; end; end. Unit fmnb3r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure fmnb3r(var X :Array of Real; var F :Real; FE :Real); implementation procedure fmnb3r(var X :Array of Real; var F :Real; FE :Real); begin F := 100.0*IntPower((X[1]-IntPower(X[0],2)),2) +IntPower(1.0-X[0],2)+90.0*IntPower((X[3]-IntPower(X[2],2)),2)+IntPower(1.0-X[2],2)+10.1 *(IntPower(X[1]-1.0,2)+IntPower(X[3]-1.0,2))+19.8*(X[1]-1.0)*(X[3]-1.0); end; end. Unit fgmnb3r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure fgmnb3r(var X :Array of Real; var G :Array of Real; GE :Real; I0 :Integer); implementation procedure fgmnb3r(var X :Array of Real; var G :Array of Real; GE :Real; I0 :Integer); begin G[0] := -400.0*X[0]*(X[1]-IntPower(X[0],2))-2.0*(1.0-X[0]); G[1] := 200.0*(X[1]-IntPower(X[0],2))+20.2*(X[1]-1.0)+19.8*(X[3]-1.0); G[2] := -360.0*X[2]*(X[3]-IntPower(X[2],2))-2.0*(1-X[2]); G[3] := 180.0*(X[3]-IntPower(X[2],2))+20.2*(X[3]-1.0)+19.8*(X[1]-1.0); end; end. Результаты: IERR = -1 F = 0.3328214 - 09 X1(1) = 1.0000100 + 00 X1(2) = 1.0000190 + 00 X1(3) = 0.99999060 + 00 X1(4) = 0.99998120 + 00 ИTEPAЦИЙ - 62