|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/mn_htm_p/mnb3r_p.htm
Дата изменения: Thu Nov 5 15:19:26 2015 Дата индексирования: Sun Apr 10 02:47:34 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий 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