Метод Золотого Сечения: Минимизация Функции Одной Переменной

Минимизация функции одной переменной — это задача, в которой на отрезке нужно найти такую точку, где значение функции будет наименьшим. Звучит просто, но как сделать это быстро и без лишних вычислений? Именно здесь хорошо работает метод золотого сечения. Он позволяет последовательно сужать промежуток поиска и не действовать наугад. В этой статье разберём, откуда берутся ключевые числа метода и как работает сам алгоритм на отрезке.

Метод Золотого Сечения: Пропорция Деления Отрезка

Начнём с базовой конструкции. У нас есть отрезок \( [a,b] \), и мы хотим разделить его точкой так, чтобы части были неравными, но само деление обладало особым свойством. Пусть \( c\in(a,b) \). Тогда «золотым» называют такое деление, при котором отношение всего отрезка к большей части равно отношению большей части к меньшей:

\[ \frac{b-a}{b-c}=\frac{b-c}{c-a}=r. \]

Здесь \( r \) — постоянный коэффициент, который задаёт пропорцию деления. Теперь сделаем важный шаг: выразим \( r \) из этого условия.

Обозначим длины частей:

\[ L=b-a,\qquad x=b-c,\qquad L-x=c-a. \]

Тогда из условия золотого сечения получаем:

\[ \frac{L}{x}=\frac{x}{L-x}. \]

Перемножим крест-накрест:

\[ L \cdot (L-x)=x^2. \]

Раскроем скобки:

\[ L^2-L \cdot x=x^2. \]

Перенесём всё в одну сторону:

\[ x^2+L \cdot x-L^2=0. \]

Это квадратное уравнение относительно \( x \). Решим его:

\[ x=\frac{-L+\sqrt{L^2+4 \cdot L^2}}{2}=\frac{-L+\sqrt{5} \cdot L}{2}=L\cdot\frac{\sqrt{5}-1}{2}. \]

Следовательно, отношение \( \frac{x}{L} \) равно:

\[ \frac{x}{L}=\frac{\sqrt{5}-1}{2}. \]

А коэффициент \( r \) равен:

\[ r=\frac{L}{x}=\frac{1}{\frac{\sqrt{5}-1}{2}}=\frac{2}{\sqrt{5}-1}=\frac{\sqrt{5}+1}{2}. \]

То есть

\[ r=\frac{1+\sqrt{5}}{2}\approx 1.618. \]

Именно это число и определяет, как мы будем выбирать точки в алгоритме минимизации. Удобно, правда?

Запуск Алгоритма: Выбор Двух Точек и Первое Сравнение

Хорошо, теперь переходим к минимизации \( f(x) \) на отрезке \( [a,b] \). Нам нужны две внутренние точки, чтобы сравнить значения функции и отбросить часть отрезка. Обозначим их \( c \) и \( d \), где \( a<c<d<b \).

Иллюстрация метода золотого сечения

В методе золотого сечения точки выбирают так, чтобы они делили отрезок в «золотой» пропорции. Удобнее всего записать это через \( r \):

\[ d=a+\frac{1}{r} \cdot (b-a), \qquad c=b-\frac{1}{r} \cdot (b-a). \]

Здесь важно понимать: точки симметричны относительно середины по долям длин, а не по расстояниям. Хотите увидеть ту же запись без \( r \)? Тогда просто подставим \( \frac{1}{r}=\frac{\sqrt{5}-1}{2} \):

\[ d=a+\frac{\sqrt{5}-1}{2} \cdot (b-a), \qquad c=b-\frac{\sqrt{5}-1}{2} \cdot (b-a). \]

Дальше делаем именно то, что и определяет метод: вычисляем и сравниваем \( f(c) \) и \( f(d) \). И тут возникает главный вопрос: какую часть отрезка можно уверенно отбросить?

  • Если \( f(c)>f(d) \), то минимум не лежит в \( [a,c] \). Тогда оставляем \( [a_1,b_1]=[c,b] \).
  • Если \( f(d)>f(c) \), то минимум не лежит в \( [d,b] \). Тогда оставляем \( [a_1,b_1]=[a,d] \).

