Изменения

Перейти к: навигация, поиск

Поиск с помощью золотого сечения

14 байт добавлено, 18:58, 5 июня 2015
Алгоритм
Потребуем, чтобы одновременно выполнялось:
<tex> \fracdfrac{a + b}{c} = \fracdfrac{b + c}{a} = \varphi </tex>
<tex> \fracdfrac{a}{b} = \varphi </tex>
<tex> \fracdfrac{c}{b} = \varphi </tex>
Где <tex> \varphi </tex> {{---}} это некоторое отношение, в котором мы делим отрезок (точки <tex>x_1</tex> и <tex>x_2</tex> разбивают отрезок симметрично).
Тогда:
<tex> a + b = \varphi c, a = \varphi b, c = \varphi b</tex>, откуда получаем <tex> \varphi + 1 = \varphi^2 \Rightarrow \varphi = \fracdfrac{1 + \sqrt{5}}{2}</tex> &nbsp; (тот корень уравнения, который меньше нуля, по понятным причинам отбросили).
Это число совпадает с золотым сечением. Отсюда название метода.
Для реализации алгоритма нам потребуется найти <tex> a </tex> и <tex> a + b </tex>. Если <tex> L </tex> - длина исследуемого отрезка, тогда:
<tex> (\fracdfrac{b + c}{a} = \varphi;\; b + c = L - a) \Rightarrow</tex>
<tex> a = \fracdfrac{L}{\varphi + 1} </tex>
<tex> a + b = L - c = L - a = L - \fracdfrac{L}{\varphi + 1}</tex>
Причем, заметим что в силу того что <tex>\varphi</tex> {{---}} золотое сечение, то <tex>\fracdfrac{1}{\varphi + 1} = 2 - \varphi</tex>.
Формально для поиска минимума (для максимума {{---}} делается аналогично) функции <tex> f </tex> делаем следующее:
:'''Шаг 1''':
::Определяем границы поиска <tex>l</tex> и <tex>r</tex>, затем устанавливаем текущее разбиение:
::<tex>x_1 = l + \fracdfrac{r - l}{\varphi + 1}</tex> ::<tex>x_2 = r - \fracdfrac{r - l}{\varphi + 1}</tex>
::и вычислим функцию на них: <tex>f_1 = f(x_1), f_2 = f(x_2)</tex>
[[Файл:new_seg.gif|right|450px|Старая точка x1 уже делит отрезок в нужном отношении, поэтому нет необходимости вычислять ее заново (красным отмечены новые значения точек).]]
::: <tex>r = x_2</tex>
::: <tex>x_2 = x_1, f_2 = f_1</tex>
::: <tex>x_1 = l + \fracdfrac{r - l}{\varphi + 1},\; f_1 = f(x_1)</tex>
:: иначе:
::: <tex>l = x_1</tex>
::: <tex>x_1 = x_2, f_1 = f_2</tex>
::: <tex>x_2 = r - \fracdfrac{r - l}{\varphi + 1},\; f_2 = f(x_2)</tex>
:'''Шаг 3''':
:: если точность <tex>|r - l| < \varepsilon</tex> нас устраивает, тогда останавливаемся, и искомая точка <tex>x = \fracdfrac{l + r}{2}</tex>, иначе назад к шагу 2
===Псевдокод===
Анонимный участник

Навигация