Чисельна оптимізація в matlab

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

Загальні відомості

Отже, в цьому блоці нічого про Matlab не буде, лише інформація про поняття оптимізації. Це поняття зводиться до термінів мінімуму і максимуму функції, або, якщо коротко - екстремумів.

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

Якщо не зрозуміло - ось простий приклад з усіма відомої параболою:

Чисельна оптимізація в matlab

У цій функції є один мінімум, і він знаходиться в точці x = 0. Ця точка називається точкою мінімуму, а саме значення цієї функції є мінімум (він теж дорівнює 0). Максимумів у цій функції немає, але якби функцію перевернули догори ногами, то він би з'явився.

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

Пошук екстремумів в Matlab

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

Стандартні методи Matlab

Розберемо 2 завдання знаходження мінімуму в Matlab:

1 приклад. Обчислити мінімум функції f (x) = - x 1 / x. визначивши графічно інтервал його локалізації. Обчислення провести з мінімальним кроком по аргументу 1 * 10 -5

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

Запускаємо скрипт і отримуємо:

Чисельна оптимізація в matlab

За графіком функції робимо висновок, що є один мінімум, і його координати знаходяться в інтервалі 2.5 - 3, тобто ми скоротимо інтервал пошуку мінімуму.

Тепер створимо ще один скрипт, дамо йому назву first.m і пропишемо в нього функцію:

Таким чином в цьому m-файлі ми визначили функцію. Тепер в командному вікні ми пропишемо наступний код:

І отримуємо такі значення:
x = 2.7183 - координата точки мінімуму
y = -1.4447 - значення мінімуму

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

Отже, для цього завдання ми створили 2 скрипт-файлу, які ви можете завантажити в кінці статті.

2 приклад. Обчислити мінімум функції двох змінних x 4 + y 4 -2x 2 + 4xy-2y 2 +1 з точність 1 * 10-5.
Координати початкової точки пошуку [1.0, -1.0].

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

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

Чисельна оптимізація в matlab

Як видно з графіка, є дві ділянки, де присутня локальний мінімум (темно-сині ділянки), і наше завдання знайти координати і значення двох цих точок. Скористаємося стандартними інструментами Matlab і створимо новий скрипт з ім'ям second.m, в якому і пропишемо код:

Після цього, в командному рядку, як і для першого завдання, прописуємо стандартну функцію Matlab:

Отримуємо такий висновок:

Для знаходження мінімумів в Matlab на цей раз ми використовували функцію fminsearch. Ця функція реалізує симплекс - метод Нелдера-Міда. У висновку ми отримали кілька змінних: в z записалися значення координат точок мінімуму, в f саме значення цього мінімуму. А в змінних exitflag і output поміщені умови переривання процесу пошуку та інформація про оптимізацію відповідно.

В результаті у нас знову вийшло 2 m-файлу.

Метод Ньютона Matlab

А тепер спробуємо самі реалізувати метод Ньютона для оптимізації функції.

3 приклад. Методом Ньютона знайти точку мінімуму x * і мінімальне значення f * функції f (x) = (x-2) 4 -lnx на відрізку xє [2; 3] c точністю 10 -7

Почнемо з того, що створимо новий скрипт і назвемо його Newton.m. Потім пропишемо в ньому код:

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

У підсумку вийшло:
Xk = 2.4663
Yk = -0.8554

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

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

висновок

Ну що ж, в цій статті ми розглянули деякі методи для знаходження екстремумів в Matlab. Ми використовували як стандартні методи, так і реалізували метод Ньютона в середовищі Matlab. Їх вихідні трохи нижче.
завантажити вихідні

Поділитися посиланням: