Перейти до змісту

Лекція 11. Функції однієї змінної та екстремуми

Коротко про лекцію

Починаємо нелінійну оптимізацію з функції однієї змінної. Ви розберете область допустимих значень, локальні та глобальні екстремуми й навчитеся читати графік функції як задачу пошуку найкращого режиму.

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

Постановка та базові поняття

1. Один керований параметр і одна цільова функція

Почнемо з простої прикладної ситуації. Нехай технологічний режим визначається одним числом \(x\). Для кожного допустимого \(x\) ми можемо обчислити втрати, витрати або інший показник якості. Позначимо цей показник через \(f(x)\).

Тоді задача мінімізації записується коротко:

\[ \min_x f(x) \]

Запис ще не є повною моделлю. Потрібно також визначити, які значення \(x\) дозволені. Наприклад, якщо технологічний параметр повинен лежати між 0 і 10, додаємо:

\[ 0\le x\le10 \]

Функція \(f\) перетворює значення аргументу на значення критерію. Аргумент \(x\) відповідає на запитання «що ми обираємо?». Значення \(f(x)\) відповідає на запитання «наскільки добрим є цей вибір за нашим критерієм?».

У цій лекції основним прикладом буде функція:

\[ f(x)=(x-3)^2+2 \]

Таку формулу можна читати як просту модель втрат. Значення 3 задає бажаний режим, а квадрат вимірює величину відхилення від нього без урахування знака. Відхилення на \(+1\) і \(-1\) дають однаковий штраф. Відхилення на 2 одиниці створює штраф у чотири рази більший.

Якщо \(x\) вимірюється в градусах, вираз \((x-3)^2\) має квадратні одиниці. У реальній моделі перед квадратом часто стоїть коефіцієнт, який переводить відхилення у вартість або інший критерій. Тому навіть просту навчальну функцію корисно читати разом із предметним змістом коефіцієнтів.

Одновимірна задача не обов’язково є малою за кількістю даних. Функція \(f(x)\) може всередині обробляти великий набір спостережень або запускати складну симуляцію. Одновимірність означає лише те, що алгоритм вибирає одне числове значення \(x\).

Її можна уявити як штраф за відхилення параметра від бажаного значення 3. Вираз \((x-3)^2\) зростає, коли \(x\) віддаляється від 3. Додавання сталої 2 піднімає всі значення функції вгору, але не змінює положення найкращої точки.

2. Аргумент, значення функції та допустима область

У математичному записі важливо не змішувати три різні об’єкти. Перший — аргумент \(x\). Другий — значення функції \(f(x)\). Третій — область, у якій дозволено шукати рішення.

Для всієї дійсної осі можна записати:

\[ x\in\mathbb{R} \]

Для обмеженої задачі область може бути відрізком:

\[ x\in[a,b] \]

У прикладній моделі область задає фізичні, економічні або технологічні межі. Якщо температура не може бути від’ємною, значення \(x<0\) слід виключити ще на етапі постановки. Якщо параметр дозволено змінювати лише між 0 і 2, точка \(x=3\) стає недопустимою. Формула \(f(x)\) при цьому не змінюється.

Для наскрізного прикладу розглядатимемо дві постановки. Перша:

\[ \min_{x\in\mathbb{R}}(x-3)^2+2 \]

Друга:

\[ \min_{0\le x\le2}(x-3)^2+2 \]

Формула цільової функції однакова. Допустимі області різні, тому оптимальні рішення також можуть відрізнятися.

Тут корисно розрізняти область визначення функції та допустиму область оптимізаційної задачі. Перша відповідає на запитання, де математичний вираз узагалі має зміст. Друга задає, які значення дозволені конкретною моделлю.

Наприклад, функція \(f(x)=(x-3)^2+2\) визначена для всіх дійсних \(x\). Проте технологічне правило може дозволяти тільки \(0\le x\le2\). У такій ситуації область визначення ширша за допустиму область. Оптимізаційний алгоритм повинен працювати з другою множиною.

Це розділення стає особливо важливим у програмі. Функція Python може технічно обчислити значення при \(x=100\). Проте модель із областю \([0,2]\) повинна відкинути таку точку.

