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