unit GoldenSection;
declaration
function F(X:Real):Real;
interface GoldenSectionOptimize;
implementation
(*********************************************************************
Процедура минимизации значения функции методом золотого сечения.
Оптимизирует функцию F - унимодальную функцию одного переменного.
Унимодальная функция - функция, определённая на отрезке [A,B], такая,
что существует точка C из [A,B], что на [A,C] функция строго убывает,
а на [C,B] функция строго возрастает. Точка C и есть точка минимума.
Вообще, F может быть и функцией более общего вида, но в таком случае
не гарантируется нахождение глобального минимума.
Параметры:
A,B - отрезок [A,B], на котором ищется минимум функции F.
N - число шагов метода
После выхода переменные A и B содержат границы отрезка, на котором
находится решение задачи.
Алгоритм проводит 2+N вычислений функции F.
*********************************************************************)
procedure GoldenSectionOptimize(var A:Real; var B:Real; const N:Integer);
var
i : Integer;
S1 : Real;
S2 : Real;
U1 : Real;
U2 : Real;
FU1 : Real;
FU2 : Real;
begin
//вычисляем позиции первой и второй секущих точек
S1 := (3 - Sqrt(5))/2;
S2 := (Sqrt(5) - 1)/2;
U1 := A + S1*(B-A);
U2 := A + S2*(B-A);
//вычисляем функцию в точках
FU1 := F(U1);
FU2 := F(U2);
//шаги метода
for i:=1 to N do
begin
if FU1<=FU2 then
begin
B := U2;
U2 := U1;
FU2 := FU1;
U1 := A + S1*(B-A);
FU1 := F(U1);
end
else
begin
A := U1;
U1 := U2;
FU1 := FU2;
U2 := A + S2*(B-A);
FU2 := F(U2);
end;
end;
end;
end.