Парабола та її глобальний мінімум

Графік допомагає побачити форму функції, але він не замінює математичну постановку. На рисунку можна намалювати ширшу область, ніж дозволяє модель. Саме формула області визначає, які точки є кандидатами на рішення.

3. Мінімізатор і мінімальне значення

У задачі оптимізації треба розрізняти точку рішення та значення цілі в цій точці. Мінімізатор — це допустиме значення аргументу, де функція досягає найменшого значення. Його позначають через \(x^*\).

Для наскрізної функції на всій дійсній осі:

\[ x^*=3 \]

Мінімальне значення дорівнює:

\[ f(x^*)=f(3)=2 \]

Ці записи відповідають на різні запитання. \(x^*=3\) означає «оптимальне значення керованого параметра дорівнює 3». Запис \(f(x^*)=2\) означає «за цього параметра критерій має значення 2».

У студентському звіті корисно подавати обидві величини окремо:

MINIMIZER: 3
MINIMUM_VALUE: 2

Якщо задача предметна, до них додають одиниці вимірювання. Наприклад, мінімізатор може вимірюватися в градусах, а значення цілі — у гривнях. Без такого розділення число «3» або «2» важко правильно інтерпретувати.

Для задачі максимізації використовують аналогічні поняття: максимізатор і максимальне значення. Мінімум і максимум разом називають екстремумами. У цій лекції основний акцент робимо на мінімізації, бо далі вона напряму переходить у чисельні методи оптимізації.

Максимізацію можна формально перетворити на мінімізацію зміною знака. Задача:

\[ \max_x g(x) \]

еквівалентна задачі:

\[ \min_x \bigl(-g(x)\bigr) \]

Точка оптимуму при такому перетворенні зберігається, а знак оптимального значення змінюється. Цей прийом часто використовують бібліотеки та математичні моделі, де зручніше підтримувати один напрям оптимізації.

У звіті предметне значення краще повертати до початкового змісту. Якщо ми максимізували прибуток через мінімізацію його від’ємного значення, фінальна інтерпретація повинна знову говорити про прибуток, а не про «мінімальну від’ємну ціль».

Математична логіка

4. Глобальний і локальний екстремум

Глобальний мінімізатор є найкращим на всій заявленій допустимій області. Формально точка \(x^*\) є глобальним мінімізатором на множині \(D\), якщо:

\[ f(x^*)\le f(x) \]

для всіх:

\[ x\in D \]

Локальний мінімізатор має слабшу властивість. Він є найкращим лише серед достатньо близьких допустимих точок. Іншими словами, існує деякий малий окіл, у якому значення функції в \(x^*\) не більше за сусідні значення.

У простої параболи \((x-3)^2+2\) точка \(x=3\) одночасно є локальним і глобальним мінімізатором. Однак для складнішої функції може існувати кілька локальних долин. Одна з них буде найнижчою глобально, а інші залишаться локальними мінімумами.

Для максимуму логіка симетрична. Наприклад, функція:

\[ g(x)=-(x-1)^2+5 \]

має глобальний максимум у точці:

\[ x=1 \]

бо квадрат невід’ємний, а знак мінус робить відхилення від 1 штрафом у напрямі зменшення значення \(g(x)\).

Різниця між локальним і глобальним екстремумом важлива для чисельної оптимізації. Багато алгоритмів використовують локальну інформацію про функцію. Тому знайдена стаціонарна точка ще не завжди дає глобальний результат.

Для локального мінімуму важливе слово «окіл». Ми порівнюємо кандидата з достатньо близькими допустимими точками, а не з усією областю. Якщо функція має кілька долин, кожна з них може містити локальний мінімум. Лише найнижча допустима долина дає глобальний мінімум.

У прикладній задачі ця різниця впливає на інтерпретацію. Локально найкращий режим може бути стабільним щодо малих змін параметра, але далеко від нього може існувати значно кращий режим. Чисельний метод, який стартує поблизу різних долин, іноді повертає різні локальні розв’язки.

5. Чи завжди мінімум існує і чи завжди він єдиний

Функція може мати нижню межу значень, але не досягати її. Розглянемо:

