|
Текст подпрограммы и версий mni2r_p.zip |
Тексты тестовых примеров tmni2r_p.zip |
Решение задачи безусловной минимизации функции многих переменных без вычисления производных квазиньютоновским методом.
Для решения задачи: min f (x), x ∈ En , используется квазиньютоновский метод, основанный на приближенном вычислении на каждой итерации матрицы H, обратной к матрице Гессе функции f (x). Приведение матрицы H к диагональному виду осуществляется с использованием метода вращений.
Вычисленная точка x k ∈ En (k - номеp итерации метода) считается точкой минимума функции f (x), если | f (x k) - f (x k - 1) | ≤ EPS , где EPS > 0 - заданная точность вычисления минимума по функционалу.
Пшеничный Б.Н., Редковский H.H., Об одном численном методе минимизации без вычисления производных, ЖВМ и МФ, т.16, 1976.
procedure MNI2R(var N :Integer; var B22 :Real; E :Real;
var K2 :Integer; var PIK :Array of Real;
var BK :Array of Real; var X :Array of Real;
var XP :Array of Real; var Z :Array of Real;
var Z1 :Array of Real; var QL :Array of Real;
var W1 :Array of Real; var X0 :Array of Real;
var V1 :Real; FUN :Proc_F1_MN);
Параметры
| N - | размерность пространства переменных (тип: целый); |
| F - | вещественная переменная, содержащая минимальное значение функции f (x); |
| EPS - | заданная точность вычисления минимума по функционалу (тип: вещественный); |
| LIM - | заданное максимально допустимое число итераций метода (см. замечания по использованию) (тип: целый); |
| R1, R2 - | вещественные векторы длины N * N, используемые в подпрограмме как рабочие; |
| R3, R4 - R5, R6 R7, R8 | вещественные векторы длины N, используемые в подпрограмме как рабочие; |
| X - | вещественный вектоp длины N; при обращении к подпрограмме содержит заданную начальную точку поиска, на выходе содержит точку минимального вычисленного значения f (x); |
| STEP - | заданное значение начального шага поиска (тип: вещественный); |
| FUN - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Используется служебная подпрограмма MNI01. Если EPS > 0, то подпрограмма выполнит такое количество итераций метода, котоpое необходимо для достижения заданной точности решения, даже если оно больше LIM. Чтобы число фактически выполненных итераций было не больше LIM, следует задавать EPS = 0.0 . Подпрограмма FUN составляется пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид:
procedure FUN (var X :Array of Real; var F :Real; FE :Real);
Параметры
X - вещественный вектор длины N задающий точку
пространства, в которой вычисляется значение функции;
F - вещественная переменная, содержащая вычисленное
значение функции в точке X (тип: вещественный);
FE - заданная точность вычисления значения функции
в точке X (тип: вещественный);
Параметр FE не должен переопределяться в теле подпрограммы FUN и может не использоваться для вычисления f (x). В общем случае, значения точности по функционалу EPS и величины начального шага STEP pекомендуется задавать в следующих диапазонах: 1.E - 15 ≤ EPS ≤ 1.E - 4, 0.01 ≤ STEP ≤ 0.2 . |
min F(x) , x ∈ E2 .
F(x) = 100 ( x12 - x2 )2 + (x1 - 1)2.
Точка безусловного минимума x* = (1.0, 1.0) , F(x*) = 0.0 .
Unit TMNI2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNI2R_p, MNI2R_p;
function TMNI2R: String;
implementation
function TMNI2R: String;
var
N,I,K :Integer;
E,STEP,F :Real;
R1 :Array [0..3] of Real;
R2 :Array [0..3] of Real;
R3 :Array [0..1] of Real;
R4 :Array [0..1] of Real;
R5 :Array [0..1] of Real;
R6 :Array [0..1] of Real;
R7 :Array [0..1] of Real;
R8 :Array [0..1] of Real;
const
X :Array [0..1] of Real = ( -1.2,1.0 );
begin
Result := ''; { результат функции }
N := 2;
E := 1.E-12;
SТЕР := 0.1;
MNI2R(N,F,E,K,R1,R2,R3,R4,R5,R6,R7,R8,X,STEP,FMNI2R);
Result := Result + Format('%s',[' APГYMEHT:']);
Result := Result + #$0D#$0A;
for I:=1 to N do
begin
Result := Result + Format('%20.16f ',[X[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ФYHKЦИЯ: ']);
Result := Result + Format('%20.16f ',[F]) + #$0D#$0A;
UtRes('TMNI2R',Result); { вывод результатов в файл TMNI2R.res }
exit;
end;
end.
Unit fmni2r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure fmni2r(var X :Array of Real; var F :Real; FE :Real);
implementation
procedure fmni2r(var X :Array of Real; var F :Real; FE :Real);
begin
F := 100.0*IntPower((IntPower(X[0],2)-X[1]),2)+IntPower(X[0]-1,2);
end;
end.
Результаты:
F = 0.355E-15
X = ( 0.9999999, 0.9999999 )