Текст подпрограммы и версий 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 )