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.