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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Введение)
(Поиск корней функции)
Строка 5: Строка 5:
#Во-вторых, метод дихотомии применяется для нахождения значений действительно-значной функции, определяемому по какому-либо критерию (это может быть сравнение на минимум, максимум или конкретное число).
#Во-вторых, метод дихотомии применяется для нахождения значений действительно-значной функции, определяемому по какому-либо критерию (это может быть сравнение на минимум, максимум или конкретное число).
-
== Поиск корней функции ==
+
== Метод дихотомии как метод поиска корней функции ==
Перед применением метода дихотомии для поиска корней функции необходимо отделить корни одним из известных способов, например, графическим методом. Отделение корней необходимо в случае, если неизвестно на каком отрезке нужно искать корень. Будем считать, что корень <tex>t</tex> функции <tex>f(x)=0</tex> отделён на отрезке <tex>[a,b]</tex>. Задача заключается в том, чтобы найти и уточнить этот корень методом половинного деления (дихотомии). Другими словами, требуется найти приближённое значение корня с заданной точностью <tex>\eps</tex>.
Перед применением метода дихотомии для поиска корней функции необходимо отделить корни одним из известных способов, например, графическим методом. Отделение корней необходимо в случае, если неизвестно на каком отрезке нужно искать корень. Будем считать, что корень <tex>t</tex> функции <tex>f(x)=0</tex> отделён на отрезке <tex>[a,b]</tex>. Задача заключается в том, чтобы найти и уточнить этот корень методом половинного деления (дихотомии). Другими словами, требуется найти приближённое значение корня с заданной точностью <tex>\eps</tex>.

Версия 16:19, 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;
}

Приведённая программа ищет ноль функции 4-e^x-2x^2=0 на отрезке [0;\, 2] с точностью 0.01 методом дихотомии. Искомый корень x \approx 0.88281.

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

n a_n b_n c_n |b_n-c_n| 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. На каждом шаге процесса поиска делим отрезок [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] (рис. 9.1).
    • При поиске минимума:\\Если F_1<F_2, то отбрасываем отрезок [x,b], тогда b=x. (рис. 9.1.а)\\Иначе отбрасываем отрезок [a,x], тогда a=x. (рис. 9.1.б)
    • При поиске максимума:
Если F_1<F_2, то отбрасываем отрезок [a,x], тогда a=x.
Иначе отбрасываем отрезок [x,b], тогда b=x.
  1. Деление отрезка [a,b] продолжается, пока его длина не станет меньше заданной точности \varepsilon, т.е. |b-a| \le \varepsilon.


Рис. 9.1. Поиск экстремума функции F(x) методом дихотомии

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

На рис 9.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) в этой точке.


Рис. 9.2. Схема алгоритма метода дихотомии


Метод хорд

Метод хорд (способ пропорциональных частей) — численный метод уточнения корня трансцендентного уравнения. Метод основан на замене функции f(x) на каждом шаге поиска хордой, пересечение которой с осью Х дает приближение корня.

При этом в процессе поиска семейство хорд может строиться:

а) при фиксированном левом конце хорд, т.е. z=a, тогда начальная точка x_0=b (рис. 4.10а);

б) при фиксированном правом конце хорд, т.е. z=b, тогда начальная точка x_0=a (рис. 4.10б);


Рис. 4.10.

В результате итерационный процесс схождения к корню реализуется рекуррентной формулой:

для случая а):

x_{n+1}=x_n - \frac{f(x_n)}{f(x_n)-f(a)} (x_n - a); (4.11)

для случая б): x_{n+1}=x_n - \frac{f(x_n)}{f(x_n)-f(b)} (x_n - b); (4.12)

Процесс поиска продолжается до тех пор, пока не выполнится условие |x_{n+1}–x_n| \le \varepsilon или | h| \le \varepsilon . (4.13)

Метод обеспечивает быструю сходимость, если f(z)\cdot f''(z) > 0, т.е. хорды фиксируются в том конце интервала [a,b], где знаки функции f(z) и ее кривизны f совпадают.

Схема алгоритма уточнения корня методом хорд представлена на рис. 4.11.


Схема алгоритма уточнения корня методом хорд

Рис. 4.11. Схема алгоритма уточнения корня методом хорд


Этот метод позволяет исключать в точности половину интервала на каждой итерации. Приведем описание поисковой процедуры, ориентированной на нахождение точки минимума функции f(x) в интервале (a,b).

  1. Шаг1. Положить x_m=(a+b)/2 и L=b-a.
     Вычислить значение f(x_m).
  2. Шаг2. Положить x_1=a+L/4 и x_2=b-L/4.
     Можно заметить,что точки x_1,\; x_m,\; x_2 делят интервал (a,b) на четыре равные части.
     Вычислить значения f(x_1) и f(x_2).
  3. Шаг3. Сравнить f(x_1) и f(x_2).
         * если f(x_1)\le f(x_m), исключить интервал (x_m,b)<tex>, положив <tex>b=x_m.
           Средней точкой нового интервала поиска становится точка x_1.
           Следовательно, необходимо положить x_m=x_1. Перейти к шагу 5.
         * если f(x_1)\me f(x_m), то перейти к шагу 4. 
  4. Шаг4. Сравнить f(x_2) и f(x_m).
         * если f(x_2)&le f(x_m), исключить интервал (a,x_m), положив a=x_m.
           Т.к. средней точкой нового интервала становится точка x_2, положить x_m=x_2.
           Перейти к шагу 5.
         * если f(x_2)>=(x_m), исключить интервалы (a,x_1) и (x_2,b).
           Положить a=x_1 и b=x_2. (Заметим, что x_m продолжает оставаться средней точкой нового интервала)
           Перейти к шагу 5. 
  5. Шаг5. Вычислить L=b-a.
     Если величина |L| мала, закончить поиск, в противном случае вернуться к шагу 2.

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

См. также

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