Метод дихотомии

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Изложение метода)
(Метод дихотомии как метод оптимизации)
Строка 116: Строка 116:
'''''Однопараметрическая оптимизация''''' (поиск экстремумов функций одной переменной) является самостоятельной и часто встречаемой задачей. Кроме того, к ней сводится гораздо более сложная задача - поиск экстремума функции многих переменных.
'''''Однопараметрическая оптимизация''''' (поиск экстремумов функций одной переменной) является самостоятельной и часто встречаемой задачей. Кроме того, к ней сводится гораздо более сложная задача - поиск экстремума функции многих переменных.
-
Рассмотрим метод дихотомии как простейший однопараметрический метод безусловной оптимизации. Данный метод является методом прямого поиска. В нем при поиске экстремума целевой функции используются только вычисленные значения целевой функции.
+
Рассмотрим метод дихотомии как простейший однопараметрический метод безусловной оптимизации. Данный метод является ''методом прямого поиска''. В нем при поиске экстремума целевой функции используются только вычисленные значения целевой функции.
Дана функция <tex>F(x)</tex>. Необходимо найти <tex>\overline{x}</tex>, доставляющий минимум (или максимум) функции <tex>F(x)</tex> на интервале <tex>[a,b]</tex> с заданной точностью <tex>\varepsilon</tex>, т.е. найти
Дана функция <tex>F(x)</tex>. Необходимо найти <tex>\overline{x}</tex>, доставляющий минимум (или максимум) функции <tex>F(x)</tex> на интервале <tex>[a,b]</tex> с заданной точностью <tex>\varepsilon</tex>, т.е. найти
-
<tex>\overline{x} = \arg \min F(x), \; \overline{x} \in [a,b]</tex>.
+
::<tex>\overline{x} = \arg \min F(x), \; \overline{x} \in [a,b]</tex>.
 +
 +
[[Изображение:09 01.gif|frame|Рис. 1. Поиск экстремума функции <tex>F(x)</tex> методом дихотомии]]
 +
[[Изображение:09 02.gif|frame|Рис. 2. Схема алгоритма метода дихотомии]]
Запишем словесный алгоритм метода.
Запишем словесный алгоритм метода.
 +
 +
#На каждом шаге процесса поиска делим отрезок <tex>[a,b]</tex> пополам, <tex>x=\frac {a+b}{2}</tex> - координата середины отрезка <tex>[a,b]</tex>.
#На каждом шаге процесса поиска делим отрезок <tex>[a,b]</tex> пополам, <tex>x=\frac {a+b}{2}</tex> - координата середины отрезка <tex>[a,b]</tex>.
-
#Вычисляем значение функции <tex>F(x)</tex> в окрестности <tex>\pm \varepsilon</tex> вычисленной точки <tex>x</tex>, т.е. <tex>F_1=F(x-\varepsilon),\; F_2=F(x+\varepsilon)</tex>.
+
#Вычисляем значение функции <tex>F(x)</tex> в окрестности <tex>\pm \varepsilon</tex> вычисленной точки <tex>x</tex>, т.е. <br
-
#Сравниваем <tex>F_1</tex> и <tex>F_2</tex> и отбрасываем одну из половинок отрезка <tex>[a,b]</tex> (рис. 9.1).
+
\> <tex>F_1=F(x-\varepsilon),\; F_2=F(x+\varepsilon)</tex>.
-
#*При поиске минимума:\\Если <tex>F_1<F_2</tex>, то отбрасываем отрезок <tex>[x,b]</tex>, тогда <tex>b=x</tex>. (рис. 9.1.а)\\Иначе отбрасываем отрезок <tex>[a,x]</tex>, тогда <tex>a=x</tex>. (рис. 9.1.б)
+
#Сравниваем <tex>F_1</tex> и <tex>F_2</tex> и отбрасываем одну из половинок отрезка <tex>[a,b]</tex> (рис. 1).
 +
#*При поиске минимума:
 +
#**Если <tex>F_1<F_2</tex>, то отбрасываем отрезок <tex>[x,b]</tex>, тогда <tex>b=x</tex>. (рис. 1.а)
 +
#**Иначе отбрасываем отрезок <tex>[a,x]</tex>, тогда <tex>a=x</tex>. (рис. 1.б)
#*При поиске максимума:
#*При поиске максимума:
-
::Если <tex>F_1<F_2</tex>, то отбрасываем отрезок <tex>[a,x]</tex>, тогда <tex>a=x</tex>.
+
#**Если <tex>F_1<F_2</tex>, то отбрасываем отрезок <tex>[a,x]</tex>, тогда <tex>a=x</tex>.
-
::Иначе отбрасываем отрезок <tex>[x,b]</tex>, тогда <tex>b=x</tex>.
+
#**Иначе отбрасываем отрезок <tex>[x,b]</tex>, тогда <tex>b=x</tex>.
#Деление отрезка <tex>[a,b]</tex> продолжается, пока его длина не станет меньше заданной точности <tex>\varepsilon</tex>, т.е. <tex>|b-a| \le \varepsilon</tex>.
#Деление отрезка <tex>[a,b]</tex> продолжается, пока его длина не станет меньше заданной точности <tex>\varepsilon</tex>, т.е. <tex>|b-a| \le \varepsilon</tex>.
-
 
-
 
-
Рис. 9.1. Поиск экстремума функции <tex>F(x)</tex> методом дихотомии
 
-
 
-
Схема алгоритма метода дихотомии представлена на рис 9.2.
 
-
 
-
На рис 9.2: <tex>c</tex>- константа,
 
-
 
-
<tex>
 
-
c =
 
-
\begin{cases}
 
-
\quad 1 , \quad (min \; F(x)), \\
 
-
-1, \quad (max \; F(x)).
 
-
\end{cases}
 
-
</tex>
 
-
 
-
При выводе <tex>x</tex> – координата точки, в которой функция <tex>F(x)</tex> имеет минимум (или максимум), <tex>F_M</tex> – значение функции <tex>F(x)</tex> в этой точке.
 
-
 
-
 
-
 
-
Рис. 9.2. Схема алгоритма метода дихотомии
 
-
 
-
 
-
Метод хорд
 
-
 
-
'''Метод хорд''' (способ пропорциональных частей) — численный метод уточнения корня трансцендентного уравнения.
 
-
Метод основан на замене функции <tex>f(x)</tex> на каждом шаге поиска хордой, пересечение которой с осью <tex>Х</tex> дает приближение корня.
 
-
 
-
При этом в процессе поиска семейство хорд может строиться:
 
-
 
-
а) при фиксированном левом конце хорд, т.е. <tex>z=a</tex>, тогда начальная точка <tex>x_0=b</tex> (рис. 4.10а);
 
-
 
-
б) при фиксированном правом конце хорд, т.е. <tex>z=b</tex>, тогда начальная точка <tex>x_0=a</tex> (рис. 4.10б);
 
-
 
-
 
-
 
-
Рис. 4.10.
 
-
 
-
В результате итерационный процесс схождения к корню реализуется рекуррентной формулой:
 
-
 
-
для случая а):
 
-
 
-
<tex>x_{n+1}=x_n - \frac{f(x_n)}{f(x_n)-f(a)} (x_n - a);</tex> (4.11)
 
-
 
-
для случая б):
 
-
<tex>x_{n+1}=x_n - \frac{f(x_n)}{f(x_n)-f(b)} (x_n - b);</tex> (4.12)
 
-
 
-
Процесс поиска продолжается до тех пор, пока не выполнится условие
 
-
<tex>|x_{n+1}–x_n| \le \varepsilon </tex> или <tex>| h| \le \varepsilon </tex>. (4.13)
 
-
 
-
Метод обеспечивает быструю сходимость, если <tex>f(z)\cdot f''(z) > 0</tex>, т.е. хорды фиксируются в том конце интервала <tex>[a,b]</tex>, где знаки функции <tex>f(z)</tex> и ее кривизны <tex>f"(z)</tex> совпадают.
 
-
 
-
Схема алгоритма уточнения корня методом хорд представлена на рис. 4.11.
 
-
Схема алгоритма уточнения корня методом хорд
 
-
Рис. 4.11. Схема алгоритма уточнения корня методом хорд
 
 +
Схема алгоритма метода дихотомии представлена на рис 2.
-
Этот метод позволяет исключать в точности половину интервала на каждой итерации.
+
На рис 2:
-
Приведем описание поисковой процедуры, ориентированной на нахождение точки минимума функции <tex>f(x)</tex> в интервале <tex>(a,b)</tex>.
+
::<tex>c</tex>- константа,
 +