\[ f(x)=x \]

на відкритому інтервалі:

\[ 0<x<1 \]

Можна брати \(x=0.1\), потім \(0.01\), потім \(0.001\) і отримувати дедалі менші значення. Проте точка \(x=0\) не входить до допустимої області. Тому мінімізатора немає.

Число 0 є нижньою межею значень цієї функції на заданій області. Для базового курсу достатньо запам’ятати практичний висновок: тип межі має значення. Умови \(0\le x\le1\) і \(0<x<1\) описують різні оптимізаційні задачі.

Мінімізатор також не обов’язково єдиний. Розглянемо:

\[ h(x)=(x^2-1)^2 \]

Квадрат невід’ємний:

\[ h(x)\ge0 \]

Рівність виконується у двох точках:

\[ x=-1 \]

та:

\[ x=1 \]

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

Такий випадок важливий для автоматичної перевірки. Порівняння лише з одним еталонним значенням \(x\) може відхилити коректну відповідь. Надійніша перевірка оцінює допустимість точки та значення цільової функції з числовим допуском.

Для неперервної функції на закритому відрізку існує корисний фундаментальний результат: якщо функція неперервна, вона досягає на цьому відрізку і мінімального, і максимального значення. У цій лекції достатньо використовувати його як орієнтир. Повний математичний доказ цього твердження виходить за межі поточної теми.

Практичний наслідок дуже важливий. На закритому відрізку \([a,b]\) межі є допустимими точками, тому їх потрібно враховувати під час пошуку екстремуму. На відкритому інтервалі крайні значення можуть залишатися недосяжними, як у прикладі з \(0<x<1\).

6. Область пошуку може змінити оптимум

Повернімося до наскрізної функції:

\[ f(x)=(x-3)^2+2 \]

На всій дійсній осі найкраща точка дорівнює 3. Тепер обмежимо область:

\[ 0\le x\le2 \]

Точка \(x=3\) уже недопустима. На відрізку \([0,2]\) значення \(x\) наближається до 3, коли рухається вправо. Тому найкращою допустимою точкою є права межа:

\[ x^*=2 \]

Перевіримо значення цілі:

\[ f(2)=(2-3)^2+2=3 \]

На лівій межі:

\[ f(0)=(0-3)^2+2=11 \]

Для будь-якого \(x\in[0,2]\) маємо:

\[ 1\le3-x\le3 \]

Тому:

\[ (3-x)^2\ge1 \]

а отже:

\[ f(x)\ge3 \]

Рівність досягається при \(x=2\). Це вже повний доказ глобального мінімуму на відрізку \([0,2]\).

Мінімум на обмеженому відрізку

Цей приклад показує фундаментальну ідею курсу: оптимум визначається функцією разом із допустимою областю. Якщо змінити область, старий мінімізатор потрібно перевірити заново.

Для загальної квадратичної функції виду:

\[ q(x)=a(x-c)^2+d \]

за умови \(a>0\) точка \(x=c\) є глобальним мінімізатором на всій дійсній осі. Значення \(d\) визначає висоту мінімуму, а коефіцієнт \(a\) — крутизну параболи. Додатний множник \(a\) не змінює координату мінімізатора.

Якщо область обмежити відрізком, який не містить \(c\), оптимум переходить до тієї межі, що розташована ближче до \(c\). Цю логіку можна зрозуміти як мінімізацію квадрату відстані до точки \(c\). Така геометрична інтерпретація буде корисною й у багатовимірних задачах.

Алгоритм і покроковий розбір

7. Як правильно прочитати одновимірну задачу

Перед будь-яким обчисленням корисно розкласти задачу на чотири частини. Спочатку визначаємо змінну рішення. Далі записуємо цільову функцію. Після цього фіксуємо напрям оптимізації та допустиму область.

Для прикладу:

\[ \min_{0\le x\le2}(x-3)^2+2 \]

отримуємо:

  • змінна рішення — \(x\);
  • цільова функція — \((x-3)^2+2\);
  • напрям — мінімізація;
  • допустима область — \([0,2]\).

