Лекція 13. Чисельна одновимірна оптимізація: обмежений пошук, золотий переріз і метод Брента
Коротко про лекцію
Тут мінімум шукається чисельно, коли зручної аналітичної формули немає. Ви порівняєте обмежений пошук, золотий переріз і метод Брента та навчитеся контролювати інтервал, точність і критерій зупинки.
Практичний сенс. Одновимірний чисельний пошук потрібен тоді, коли ми можемо обчислити \(f(x)\), але точний мінімізатор важко отримати вручну. Метод повинен економно вибирати пробні точки, звужувати область пошуку, зупинятися за зрозумілим критерієм і залишати після себе результат, який можна незалежно перевірити.
Постановка та базові поняття
1. Що саме шукає чисельний метод
Розглянемо задачу:
де:
Для цієї функції точна відповідь відома:
Ми спеціально беремо просту функцію, щоб мати еталон для перевірки алгоритмів. Чисельний метод при цьому поводиться так, ніби точного розв’язку він не знає. Він отримує лише можливість передавати значення \(x\) у функцію та читати відповідь \(f(x)\).
Такий режим називають роботою з функцією як із чорною скринькою. Усередині цілі може бути проста формула, симуляція, обробка файлу або дорогий інженерний розрахунок. Алгоритм не зобов’язаний знати внутрішню структуру, але кількість викликів функції може суттєво впливати на час роботи.
Чисельний результат позначатимемо через \(\hat{x}\). Це наближена оцінка мінімізатора. Для навчального прикладу можна порівняти її з точним \(x^*=2\), але в реальній задачі точне значення часто невідоме.
Одновимірні методи цього типу називають безпохідними, бо вони можуть працювати лише зі значеннями \(f(x)\). Це корисно, коли похідна недоступна, складна для реалізації або обчислюється менш надійно, ніж сама функція. Наявність похідної не робить ці методи зайвими: інколи безпохідний пошук використовується як незалежна перевірка або як внутрішній компонент складнішого алгоритму.
Потрібно також розрізняти вартість арифметики алгоритму та вартість виклику цілі. Обчислення нової координати майже завжди дешеве. Якщо ж один виклик \(f(x)\) запускає симуляцію на кілька секунд, саме кількість FUNCTION_EVALUATIONS стає головною характеристикою ефективності.
2. Інтервал пошуку та унімодальність
Для інтервального методу початковий відрізок є частиною постановки:
Його довжина:
Метод буде послідовно замінювати цей відрізок коротшим. Коректне звуження має зберігати всередині нової області бажаний мінімізатор.
Для золотого перерізу та споріднених інтервальних схем важливе припущення унімодальності. Інтуїтивно функція на заданому відрізку спадає до одного мінімуму, а потім зростає. Наскрізна парабола має саме таку поведінку на \([0,5]\).
Унімодальність потрібно пов’язувати з конкретним інтервалом. Функція може мати кілька долин на великій області, але одну долину на меншому відрізку. Тому вибір початкової локалізації іноді важливіший за вибір між двома близькими чисельними методами.
Якщо у функції кілька локальних мінімумів, правило відкидання частини інтервалу може втратити глобальну гарантію. Перед пошуком корисно використати предметні межі, грубу сітку або графік як діагностику форми.
Унімодальність не означає симетричність. Ліва й права частини функції можуть мати різну крутизну, а мінімізатор може бути зміщений до межі. Важливо лише те, що до мінімуму немає іншої долини, яка зламає логіку відкидання частини інтервалу.
Межі також можуть містити оптимум. Якщо функція монотонно спадає на всьому \([a,b]\), мінімум розташований у точці \(b\). Тому після чисельного пошуку крайні точки треба залишати у перевірці, навіть якщо алгоритм переважно працює з внутрішніми пробами.
3. Точність, допуск і результат
Чисельний метод майже ніколи не повертає математично точне число. Для еталонного прикладу помилка за координатою дорівнює:
Помилка за значенням цілі:
Якщо точний \(x^*\) невідомий, першу величину обчислити неможливо. Тоді використовують інші сертифікати: довжину фінального інтервалу, стабільність результату, локальне порівняння значень або умови оптимальності, якщо вони доступні.
Допуск — це наперед визначений поріг, пов’язаний із конкретною величиною. Наприклад, можна вимагати:
Таке правило має математичний зміст: невизначеність локалізації мінімізатора стала малою відносно заданої шкали.
Кількість цифр після коми не є окремим доказом точності. Метод може надрукувати багато цифр, але реальний критерій зупинки може бути значно грубішим. Тому у звіті варто зберігати сам допуск або інший критерій завершення.
Абсолютний допуск треба співвідносити з масштабом змінної. Похибка \(10^{-6}\) може бути надмірною для параметра, який вимірюється цілими міліметрами, і недостатньою для мікроскопічної шкали. У прикладній задачі корисно спочатку визначити, яка точність координати має предметний сенс.
Іноді використовують відносний критерій, пов’язаний із масштабом \(x\). Тоді допустиме відхилення змінюється разом із величиною параметра. Для навчального курсу головне правило просте: кожен tolerance повинен мати назву, одиниці та пояснення, яку саме невизначеність він контролює.
Математична логіка
4. Рівномірна сітка як базовий орієнтир
Найпростіша чисельна стратегія — перевірити функцію на рівномірній сітці. Для кроку:
одержуємо точки:
Серед них \(x=2\) дає найменше значення. Для нашої функції сітка випадково містить точний мінімізатор.
Проблема такого підходу полягає у вартості. На інтервалі довжини \(L\) приблизна кількість вузлів дорівнює:
Якщо потрібен крок \(10^{-5}\) на інтервалі довжини 5, маємо приблизно 500001 вузол. Для дешевої параболи це ще можливо, але для функції з дорогою симуляцією така стратегія стає неприйнятною.
Сітка також може пропустити вузьку долину між сусідніми точками. Тому вона корисна для грубої локалізації та незалежної діагностики, але спеціалізований одновимірний метод використовує обчислення значно економніше.
Приклад із сіткою корисний для розуміння різниці між роздільною здатністю та точністю оптимізатора. Якщо вузли розташовані через 0.1, сітка не може без додаткової інтерполяції локалізувати мінімізатор точніше за цей масштаб. Інтервальний метод, навпаки, концентрує нові проби біля перспективної області.
У коді грубу сітку доцільно використовувати до спеціального методу, коли початкова область велика. Спочатку вона знаходить перспективний сегмент, далі золотий переріз або метод Брента уточнює мінімізатор усередині цього сегмента. Така двоетапна схема поєднує глобальну діагностику з локальною ефективністю.
5. Ідея золотого перерізу
Метод золотого перерізу підтримує відрізок \([a,b]\) і дві внутрішні точки. Введемо коефіцієнт:
Внутрішні точки задаються так:
Для \(a=0\) та \(b=5\):
Обчислюємо:
Перше значення менше. Для унімодальної функції мінімізатор не може лежати правіше \(x_2\), тому новий інтервал:
Головна перевага золотого коефіцієнта проявляється на наступній ітерації. Одна зі старих внутрішніх точок стає внутрішньою точкою нового відрізка. Її значення функції вже відоме, тому на кожному наступному кроці зазвичай потрібен лише один новий виклик цілі.
Повторне використання значення пояснює математичну причину вибору \(\tau\) і водночас економить виклики цільової функції. Відношення частин підібране так, щоб після відкидання одного краю геометрична конфігурація нового інтервалу повторювала попередню.
На першій ітерації потрібно обчислити функцію в двох внутрішніх точках. Далі кожне звуження додає приблизно одну нову оцінку. Для дорогої функції саме ця властивість робить метод значно практичнішим за повторне незалежне тестування багатьох вузлів.

