Тернарний пошук#10169

Тернарний пошук (Розбір)

Нехай — неперервна увігнута функція, яка має точку локального мінімуму на відрізку . Тернарний пошук дозволяє знайти цю точку.

includegraphicshttps://eolympusercontent.com/images/k07p00eoq979b0275n5ugbq6isВиберемо g = a + (b - a) / 3, h = a + 2 \\cdot (b - a) / 3. Точки і ділять відрізок на три рівні частини (звідси й назва — тернарний пошук). Обчислимо значення і .

beginitemize

item Якщо f(g) \\le f(h), то точка мінімуму функції лежить на відрізку , тому покладаємо b = h.

item Якщо f(g) > f(h), то точка мінімуму лежить на відрізку , тому покладаємо a = g.

enditemizeПроцес продовжується доти, поки |a - b| > \\epsilon.

textbfПрикладУ прикладі задана функція f(x) = x^2 - 2 \\cdot x - 35 = (x - 7) (x + 5). Її корені: x_1 = -5, x_2 = 7. Мінімум функції досягається при

\r\nx = (x_1 + x_2) / 2 = (-5 + 7) / 2 = 1\r\n

Задачу також можна розв'язати за допомогою математичної формули. Мінімум квадратичної функції f(x) = ax^2 + bx + c~(a > 0) досягається в точці x = -b / (2a).Слідовно, для функції f(x) = x^2 + a \\cdot x + b мінімум досягається при x = - a / 2.

textbfРеалізація алгоритмуОголосимо константу ɛ = 10^{-7}.

beginlstlisting[language=C++]#define EPS 0.0000001

endlstlistingОголосимо функцію

textbff, мінімум якої потрібно знайти.

beginlstlisting[language=C++]f(double x)return x * x + a * x + b;

endlstlistingФункція

textbftriple знаходить мінімум функції на відрізку .

beginlstlisting[language=C++]triple(double f(double x), double a, double b)double g, h;while (b - a > EPS)g = a + (b - a) / 3;h = a + 2 * (b - a) / 3;if (f(g) <= f(h)) b = h; else a = g;return (a + b) / 2;

endlstlistingОсновна частина програми. Читаємо вхідні дані. Запускаємо тернарний пошук. Знаходимо точку мінімуму функції .

beginlstlisting[language=C++]("