::<tex>c =\begin{cases} \quad 1 , \quad (min \; F(x)), \\-1, \quad (max \; F(x)). \end{cases}</tex>
-
1. Шаг1. Положить <tex>x_m=(a+b)/2</tex> и <tex>L=b-a</tex>.
+
При выводе <tex>x</tex> – координата точки, в которой функция <tex>F(x)</tex> имеет минимум (или максимум), <tex>F_M</tex> – значение функции <tex>F(x)</tex> в этой точке.
-
Вычислить значение <tex>f(x_m)</tex>.
+
-
2. Шаг2. Положить <tex>x_1=a+L/4</tex> и <tex>x_2=b-L/4</tex>.
+
-
Можно заметить,что точки <tex>x_1,\; x_m,\; x_2</tex> делят интервал <tex>(a,b)</tex> на четыре равные части.
+
-
Вычислить значения <tex>f(x_1)</tex> и <tex>f(x_2)</tex>.
+
-
3. Шаг3. Сравнить <tex>f(x_1)</tex> и <tex>f(x_2)</tex>.
+
-
* если <tex>f(x_1)\le f(x_m)</tex>, исключить интервал <tex>(x_m,b)<tex>, положив <tex>b=x_m</tex>.
+
-
Средней точкой нового интервала поиска становится точка <tex>x_1</tex>.
+
-
Следовательно, необходимо положить <tex>x_m=x_1</tex>. Перейти к шагу 5.
+
-
* если <tex>f(x_1)\me f(x_m)</tex>, то перейти к шагу 4.
+
-
4. Шаг4. Сравнить <tex>f(x_2)</tex> и <tex>f(x_m)</tex>.
+
-
* если <tex>f(x_2)&le f(x_m)</tex>, исключить интервал <tex>(a,x_m)</tex>, положив <tex>a=x_m</tex>.
+
-
Т.к. средней точкой нового интервала становится точка <tex>x_2</tex>, положить <tex>x_m=x_2</tex>.
+
-
Перейти к шагу 5.
+
-
* если <tex>f(x_2)>=(x_m)</tex>, исключить интервалы <tex>(a,x_1)</tex> и <tex>(x_2,b)</tex>.
+
-
Положить <tex>a=x_1</tex> и <tex>b=x_2</tex>. (Заметим, что <tex>x_m</tex> продолжает оставаться средней точкой нового интервала)
+
-
Перейти к шагу 5.
+
-
5. Шаг5. Вычислить <tex>L=b-a</tex>.
+
-
Если величина <tex>|L|</tex> мала, закончить поиск, в противном случае вернуться к шагу 2.
+
== Список литературы ==
== Список литературы ==

Версия 17:51, 23 ноября 2008

Содержание

Введение

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

  1. Во-первых, это один из простых способов поиска корней функции одного аргумента.
  2. Во-вторых, метод дихотомии применяется для нахождения значений действительно-значной функции, определяемому по какому-либо критерию (это может быть сравнение на минимум, максимум или конкретное число).

Метод дихотомии как метод поиска корней функции

Изложение метода

Перед применением метода дихотомии для поиска корней функции необходимо отделить корни одним из известных способов, например, графическим методом. Отделение корней необходимо в случае, если неизвестно на каком отрезке нужно искать корень.

Будем считать, что корень t функции f(x)=0 отделён на отрезке [a,b]. Задача заключается в том, чтобы найти и уточнить этот корень методом половинного деления (дихотомии). Другими словами, требуется найти приближённое значение корня с заданной точностью \eps.

Пусть функция f непрерывна на отрезке [a,b],

f(a)\cdot f(b)<0, \; \eps=0,01 и t\in[a,b] - единственный корень уравнения f(x)=0, \; a\le t\le b.

(Мы не рассматриваем случай, когда корней на отрезке [a,b] несколько, то есть более одного. В качестве \eps можно взять и другое достаточно малое положительное число, например, 0,001.)

Поделим отрезок [a,b] пополам. Получим точку c= \frac {a+b}{2}, \; a<c<b и два отрезка [a,c], \; [c,b].

  • Если f(c)=0, то корень t найден (t=c).
  • Если нет, то из двух полученных отрезков [a,c] и [c,b] надо выбрать один [a_1;b_1] такой, что f(a_1)\cdot f(b_1)<0, то есть
    • [a_1;b_1] = [a,c], если f(a)\cdot f(c)<0 или
    • [a_1;b_1] = [c,b], если f(c)\cdot f(b)<0.