Після цього визначаємо тип доступної інформації. Іноді формула одразу показує екстремум. Для параболи достатньо властивості квадрата. Для іншої функції може знадобитися похідна, спеціальний чисельний метод або комбінація кількох перевірок.

Далі формуємо кандидатів. На закритому відрізку межі області завжди треба враховувати як повноцінні допустимі точки. Якщо пізніше похідна дасть внутрішні стаціонарні точки, їх порівнюватимемо разом із межами.

Завершальний крок — перевірка. Для знайденого кандидата окремо перевіряють допустимість, значення цільової функції та математичний аргумент оптимальності.

Корисно також зафіксувати порядок перевірки. Спочатку перевіряємо область, бо недопустимий кандидат одразу відкидається. Далі повторно обчислюємо цільову функцію. Після цього формулюємо аргумент, чому серед інших допустимих точок немає кращого значення.

Цей порядок запобігає типовій помилці: студент знаходить красиву точку для формули й лише в кінці помічає, що вона лежить поза дозволеним інтервалом. У складніших задачах та сама дисципліна перетвориться на перевірку системи обмежень і нев’язок.

8. Ручний розбір наскрізної функції

Спочатку розв’яжемо задачу на всій дійсній осі:

\[ \min_{x\in\mathbb{R}}(x-3)^2+2 \]

Квадрат не може бути від’ємним:

\[ (x-3)^2\ge0 \]

Тому:

\[ f(x)\ge2 \]

Щоб отримати рівність, потрібно:

\[ (x-3)^2=0 \]

звідси:

\[ x=3 \]

Отже:

\[ x^*=3 \]

та:

\[ f(x^*)=2 \]

Тепер розглянемо обмежену постановку:

\[ \min_{0\le x\le2}(x-3)^2+2 \]

Старий мінімізатор 3 не належить допустимій області. На всьому відрізку \([0,2]\) число \(x\) лежить ліворуч від 3. Чим ближче \(x\) до 3, тим менший квадрат відстані \((x-3)^2\).

Найближчою допустимою точкою до 3 є права межа \(x=2\). Тому:

\[ x^*=2 \]

і:

\[ f(x^*)=3 \]

Така логіка зручна для першого знайомства з оптимізацією. Вона показує, що обмеження можуть перетворити внутрішній мінімізатор на недопустиму точку й перенести оптимум на межу.

Ручний розбір також показує, чому не варто одразу запускати бібліотечний метод. Для простої функції структура формули дає точний результат швидше й зрозуміліше. Чисельний алгоритм стає потрібним тоді, коли така структура відсутня або її важко використати безпосередньо.

Перед переходом до коду корисно записати результат повністю:

\[ x^*=2, \qquad f(x^*)=3 \]

разом із областю:

\[ x\in[0,2] \]

Так три ключові частини відповіді — область, точка й значення цілі — залишаються явно пов’язаними.

9. Таблиця та числова сітка як орієнтир

Для першої діагностики можна обчислити кілька значень:

\(x\) \(f(x)\)
0 11
1 6
2 3
3 2
4 3
5 6

Таблиця показує спадання до точки 3 і подальше зростання. Проте вона перевіряє лише вибрані аргументи. Між двома рядками таблиці існує нескінченно багато дійсних значень.

Числова сітка робить перевірку щільнішою, але не усуває принципову проблему. Якщо крок сітки дорівнює \(h\), справжній мінімізатор може лежати між сусідніми вузлами. Зменшення \(h\) збільшує кількість обчислень.

Для інтервалу довжини \(L=b-a\) приблизна кількість вузлів дорівнює:

\[ N\approx\frac{L}{h}+1 \]

Якщо \(L=10\) і \(h=0.1\), потрібно приблизно 101 значення. Для \(h=0.0001\) уже потрібно близько 100001 значення.

Тому сітка добре підходить для візуальної або незалежної перевірки маленької задачі. Спеціальні одновимірні методи використовують інформацію про функцію ефективніше. До них курс перейде в лекції 13.

Є ще одна причина не ототожнювати сітку з доказом. Якщо функція має вузьку глибоку долину між двома вузлами, грубий перебір може її повністю пропустити. Збільшення кількості точок зменшує цей ризик, але не дає універсальної гарантії для довільної функції.