Почему это работает? Потому что метод применяют к унимодальной функции на \( [a,b] \): у неё есть только один минимум на этом отрезке. Значит, сравнение значений в двух точках показывает, в какой стороне находится минимум. Логика очень практичная: сравнили — отбросили — сузили.

Метод Золотого Сечения: Уменьшение Интервала, Критерий Остановки и Приближённый Ответ

Теперь самое приятное: после первого шага интервал становится короче с постоянным коэффициентом уменьшения. Посмотрим это прямо из формул.

Начальная длина:

\[ L_0=b-a. \]

После отбрасывания части отрезка остаётся отрезок длины

\[ L_1=b_1-a_1=\frac{1}{r} \cdot (b-a)=\frac{L_0}{r}. \]

Значит, на каждом шаге, если всё делать по правилам, длина «интервала неопределённости» умножается на \( \frac{1}{r} \). Тогда после \( n \) шагов:

\[ L_n=b_n-a_n=\frac{b-a}{r^n}. \]

Это уже готовая оценка скорости сужения. И здесь естественно возникает практический вопрос: когда нужно остановиться?

Обычно задают точность \( \varepsilon>0 \) и останавливают процесс, когда

\[ b_n-a_n<\varepsilon. \]

Тогда из формулы для \( L_n \) получаем условие на число шагов:

\[ \frac{b-a}{r^n}<\varepsilon \quad\Longrightarrow\quad r^n>\frac{b-a}{\varepsilon}. \]

Логарифмируем это выражение. Основание можно взять любое, но удобно использовать натуральный логарифм:

\[ n>\frac{\ln\left(\frac{b-a}{\varepsilon}\right)}{\ln(r)}. \]

То есть число итераций можно оценить заранее — нужно взять наименьшее целое \( n \), которое удовлетворяет этому неравенству. Это очень удобно, потому что вы сразу понимаете, сколько раз придётся вычислять \( f(x) \).

И ещё один важный момент. Начиная со второго шага, обычно не нужно заново считать оба значения. Одна из точек переходит в новый интервал, и её значение уже известно. Значит, на каждом следующем шаге часто требуется только одно новое вычисление \( f(x) \). Именно поэтому этот подход так популярен в численных методах.

А как получить ответ в виде конкретной точки?

После остановки у нас есть маленький интервал \( [a_n,b_n] \), внутри которого находится минимум. Тогда в качестве простого приближения часто берут:

\[ x^*\approx \frac{a_n+b_n}{2}, \]

или выбирают из последних точек ту, в которой значение функции меньше. В следующем разделе на примерах это будет видно особенно наглядно.

Практика Метода: Пошаговые Вычисления

Переходим к практическим вычислениям и посмотрим, как метод золотого сечения сужает интервал поиска на реальных числах. Здесь важно не только получить ответ, но и увидеть логику каждого шага. Тогда в следующих задачах вы уже сможете повторить алгоритм самостоятельно.

Пример 1. Найти минимум функции \( f(x)=(x-2)^2+1 \) на отрезке \( [a,b]=[1,3] \) с точностью \( \varepsilon=0.1 \), используя метод золотого сечения

Рассмотрим функцию \( f(x)=(x-2)^2+1 \) на отрезке \( [1,3] \). На этом отрезке она унимодальна, потому что имеет только один минимум вблизи \( x=2 \). Это означает, что сравнение \( f(c) \) и \( f(d) \) позволяет безопасно отбрасывать часть интервала.

График функции f(x)=(x-2)^2+1 на промежутке [1,3]

Берём

\[ r=\frac{1+\sqrt{5}}{2}\approx 1.618, \qquad \frac{1}{r}\approx 0.618. \]

Начинаем с \( [a_0,b_0]=[1,3] \). Строим две точки:

