Постановка задачі
Нехай дана функція , унімодальна на деякому відрізку . Під унімодальна розуміється один з двох варіантів. Перший: функція спочатку строго зростає, потім досягає максимуму (в одній точці або цілому відрізку), потім строго спадає. Другий варіант, симетричний: функція спочатку спадає, досягає мінімуму, зростає. Надалі ми будемо розглядати перший варіант, другий буде абсолютно симетричний йому. Потрібно знайти максимум функції на відрізку .
Алгоритм
Візьмемо будь-які дві точки і в цьому відрізку: . Порахуємо значення функції і .Далі у нас виходить три варіанти:
- Якщо виявиться, що , то шуканий максимум не може перебувати в лівій частині, тобто в частині . У цьому легко переконатися: якщо в лівій точці функція менше, ніж в правій, то або ці дві точки знаходяться в області «підйому» функції, або тільки ліва точка знаходиться там. У будь-якому випадку, це означає, що максимум далі є сенс шукати тільки в відрізку .
- Якщо, навпаки, , то ситуація аналогічна попередній з точністю до симетрії. Тепер шуканий максимум не може перебувати в правій частині, тобто в частині , тому переходимо до відрізка .
- Якщо , то або обидві ці точки знаходяться в області максимуму, або ліва точка знаходиться в області зростання, а права — в області спадання (тут істотно використовується те, що зростання / спадання суворі). Таким чином, в подальшому пошук має сенс на відрізку , але (з метою спрощення коду) цей випадок можна віднести до будь-якого з двох попередніх.
Таким чином, за результатом порівняння значень функції в двох внутрішніх точках ми замість поточного відрізка пошуку знаходимо новий відрізок . Повторимо тепер всі дії для цього нового відрізка, знову отримаємо новий, суворо менший, відрізок, і так далі.
Втім, при іншому виборі, коли і ближче один до одного, швидкість збіжності збільшиться.
Випадок цілочисельного аргументу
Якщо аргумент функції цілочисельний, то відрізок теж стає дискретним, але, оскільки ми не накладали ніяких обмежень на вибір точок і , то на коректність алгоритму це ніяк не впливає. Можна як і раніше вибирати і так, щоб вони ділили відрізок на 3 частини, але вже тільки приблизно рівні.
Другий відмінний момент — критерій зупинки алгоритму. В даному випадку тернарний пошук треба буде зупиняти, коли стане , адже в такому випадку вже неможливо буде вибрати точки і так, щоб були різними і відрізнялися від і , і це може привести до зациклення. Після того, як алгоритм тернарного пошуку зупиниться і стане , з решти декількох точок треба вибрати точку з максимальним значенням функції.
Реалізація
Реалізація для безперервного випадку (тобто коли функція має вигляд: double f(double x))
:
double l = ..., r = ..., EPS = ...;//вхідні дані while (r - l > EPS) { double m1 = l + (r - l) / 3, m2 = r - (r - l) / 3; if (f(m1) < f(m2)) l = m1; else r = m2; }
Тут EPS — фактично, абсолютна похибка відповіді (не враховуючи похибок, пов'язаних з неточним обчисленням функції).
Замість критерію «while (r - l > EPS)
» можна вибрати і такий критерій:
for (int it = 0; it < iterations; ++it)
З одного боку, доведеться підібрати константу , щоб забезпечити необхідну точність (зазвичай досить декількох сотень, щоб досягти максимальної точності). Зате, з іншого боку, число ітерацій перестає залежати від абсолютних величин і , тобто ми фактично за допомогою задаємо необхідну відносну похибку.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Postanovka zadachiNehaj dana funkciya f x displaystyle f x unimodalna na deyakomu vidrizku l r displaystyle l r Pid unimodalna rozumiyetsya odin z dvoh variantiv Pershij funkciya spochatku strogo zrostaye potim dosyagaye maksimumu v odnij tochci abo cilomu vidrizku potim strogo spadaye Drugij variant simetrichnij funkciya spochatku spadaye dosyagaye minimumu zrostaye Nadali mi budemo rozglyadati pershij variant drugij bude absolyutno simetrichnij jomu Potribno znajti maksimum funkciyi f x displaystyle f x na vidrizku l r displaystyle l r AlgoritmVizmemo bud yaki dvi tochki m 1 displaystyle m 1 i m 2 displaystyle m 2 v comu vidrizku l lt m 1 lt m 2 lt r displaystyle l lt m 1 lt m 2 lt r Porahuyemo znachennya funkciyi f m 1 displaystyle f m 1 i f m 2 displaystyle f m 2 Dali u nas vihodit tri varianti Yaksho viyavitsya sho f m 1 lt f m 2 displaystyle f m 1 lt f m 2 to shukanij maksimum ne mozhe perebuvati v livij chastini tobto v chastini l m 1 displaystyle l m 1 U comu legko perekonatisya yaksho v livij tochci funkciya menshe nizh v pravij to abo ci dvi tochki znahodyatsya v oblasti pidjomu funkciyi abo tilki liva tochka znahoditsya tam U bud yakomu vipadku ce oznachaye sho maksimum dali ye sens shukati tilki v vidrizku m 1 r displaystyle m 1 r Yaksho navpaki f m 1 gt f m 2 displaystyle f m 1 gt f m 2 to situaciya analogichna poperednij z tochnistyu do simetriyi Teper shukanij maksimum ne mozhe perebuvati v pravij chastini tobto v chastini m 2 r displaystyle m 2 r tomu perehodimo do vidrizka l m 2 displaystyle l m 2 Yaksho f m 1 f m 2 displaystyle f m 1 f m 2 to abo obidvi ci tochki znahodyatsya v oblasti maksimumu abo liva tochka znahoditsya v oblasti zrostannya a prava v oblasti spadannya tut istotno vikoristovuyetsya te sho zrostannya spadannya suvori Takim chinom v podalshomu poshuk maye sens na vidrizku m 1 m 2 displaystyle m 1 m 2 ale z metoyu sproshennya kodu cej vipadok mozhna vidnesti do bud yakogo z dvoh poperednih Takim chinom za rezultatom porivnyannya znachen funkciyi v dvoh vnutrishnih tochkah mi zamist potochnogo vidrizka poshuku l r displaystyle l r znahodimo novij vidrizok l r displaystyle l r Povtorimo teper vsi diyi dlya cogo novogo vidrizka znovu otrimayemo novij suvoro menshij vidrizok i tak dali m 1 l r l 3 displaystyle m 1 l frac r l 3 m 2 r r l 3 displaystyle m 2 r frac r l 3 Vtim pri inshomu vibori koli m 1 displaystyle m 1 i m 2 displaystyle m 2 blizhche odin do odnogo shvidkist zbizhnosti zbilshitsya Vipadok cilochiselnogo argumentuYaksho argument funkciyi f displaystyle f cilochiselnij to vidrizok l r displaystyle l r tezh staye diskretnim ale oskilki mi ne nakladali niyakih obmezhen na vibir tochok m 1 displaystyle m 1 i m 2 displaystyle m 2 to na korektnist algoritmu ce niyak ne vplivaye Mozhna yak i ranishe vibirati m 1 displaystyle m 1 i m 2 displaystyle m 2 tak shob voni dilili vidrizok l r displaystyle l r na 3 chastini ale vzhe tilki priblizno rivni Drugij vidminnij moment kriterij zupinki algoritmu V danomu vipadku ternarnij poshuk treba bude zupinyati koli stane r l lt 3 displaystyle r l lt 3 adzhe v takomu vipadku vzhe nemozhlivo bude vibrati tochki m 1 displaystyle m 1 i m 2 displaystyle m 2 tak shob buli riznimi i vidriznyalisya vid l displaystyle l i r displaystyle r i ce mozhe privesti do zaciklennya Pislya togo yak algoritm ternarnogo poshuku zupinitsya i stane r l lt 3 displaystyle r l lt 3 z reshti dekilkoh tochok l l 1 r displaystyle l l 1 r treba vibrati tochku z maksimalnim znachennyam funkciyi RealizaciyaRealizaciya dlya bezperervnogo vipadku tobto koli funkciya f displaystyle f maye viglyad span class kt double span span class w span span class nf f span span class p span span class kt double span span class w span span class n x span span class p span double l r EPS vhidni dani while r l gt EPS double m1 l r l 3 m2 r r l 3 if f m1 lt f m2 l m1 else r m2 Tut EPS faktichno absolyutna pohibka vidpovidi ne vrahovuyuchi pohibok pov yazanih z netochnim obchislennyam funkciyi Zamist kriteriyu span class k while span span class w span span class p span span class n r span span class w span span class o span span class w span span class n l span span class w span span class o gt span span class w span span class n EPS span span class p span mozhna vibrati i takij kriterij for int it 0 it lt iterations it Z odnogo boku dovedetsya pidibrati konstantu i t e r a t i o n s displaystyle iterations shob zabezpechiti neobhidnu tochnist zazvichaj dosit dekilkoh soten shob dosyagti maksimalnoyi tochnosti Zate z inshogo boku chislo iteracij perestaye zalezhati vid absolyutnih velichin l displaystyle l i r displaystyle r tobto mi faktichno za dopomogoyu i t e r a t i o n s displaystyle iterations zadayemo neobhidnu vidnosnu pohibku