Новый отрезок [a_1;b_1] делим пополам. Получаем середину этого отрезка c_1=\frac {a_1+b_1}{2} и так далее.

Для того, чтобы найти приближённое значение корня с точностью до  \eps >0, необходимо остановить процесс половинного деления на таком шаге n, на котором |b_n-c_n|<\eps и вычислить x=\frac {a_n+b_n}{2}. Тогда можно взять t\approx x.

Реализация метода на С++ и числовой пример

Решим уравнение 4-e^x-2x^2=0 методом дихотомии. Графическим методом находим отрезок [0; \,1], которому принадлежит искомый корень. Так как f(0)\cdot f(1)<0, то принимаем a=0, \; b=1.

Ниже приведен пример программы на Си++, которая решает поставленную задачу.

Программа 1. Корень уравнения

#include <iostream>
#include <cmath>
using namespace std;
const double epsilon = 1e-2;
 
double f(double x)
{
    return 4- exp(x) - 2*x^2;
}
 
int main()
{
    double a, b, c;
    a = 0;
    b = 2;
    while (b - a > epsilon){
        c = (a + b) / 2;
        if(f(b) * f(c) < 0)
            a = c;
        else
            b = c;
    }
    cout << (a + b) / 2 << endl;
    return 0;
}

Искомый корень x \approx 0.88281. Вычисления проводились с точностью 0.01.

Промежуточные вычисления представлены в таблице ниже.

n an bn cn bn-cn
1 0 1 0.5 0.5
2 0.5 1 0.75 0.25
3 0.75 1 0.875 0.125
4 0.875 1 0.9375 0.0625
5 0.875 0.9375 0.90625 0.03125
6 0.875 0.90625 0.890625 0.015625
7 0.875 0.890625 0.8828125 0.0078125

Метод дихотомии как метод оптимизации

Однопараметрическая оптимизация (поиск экстремумов функций одной переменной) является самостоятельной и часто встречаемой задачей. Кроме того, к ней сводится гораздо более сложная задача - поиск экстремума функции многих переменных.

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

Дана функция F(x). Необходимо найти \overline{x}, доставляющий минимум (или максимум) функции F(x) на интервале [a,b] с заданной точностью \varepsilon, т.е. найти

\overline{x} = \arg \min F(x), \; \overline{x} \in [a,b].


Рис. 1.  Поиск экстремума функции  методом дихотомии
Рис. 1. Поиск экстремума функции F(x) методом дихотомии
Рис. 2.  Схема алгоритма метода дихотомии
Рис. 2. Схема алгоритма метода дихотомии

Запишем словесный алгоритм метода.


  1. На каждом шаге процесса поиска делим отрезок [a,b] пополам, x=\frac {a+b}{2} - координата середины отрезка [a,b].
  2. Вычисляем значение функции F(x) в окрестности \pm \varepsilon вычисленной точки x, т.е.
    F_1=F(x-\varepsilon),\; F_2=F(x+\varepsilon).
  3. Сравниваем F_1 и F_2 и отбрасываем одну из половинок отрезка [a,b] (рис. 1).
    • При поиске минимума:
      • Если F_1<F_2, то отбрасываем отрезок [x,b], тогда b=x. (рис. 1.а)
      • Иначе отбрасываем отрезок [a,x], тогда a=x. (рис. 1.б)
    • При поиске максимума:
      • Если F_1<F_2, то отбрасываем отрезок [a,x], тогда a=x.
      • Иначе отбрасываем отрезок [x,b], тогда b=x.
  4. Деление отрезка [a,b] продолжается, пока его длина не станет меньше заданной точности \varepsilon, т.е. |b-a| \le \varepsilon.




Схема алгоритма метода дихотомии представлена на рис 2.


На рис 2:

c- константа,
c =\begin{cases} \quad 1 , \quad (min \; F(x)), \\-1, \quad (max \; F(x)). \end{cases}

При выводе x – координата точки, в которой функция F(x) имеет минимум (или максимум), F_M – значение функции F(x) в этой точке.

Список литературы

См. также

Личные инструменты