Сіткова перевірка має найбільшу цінність тоді, коли ми вже маємо незалежний теоретичний або чисельний результат. Вона допомагає побачити грубу помилку в реалізації, неправильний знак, неправильну область або випадкове зміщення координат.

Програмна реалізація та перевірка

10. Від математичного запису до Python

Спочатку зафіксуємо відповідність між математикою та кодом.

Математика Python Зміст
\(x\) x значення аргументу
\(f(x)\) objective(x) значення цільової функції
\(x^*\) minimizer знайдений мінімізатор
\(f(x^*)\) minimum_value значення цілі в мінімізаторі
\(x\in[a,b]\) lower <= x <= upper перевірка допустимості

Для необмеженого наскрізного прикладу результат можна перевірити коротким кодом:

# Ця функція точно повторює математичну формулу f(x)=(x-3)^2+2.
def objective(x: float) -> float:
    return (x - 3.0) ** 2 + 2.0


# Аналітичний розбір показав, що квадрат зануляється при x=3.
# Зберігаємо координату окремо від значення цільової функції.
minimizer = 3.0

# Повторно обчислюємо f(x*) тією самою функцією, яка використовується в коді.
minimum_value = objective(minimizer)

# Виводимо дві різні математичні величини окремими полями.
print("MINIMIZER:", minimizer)
print("MINIMUM_VALUE:", minimum_value)

Очікуваний результат:

MINIMIZER: 3.0
MINIMUM_VALUE: 2.0

Код не створює математичний доказ. Він повторно обчислює значення й допомагає перевірити, що формула правильно перенесена в програму.

У навчальному коді важливо зберігати назви, які відображають математичний зміст. minimizer краще за абстрактне a, а minimum_value краще за res2. Так студент бачить зв’язок між формулою, результатом і програмною змінною без додаткового перекладу.

Також корисно уникати прихованого округлення. Якщо алгоритм повертає \(2.9998\), а програма відразу друкує 3, ми втрачаємо інформацію про реальний чисельний результат. Округлене значення можна показати для людини, але перевірку потрібно виконувати за початковим числом.

11. Сіткова перевірка обмеженої задачі

Тепер перевіримо задачу на відрізку \([0,2]\). Для цього використаємо рівномірну сітку.

import numpy as np


# Формула підтримує як окреме число, так і масив NumPy.
def objective(x):
    return (x - 3.0) ** 2 + 2.0


lower = 0.0
upper = 2.0

# Будуємо 201 точку від 0 до 2 включно.
# Крок дорівнює 0.01, тому права межа x=2 входить до сітки точно.
grid = np.linspace(
    lower,
    upper,
    201,
)

# Для кожного вузла обчислюємо значення тієї самої цільової функції.
values = objective(grid)

# argmin повертає індекс найменшого значення серед перевірених вузлів.
best_index = np.argmin(values)
grid_minimizer = grid[best_index]
grid_minimum = values[best_index]

# Окремо перевіряємо, що знайдений кандидат не вийшов за допустимі межі.
is_feasible = (
    lower <= grid_minimizer <= upper
)

print("MINIMIZER:", grid_minimizer)
print("MINIMUM_VALUE:", grid_minimum)
print("FEASIBLE:", is_feasible)

Очікувано:

MINIMIZER: 2.0
MINIMUM_VALUE: 3.0
FEASIBLE: True

Сіткова перевірка узгоджується з ручним доказом. Проте сильнішим аргументом залишається нерівність \(f(x)\ge3\) для всіх \(x\in[0,2]\).

Для складнішої функції можна додатково перевірити сусідні точки. Така перевірка підтримує локальний висновок, але сама не доводить глобальність.

Наприклад, для кандидата \(x_c\) можна обрати невелике \(\delta>0\) та порівняти:

\[ f(x_c-\delta), \qquad f(x_c), \qquad f(x_c+\delta) \]

якщо всі три точки допустимі. Центральне значення, яке не перевищує сусідні, підтримує гіпотезу про локальний мінімум. Для кандидата на межі двобічна перевірка неможлива, тому потрібно враховувати лише допустимий напрям.