6. Чому інтервал звужується передбачувано
Після кожної ітерації довжина відрізка зменшується приблизно в \(\tau\) разів:
Тому після \(k\) звужень:
Ця формула дозволяє оцінити кількість ітерацій ще до запуску. Якщо потрібно:
то достатньо вибрати \(k\), для якого:
Після логарифмування:
Оскільки \(\ln\tau<0\), знак нерівності вже врахований у цій формі через обидва від’ємні чисельник і знаменник для малого \(\varepsilon\).
Метод Фібоначчі використовує подібну інтервальну логіку, але заздалегідь прив’язує точки до заданої кількості кроків через числа Фібоначчі. У сучасній програмній практиці золотий переріз простіший для пояснення та не потребує наперед фіксованого числа ітерацій. Метод Фібоначчі все одно корисний як історично й математично близький спосіб побудови економного пошуку.
Якщо кількість оцінок функції жорстко обмежена наперед, схема Фібоначчі має природну інтерпретацію. Вона розподіляє майбутні звуження відповідно до наявного бюджету. Золотий переріз можна розглядати як стаціонарний аналог, у якому однакове відношення використовується на кожному кроці.
Для студентської практики немає потреби вручну обчислювати довгі таблиці чисел Фібоначчі. Важливіше зрозуміти спільну ідею: алгоритм вибирає точки так, щоб після порівняння зберегти якомога більше вже отриманої інформації.