\[ \begin{gathered} d_0=a_0+\frac{1}{r}(b_0-a_0)=1+0.618\cdot 2=2.236, \\[6pt] c_0=b_0-\frac{1}{r}(b_0-a_0)=3-0.618\cdot 2=1.764. \end{gathered} \]

Вычисляем:

\[ \begin{gathered} f(c_0)=(1.764-2)^2+1=1.056, \\[6pt] f(d_0)=(2.236-2)^2+1=1.056. \end{gathered} \]

Получаем равенство \( f(c_0)=f(d_0) \), поэтому интервал можно сузить любым из двух симметричных способов. Для определённости оставим

\[ [a_1,b_1]=[1,2.236]. \]

Теперь важная деталь. Точка \( c_0=1.764 \) принадлежит новому интервалу \( [a_1,b_1] \), поэтому её можно использовать как рабочую точку следующего шага без повторного вычисления. То есть

\[ d_1=c_0=1.764, \qquad f(d_1)=f(c_0)=1.056. \]

Вторую точку находим по формуле:

\[ c_1=b_1-\frac{1}{r}(b_1-a_1)=2.236-0.618\cdot 1.236=1.472, \]

и вычисляем новое значение:

\[ f(c_1)=(1.472-2)^2+1=1.279. \]

Так как \( f(c_1)>f(d_1) \), минимум находится правее, поэтому

\[ [a_2,b_2]=[c_1,b_1]=[1.472,2.236]. \]

Далее переносим точку, значение которой уже известно. В новом интервале остаётся \( d_1=1.764 \), поэтому

\[ c_2=d_1=1.764, \qquad f(c_2)=f(d_1)=1.056. \]

Теперь определяем другую точку:

\[ d_2=a_2+\frac{1}{r}(b_2-a_2)=1.472+0.618\cdot 0.764=1.944, \]

и вычисляем:
\[ f(d_2)=(1.944-2)^2+1=1.003. \]

Так как \( f(c_2)>f(d_2) \), оставляем

\[ [a_3,b_3]=[c_2,b_2]=[1.764,2.236]. \]

Теперь в этом интервале остаётся точка \( d_2=1.944 \), поэтому

\[ c_3=d_2=1.944, \qquad f(c_3)=f(d_2)=1.003. \]

Другую точку вычисляем:

\[ d_3=a_3+\frac{1}{r}(b_3-a_3)=1.764+0.618\cdot 0.472=2.056, \]

а затем:

\[ f(d_3)=(2.056-2)^2+1=1.003. \]

Получаем равенство \( f(c_3)=f(d_3) \), поэтому для определённости возьмём следующий интервал:

\[ [a_4,b_4]=[1.764,2.056]. \]

В этом интервале остаётся точка \( c_3=1.944 \), поэтому

\[ d_4=c_3=1.944, \qquad f(d_4)=f(c_3)=1.003, \]

а другую точку находим так:

\[ c_4=b_4-\frac{1}{r}(b_4-a_4)=2.056-0.618\cdot 0.292=1.876, \]

и вычисляем:

\[ f(c_4)=(1.876-2)^2+1=1.015. \]

Так как \( f(c_4)>f(d_4) \), берём

\[ [a_5,b_5]=[c_4,b_4]=[1.876,2.056]. \]

Далее остаётся точка \( d_4=1.944 \), поэтому

\[ c_5=d_4=1.944, \qquad f(c_5)=f(d_4)=1.003. \]

Другую точку определяем так:

\[ d_5=a_5+\frac{1}{r}(b_5-a_5)=1.876+0.618\cdot 0.180=1.987, \]

и вычисляем:

\[ f(d_5)=(1.987-2)^2+1=1. \]

Так как \( f(c_5)>f(d_5) \), получаем

\[ [a_6,b_6]=[c_5,b_5]=[1.944,2.056]. \]

Теперь

\[ b_6-a_6=2.056-1.944=0.112, \]