Саме така ситуація виникає для \(x^*=2\) на відрізку \([0,2]\). Точка \(2+\delta\) уже недопустима. Тому локальну поведінку треба оцінювати зліва, а глобальний висновок підтверджувати окремим аргументом для всього відрізка.

12. Який результат варто зберігати

Навіть для простої задачі корисно формувати результат у стабільному форматі:

STATUS: OK
DOMAIN: [0, 2]
MINIMIZER: 2
MINIMUM_VALUE: 3
FEASIBLE: True
VERIFICATION: analytic_and_grid

Поле DOMAIN нагадує, для якої саме постановки отримано відповідь. Без нього число MINIMIZER: 2 легко переплутати з результатом необмеженої задачі, де мінімізатор дорівнює 3.

Поле FEASIBLE відокремлює перевірку області від значення цілі. Це важливо в складніших задачах: кандидат може мати привабливу ціль, але порушувати обмеження.

Поле VERIFICATION показує, яким способом результат було перевірено. У нашому прикладі є аналітичний доказ і сіткова діагностика. Для наступних тем до такого звіту додадуться похідні, числові допуски та статуси бібліотечних методів.

Якщо чисельний метод повертає наближений результат, до звіту варто додати допуск. Наприклад, значення \(x=3.0000001\) може вважатися узгодженим із точним мінімізатором 3 у межах заданої точності. Допуск повинен бути названий і застосовуватися до конкретної перевірки.

У задачі з кількома правильними мінімізаторами перевірка координати потребує особливої обережності. Надійніше перевірити, що кандидат допустимий і його значення цілі практично збігається з відомим оптимальним значенням.

Інтерпретація, межі та підсумок

13. Типові помилки та межі простих перевірок

Перша типова помилка — називати число \(x^*\) мінімумом функції без уточнення. Коректніше говорити, що \(x^*\) є мінімізатором, а \(f(x^*)\) — мінімальним значенням. Такий поділ особливо важливий, коли ці величини мають різні одиниці вимірювання.

Друга помилка — ігнорувати допустиму область. Для функції \((x-3)^2+2\) точка 3 є глобальним мінімізатором на \(\mathbb{R}\), але вона недопустима на \([0,2]\). Після зміни області стару відповідь потрібно перевірити заново.

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

Четверта помилка — сприймати графік як точний доказ. Масштаб осей може приховати дрібні деталі, а на рисунку відображається лише скінченна область. Графік корисний як візуальна модель, після якої результат потрібно підтвердити числами або формулами.

П’ята помилка — забувати про можливість кількох оптимальних точок або відсутність мінімізатора. Приклад \((x^2-1)^2\) має два глобальні мінімізатори, а функція \(f(x)=x\) на відкритому інтервалі \((0,1)\) не досягає свого інфімуму.

Інтерактивна самоперевірка лекції

Пройдіть 10 коротких питань. Після кожної відповіді ви побачите пояснення, а за потреби — підказку й повний розбір.

14. Підсумок

Функція однієї змінної пов’язує керований параметр \(x\) зі значенням критерію \(f(x)\). Оптимізаційна задача визначається формулою функції разом із допустимою областю та напрямом оптимізації. Через це одна й та сама формула може мати різні оптимальні рішення після зміни меж.

Мінімізатор \(x^*\) і мінімальне значення \(f(x^*)\) описують різні характеристики результату. Для наскрізної функції \((x-3)^2+2\) на всій дійсній осі маємо \(x^*=3\) і \(f(x^*)=2\). На відрізку \([0,2]\) старий мінімізатор стає недопустимим, тому оптимум переходить на праву межу: \(x^*=2\) і \(f(x^*)=3\).

Локальний екстремум описує поведінку в околі, а глобальний порівнює кандидата з усією допустимою областю. Додатково треба враховувати існування та можливу неєдиність оптимуму. Саме тому графік, таблиця або сітка є корисними діагностичними засобами, але не універсальними доказами.

У цій лекції мінімум знаходився зі структури простої квадратичної формули. Наступна лекція вводить похідну як числовий опис локальної зміни функції. Після цього стане можливим систематично знаходити внутрішні кандидати на екстремум і переходити до чисельних одновимірних методів.