Поиск с помощью золотого сечения — различия между версиями
Antonkov (обсуждение | вклад) (→Время работы) |
|||
Строка 1: | Строка 1: | ||
− | '''Поиск с помощью золотого сечения''' (''Golden section search'') - это улучшение наивной реализации [[Троичный поиск|троичного поиска]], служащего для нахождения минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выигрыш в производительности. | + | '''Поиск с помощью золотого сечения''' (''Golden section search'') {{---}} это улучшение наивной реализации [[Троичный поиск|троичного поиска]], служащего для нахождения минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выигрыш в производительности. |
==Алгоритм== | ==Алгоритм== | ||
Строка 6: | Строка 6: | ||
Пусть <tex>l</tex> и <tex>r</tex> левая и правая граница исследуемого отрезка. | Пусть <tex>l</tex> и <tex>r</tex> левая и правая граница исследуемого отрезка. | ||
− | Точки <tex>x_1</tex> и <tex>x_2</tex> разбивают отрезок на три части | + | Точки <tex>x_1</tex> и <tex>x_2</tex> разбивают отрезок на три части длины <tex>a, b, c</tex> соответственно. Потребуем, чтобы одновременно выполнялось: |
<tex> \frac{a + b}{c} = \frac{b + c}{a} = \varphi </tex> | <tex> \frac{a + b}{c} = \frac{b + c}{a} = \varphi </tex> | ||
Строка 14: | Строка 14: | ||
<tex> \frac{c}{b} = \varphi </tex> | <tex> \frac{c}{b} = \varphi </tex> | ||
− | Где <tex> \varphi </tex> - это некоторое отношение, в котором мы делим отрезок (точки <tex>x_1</tex> и <tex>x_2</tex> разбивают отрезок симметрично). | + | Где <tex> \varphi </tex> {{---}} это некоторое отношение, в котором мы делим отрезок (точки <tex>x_1</tex> и <tex>x_2</tex> разбивают отрезок симметрично). |
Тогда: | Тогда: | ||
Строка 30: | Строка 30: | ||
<tex> a + b = L - c = L - a = L - \frac{L}{\varphi + 1}</tex> | <tex> a + b = L - c = L - a = L - \frac{L}{\varphi + 1}</tex> | ||
− | Причем, заметим что в силу того что <tex>\varphi</tex> - золотое сечение, то <tex>\frac{1}{\varphi + 1} = 2 - \varphi</tex>. | + | Причем, заметим что в силу того что <tex>\varphi</tex> {{---}} золотое сечение, то <tex>\frac{1}{\varphi + 1} = 2 - \varphi</tex>. |
− | Формально для поиска минимума (для максимума - делается аналогично) функции <tex> f </tex> делаем следующее: | + | Формально для поиска минимума (для максимума {{---}} делается аналогично) функции <tex> f </tex> делаем следующее: |
:'''Шаг 1''': | :'''Шаг 1''': | ||
Строка 74: | Строка 74: | ||
x2 = r - resphi * (r - l) | x2 = r - resphi * (r - l) | ||
f2 = f(x2) | f2 = f(x2) | ||
− | while | + | while abs(r - l) > eps |
return (x1 + x2) / 2 | return (x1 + x2) / 2 |
Версия 02:06, 12 мая 2012
Поиск с помощью золотого сечения (Golden section search) — это улучшение наивной реализации троичного поиска, служащего для нахождения минимума/максимума функции. При простом троичном поиске на каждой итерации функция вычисляется в двух точках. Метод же золотого сечения требует вычисления лишь в одной точке (за исключением первой итерации). За счет этого достигается выигрыш в производительности.
Содержание
Алгоритм
Рассмотрим одну итерацию алгоритма троичного поиска. Попробуем подобрать такое разбиение отрезка на три части, чтобы на следующей итерации одна из точек нового разбиения совпала с одной из точек текущего разбиения. Тогда в следующий раз не придется считать функцию в двух точках, так как в одной она уже была посчитана.
Пусть
и левая и правая граница исследуемого отрезка.Точки
и разбивают отрезок на три части длины соответственно. Потребуем, чтобы одновременно выполнялось:
Где
— это некоторое отношение, в котором мы делим отрезок (точки и разбивают отрезок симметрично).Тогда:
, откуда получаем (тот корень уравнения, который меньше нуля, по понятным причинам отбросили).
Это число совпадает с золотым сечением. Отсюда название метода.
Для реализации алгоритма нам потребуется найти
и . Если - длина исследуемого отрезка, тогда:
Причем, заметим что в силу того что
— золотое сечение, то .Формально для поиска минимума (для максимума — делается аналогично) функции
делаем следующее:- Шаг 1:
- Определяем границы поиска и , затем устанавливаем текущее разбиение:
- и вычислим функцию на них:
- Шаг 2:
- если
- иначе:
- если
- Шаг 3:
- если точность нас устраивает, тогда останавливаемся, и искомая точка , иначе назад к шагу 2
Псевдокод
phi = (1 + sqrt(5)) / 2 resphi = 2 - phi goldenSectionSearch(f, l, r, eps) x1 = l + resphi * (r - l) x2 = r - resphi * (r - l) f1 = f(x1) f2 = f(x2) do if f1 < f2: r = x2 x2 = x1 f2 = f1 x1 = l + resphi * (r - l) f1 = f(x1) else: l = x1 x1 = x2 f1 = f2 x2 = r - resphi * (r - l) f2 = f(x2) while abs(r - l) > eps return (x1 + x2) / 2
Время работы
Так как на каждой итерации мы считаем одно значение функции и уменьшаем область поиска в
раз, пока , то время работы алгоритма составит .Если удельный вес вычисления функции троичным поиском ( против .
достаточно большой, тогда получим ускорение работы примерно в 2,4 раз по сравнению с неулучшеннымСм также
Ссылки
- Wikipedia - Golden section search (english)