поэтому делаем ещё один шаг. Точка \( d_5=1.987 \) остаётся в интервале, следовательно,

\[ c_6=d_5=1.987, \qquad f(c_6)=f(d_5)=1. \]

Другую точку вычисляем:

\[ d_6=a_6+\frac{1}{r}(b_6-a_6)=1.944+0.618\cdot 0.112=2.013, \]

а затем:

\[ f(d_6)=(2.013-2)^2+1=1. \]

При равенстве интервал можно сузить в любую сторону. Для определённости возьмём

\[ [a_7,b_7]=[1.944,2.013], \qquad b_7-a_7=0.069<0.1. \]

Значит, условие точности выполнено. В качестве стандартного приближения точки минимума берём середину:

\[ x^*\approx \frac{a_7+b_7}{2}=\frac{1.944+2.013}{2}=1.979. \]

А если ориентироваться на наименьшее из уже найденных значений функции, то хорошо подходит точка

\[ x^*\approx 1.987, \qquad f(x^*)\approx 1. \]

Это согласуется с тем, что минимум этой функции достигается при \( x=2 \) и равен \( f_{\min}=1 \). То есть метод дал близкий ответ благодаря последовательному и контролируемому сужению отрезка.

Пример 2. Определить количество итераций, необходимых для нахождения минимума функции \( f(x)=(x-2)^2+1 \) на отрезке \( [a,b]=[1,3] \) с точностью \( \varepsilon=0.1 \), используя метод золотого сечения

Теперь проверим, согласуется ли число шагов с тем, что мы получили в предыдущем примере. Используем оценку

\[ n>\frac{\ln\left(\frac{b-a}{\varepsilon}\right)}{\ln(r)}, \qquad r=\frac{1+\sqrt{5}}{2}. \]

Для \( [1,3] \) имеем \( b-a=2 \), поэтому

\[ \frac{b-a}{\varepsilon}=\frac{2}{0.1}=20, \qquad n>\frac{\ln(20)}{\ln(r)}. \]

Берём \( r\approx 1.618 \). Тогда \( \ln(20)\approx 2.996 \), \( \ln(1.618)\approx 0.481 \), откуда

\[ n>\frac{2.996}{0.481}\approx 6.225. \]

Следовательно, достаточно \( n=7 \) итераций. Это хорошо согласуется с практическим результатом: после седьмого шага мы получили интервал длины \( 0.069 \), который уже меньше, чем \( \varepsilon=0.1 \).

Куда Двигаться Дальше: Ещё Несколько Методов Минимизации

Мы разобрали метод золотого сечения и увидели, как он шаг за шагом сужает интервал. А что, если хочется иметь и другие варианты и понимать, в каком случае какой способ даёт лучший результат? Вот темы, которые логично продолжают эту статью.

  1. Метод Фибоначчи: Точный план шагов — Поговорим о том, как числа Фибоначчи задают последовательность проверок и помогают заранее спланировать поиск минимума.
  2. Метод дихотомии: Простое деление интервала — Разберём идею проверки двух точек, расположенных близко к середине, и покажем, как быстро сузить область поиска.
  3. Равномерный поиск: Стартовое приближение — Объясним, как пройти интервал равными шагами, найти лучший промежуток и подготовить основу для более точных методов.

Метод Золотого Сечения в Коде: Напишите Свой Поиск Минимума

А теперь представьте, что блок-схема ниже — это не просто картинка, а готовый план для вашего небольшого учебного задания. Почему бы не взять её как подсказку и не написать на любимом языке программирования компактную программу, которая находит минимальное значение унимодальной функции методом золотого сечения? Такой проект хорошо показывает, как теория быстро превращается в практический инструмент, который можно запускать снова и снова для разных функций. А ещё это отличный способ проверить себя: одинаково ли уверенно вы понимаете метод и на бумаге, и в коде?

Блок-схема алгоритма, которая шаг за шагом показывает, как находится минимальное значение унимодальной функции используя метод золотого сечения