7. Логіка методу Брента
Метод Брента поєднує надійність інтервального пошуку з швидшими інтерполяційними кроками. Коли локальна форма функції дозволяє, алгоритм намагається запропонувати нову точку через параболічну інтерполяцію. Якщо такий крок виглядає ненадійним, алгоритм повертається до захищеного інтервального кроку.
Це важлива інженерна ідея: швидкий локальний прогноз використовується лише тоді, коли не руйнує надійність пошуку. Через це метод Брента часто є практичним вибором для гладких одновимірних задач без доступної похідної.
У SciPy треба розрізняти параметри bounds і bracket. bounds=(a,b) у режимі bounded задає жорстку допустиму область. bracket для методів brent або golden передає стартову локалізацію, яка виконує іншу роль і не є універсальним замінником фізичних меж.
Якщо модель вимагає:
і вихід за цей інтервал математично або фізично заборонений, доцільно використовувати режим, який підтримує ці межі як частину постановки.
Це особливо важливо, якщо функція поза допустимою областю взагалі не має предметного змісту. Наприклад, симуляція може аварійно завершуватися для від’ємної товщини або температури поза технологічним діапазоном. Тоді алгоритмічна локалізація повинна узгоджуватися з доменом самої моделі.
bracket варто читати як інформацію про розташування долини, а не як універсальне обмеження змінної. Така різниця між математичною областю та стартовою інформацією API є типовою для оптимізаційних бібліотек. Її треба пояснювати до запуску коду.
Алгоритм і покроковий розбір
8. Узагальнений інтервальний алгоритм
Інтервальний пошук можна описати через повторюваний цикл. Спочатку маємо відрізок \([a,b]\), який містить бажаний мінімізатор. Далі обираємо внутрішні точки та порівнюємо значення функції.
Якщо:
для унімодальної функції відкидаємо праву частину після \(x_2\). Якщо:
відкидаємо ліву частину до \(x_1\). За рівних значень можна звузити відрізок симетрично або застосувати правило конкретного алгоритму.
Після звуження перевіряємо критерій зупинки. Якщо відрізок ще надто широкий, будуємо наступні внутрішні точки та повторюємо цикл.
У псевдокоді логіка виглядає так:
отримати [a, b]
поки довжина інтервалу більша за допуск:
вибрати внутрішні точки
обчислити потрібні значення f
відкинути частину інтервалу
повернути оцінку мінімізатора
Ключовий інваріант: за виконання припущень шуканий мінімізатор залишається всередині поточного інтервалу.
Саме інваріант дозволяє перевіряти алгоритм покроково. Після кожного оновлення можна контролювати, чи нові межі впорядковані, чи довжина інтервалу зменшилася та чи внутрішні точки лежать між \(a\) і \(b\). Для навчального прикладу, де \(x^*=2\) відомий, додатково можна переконуватися, що 2 не було випадково відкинуто.
Такі перевірки дуже корисні під час власної реалізації золотого перерізу. Якщо інтервал раптом збільшується або внутрішня точка виходить за межі, помилка виникла в оновленні координат, а не в самій цільовій функції.
9. Критерії зупинки
Найпрозоріший критерій для навчального інтервального методу:
Він контролює невизначеність за координатою. Якщо потрібна лише точність значення функції, можна додатково стежити за зміною цілі:
Такий критерій слід застосовувати обережно. На дуже пласкій функції значення цілі може майже не змінюватися навіть тоді, коли координата ще визначена грубо.
Ще один захисний критерій — максимальна кількість ітерацій або обчислень функції. Він не доводить збіжність, але захищає програму від нескінченного циклу при неправильній постановці або помилці реалізації.
У звіті варто розділяти TOLERANCE, ITERATIONS і FUNCTION_EVALUATIONS. Це різні характеристики: перша задає бажану точність, друга показує кількість циклів, третя відображає реальну вартість роботи з функцією.
Для золотого перерізу число ітерацій та число нових оцінок після старту близькі, бо одна проба повторно використовується. Для іншого алгоритму одна ітерація може містити кілька викликів функції. Тому ITERATIONS не можна автоматично трактувати як вартість алгоритму.
Якщо функція є випадковою або шумною, одна оцінка теж може бути недостатньою. Тоді фактична вартість включає кілька повторів у тій самій точці. У такій постановці критерій зупинки треба узгодити з рівнем статистичної невизначеності.
10. Покроковий розрахунок першої ітерації
Для золотого перерізу починаємо з:
та:
Отримуємо:
Далі:
Оскільки:
новий інтервал:
Його довжина:
і співвідношення:
збігається із золотим коефіцієнтом. Наступна ітерація повторює ту саму логіку та використовує одне вже відоме значення функції.
Програмна реалізація та перевірка
11. Обмежений пошук у SciPy
Спочатку зафіксуємо відповідність між математикою та API.
| Математика | Python | Зміст |
|---|---|---|
| \(f(x)\) | objective(x) |
цільова функція |
| \([a,b]\) | bounds=(a, b) |
жорсткий допустимий відрізок |
| \(\hat{x}\) | result.x |
чисельна оцінка мінімізатора |
| \(f(\hat{x})\) | result.fun |
значення цілі |
| статус | result.success |
службова ознака завершення |
Приклад:
from scipy.optimize import minimize_scalar
# Ця функція точно повторює навчальну ціль f(x)=(x-2)^2+1.
def objective(x):
return (x - 2.0) ** 2 + 1.0
# bounds є частиною математичної постановки: шукаємо тільки на [0,5].
result = minimize_scalar(
objective,
bounds=(0.0, 5.0),
method="bounded",
options={
"xatol": 1e-8,
},
)
# Координату, значення цілі та статус читаємо як різні величини.
print("X:", result.x)
print("OBJECTIVE:", result.fun)
print("SUCCESS:", result.success)
print("NFEV:", result.nfev)
Очікуємо координату, близьку до 2, значення цілі, близьке до 1, та успішний статус.
Параметр xatol задає числовий допуск для координати в конкретному API. Його не слід інтерпретувати як гарантію абсолютної математичної похибки в довільній задачі. Значення результату все одно треба перевірити незалежно.
Поле success також має обмежений зміст. Воно повідомляє, що алгоритм завершився відповідно до внутрішнього контракту бібліотеки. Воно не підтверджує, що студент правильно записав функцію, обрав предметні межі або використав правильні одиниці.
Тому після success=True аудит лише починається. Потрібно повторно обчислити ціль, перевірити координату, прочитати службове повідомлення та зіставити результат із математичними очікуваннями задачі.
12. Порівняння golden, brent і bounded
Для навчальної функції можна порівняти кілька режимів:
from scipy.optimize import minimize_scalar
def objective(x):
return (x - 2.0) ** 2 + 1.0
# bounded використовує жорсткі межі як частину постановки.
bounded_result = minimize_scalar(
objective,
bounds=(0.0, 5.0),
method="bounded",
)
# Для golden і brent передаємо стартову локалізацію через bracket.
# Це інший контракт API, тому не ототожнюємо bracket із bounds.
golden_result = minimize_scalar(
objective,
bracket=(0.0, 2.0, 5.0),
method="golden",
)
brent_result = minimize_scalar(
objective,
bracket=(0.0, 2.0, 5.0),
method="brent",
)
# Порівнюємо координату, значення цілі та кількість оцінок функції.
for name, result in [
("bounded", bounded_result),
("golden", golden_result),
("brent", brent_result),
]:
print(
name,
result.x,
result.fun,
result.nfev,
)
Для цієї простої параболи всі три режими повинні знайти точку поблизу 2. Кількість оцінок функції та останні десяткові цифри можуть відрізнятися.
Таке порівняння не повинно перетворюватися на змагання «який метод надрукував більше дев’яток». Коректний критерій включає близькість цілі до 1, допустимість координати, кількість оцінок функції та виконання припущень методу.
Якщо два методи повертають різні точки, але значення цілі практично однакові, причиною може бути пласка область біля мінімуму. Тоді координата визначається гірше, ніж сама ціль. Це важливий приклад того, чому \(r_x\) і \(r_f\) описують різні аспекти точності.
Таке порівняння має сенс лише після перевірки контракту кожного режиму. Якщо фізичні межі є обов’язковими, bounded прямо відповідає постановці. golden і brent у цьому прикладі використовуються для алгоритмічного порівняння на функції, де ми наперед знаємо коректну локалізацію.
13. Незалежна перевірка результату
Після отримання \(\hat{x}\) спочатку перевіряємо межі:
Далі повторно обчислюємо ціль власною функцією:
і порівнюємо з result.fun. Різниця повинна бути чисельно малою.
Для малого \(\delta\) можна перевірити сусідні точки:
Якщо всі точки допустимі, значення в центрі повинно бути не більшим за сусідні в межах обраного допуску.
Для навчального прикладу є ще сильніша перевірка: точне значення \(x^*=2\). Тому можемо обчислити:
та:
Мінімальний блок результату:
STATUS: success
X: ...
OBJECTIVE: ...
BOUNDS_OK: True
COORDINATE_ERROR: ...
OBJECTIVE_ERROR: ...
FUNCTION_EVALUATIONS: ...
Такий формат відділяє результат розв’язувача від наших незалежних перевірок.
Якщо точний еталон невідомий, поля COORDINATE_ERROR та OBJECTIVE_ERROR замінюють доступними діагностиками. Наприклад, можна зберегти FINAL_INTERVAL_WIDTH, NEIGHBOR_CHECK та різницю між двома незалежними методами. Важливо, щоб кожне поле мало визначений математичний зміст.
Для відтворюваності слід також зберегти самі межі пошуку й параметри допуску. Число \(\hat{x}=2.01\) без інформації про початковий інтервал та критерій завершення не дозволяє оцінити якість обчислення.
Корисною є перевірка чутливості до стартової локалізації. Якщо трохи змінити початковий інтервал, але залишити всередині ту саму унімодальну долину, результат повинен залишитися близьким у межах допуску. Сильна зміна відповіді після малого зсуву меж може вказувати на кілька локальних мінімумів або на проблемну постановку.
Ще одна перевірка — повторний запуск із жорсткішим допуском. Якщо координата й значення цілі стабілізуються, це підтримує чисельний результат. Якщо кількість оцінок різко зростає, а ціль майже не змінюється, подальше уточнення може не мати практичного сенсу.
Такі експерименти не замінюють теорію, але допомагають зрозуміти, наскільки результат залежить від параметрів алгоритму. У прикладній роботі ця інформація часто важливіша за ще кілька надрукованих десяткових цифр.
Інтерпретація, межі та підсумок
14. Де чисельний пошук може підвести
Перша проблема — неправильно вибраний інтервал. Якщо бажаний мінімізатор лежить поза \([a,b]\), коректний обмежений алгоритм все одно поверне найкращу точку лише всередині заданої області. Тому межі треба обґрунтовувати предметно або математично.
Друга проблема — порушення унімодальності. Золотий переріз робить висновок про відкидання частини інтервалу зі структури однієї долини. Для багатомодальної функції така логіка може привести до локального результату.
Третя проблема — шум. Якщо два значення функції відрізняються менше за випадкові коливання моделі, правило порівняння стає нестабільним. Тоді потрібні повторні вимірювання, згладжування або критерій, який враховує рівень шуму.
Четверта проблема — занадто раннє округлення. Координату варто перевіряти у повній доступній чисельній точності, а форматувати для читання вже після аудиту.
П’ята проблема — механічне порівняння методів за останньою цифрою. Практично важливішими є допустимість, значення цілі, критерій зупинки, кількість оцінок функції та стійкість результату.
Інтерактивна самоперевірка лекції
Пройдіть 10 коротких питань. Після кожної відповіді ви побачите пояснення, а за потреби — підказку й повний розбір.
15. Підсумок
Одновимірний чисельний метод шукає наближення до мінімізатора через послідовні обчислення \(f(x)\). Початковий інтервал, припущення про форму функції та критерій зупинки входять до алгоритмічної постановки. Сітка дає простий орієнтир, але швидко стає дорогою зі зростанням вимог до точності. Для дорогої симуляції кількість оцінок функції часто важливіша за кількість арифметичних операцій самого алгоритму.
Золотий переріз економно звужує інтервал і повторно використовує одну вже обчислену внутрішню точку. Метод Брента додає швидші інтерполяційні кроки, зберігаючи захищену логіку пошуку. У SciPy bounds і bracket мають різний математичний зміст, тому їх потрібно пояснювати окремо. Якщо фізичні межі є частиною моделі, режим bounded прямо зберігає цю постановку.
Для наскрізної задачі \(f(x)=(x-2)^2+1\) на \([0,5]\) коректні методи повертають точку поблизу \(x^*=2\) та значення цілі поблизу 1. Остаточна перевірка включає статус, допустимість, повторний розрахунок цілі, сусідні точки та доступний числовий сертифікат. Коли точний еталон відомий, додатково обчислюють помилку координати й значення цілі.
Практичне порівняння методів варто завершувати таблицею з \(x\), \(f(x)\), допуском і кількістю оцінок функції. Така таблиця дозволяє побачити, чи додаткова точність справді виправдовує додаткові обчислення. Для серії однотипних задач це також дає зрозумілу основу для вибору стандартного методу й параметрів у навчальному або виробничому коді. Рішення стає відтворюваним і порівнюваним між запусками. Це особливо корисно, коли одну модель тестують на кількох варіантах вхідних даних або різних допустимих інтервалах.
За однакової практичної точності менша кількість оцінок є вагомою перевагою, особливо для дорогих симуляцій. Ті самі принципи повернуться в багатовимірній оптимізації: одновимірною змінною стане довжина кроку \(\alpha\) уздовж уже вибраного напряму, а результат знову потребуватиме критерію зупинки й незалежної перевірки.