You are on page 1of 5

Прізвище: Климко

Ім’я: Ігор
По-батькові: Михайлович
Група: КН-406
Кафедра: САПР
Дисципліна: Методи синтезу та оптимізації
Перевірив: Соколовський Я.І.
Варіант: 11

ЗВІТ
до лабораторної роботи №1
на тему:
“Дослідження роботи методів одновимірної оптимізації”

Мета роботи: Вивчити основні алгоритми розв’язку одновимірних


оптимізаційних задач.
Короткі теоретичні відомості:
Метод Пауела
Якщо відомі значення функції f(х) в трьох різних точках 
відповідно f,, f, f,, то функція f(х) може бути апроксимована квадратичною
функцією
f(х)=Ax2+Bx+C,
де: А, В і C визначаються з рівнянь
A 2+B+C=f , A 2+B+C=f , A 2+B+C=f .
Після перетворень цих рівнянь отримуємо
A=fff
B= f f f 6
C=fff
де: . Зрозуміло, що f(x) буде мати мінімум в точці х=-B/2A,
якщо А>0. Отже можна апроксимувати точку мінімуму x* функції f(х)
значенням

1
Цей метод може безпосередньо застосовуватися до функцій однієї
змінної. Він може бути також корисний для виконання лінійного пошуку. В цих
процедурах потрібно знайти мінімум функції f(х) в точках прямої x0+D , де
x0- задана точка, а D визначає заданий напрям. Значення функції f(x0+D) на
цій прямій є значеннями функції однієї змінної :
f = f(x0+D).
Ідеї і результати, викладені вище, перетворюються у обчислювальні
процедури, які описані далі. Передбачимо, що задані унімодальна функція
однієї змінної f(х), початкова точка x0 знаходження мінімуму і довжина кроку
D - величина того ж порядку, що і відстань від точки a до точки реального
мінімуму х* (умова, яку не завжди просто задовольнити). Обчислювальна
процедура має наступні кроки:
Крок 1. x2 = x1 + D х.
Крок 2. Обчислити F(x1) і F(x2).
Крок 3. Якщо F(x1) > F(x2), то x3 = x1 + 2 D х.
 Якщо F(x1)< F(x2), то x3 = x1 - D х.
Крок 4. Обчислити F(x3) і знайти
 Fmin = min{ F(x1), F(x2), F(x3)},
 Xmin = xi, відповідна Fmin.
Крок 5. По x1, x2, x3 обчислити х*, використовуючи формулу для оцінки
з допомогою квадратичної апроксимації (порядок обчислення х*
наведено на попередній сторінці).
Крок 6. Перевірка закінчення.
 Якщо |Fmin - F(х*)| <  , то закінчити пошук. У іншому випадку
перехід до кроку 7.
 Якщо |Xmin - х*| <  , то закінчити пошук. У іншому випадку
перехід до кроку 7.
Крок 7. Вибрати Xmin або х* і дві точки по обидві сторони від неї.
Визначити в природному порядку (тобто розмістити ці точки по
зростанню) нові значення x1, x2, x3 і перейти до кроку 4.

2
Індивідуальне завдання:

Знайти мінімальне чи максимальне значення функції f (x) на проміжку


[a,b]. Точку  x визначити з точністю   0.001 . Написати програму,
передбачити вивід на екран і на друк проміжних значень обчислень, порахувати
кількість ітерацій, необхідних для досягнення заданої точності. Варіанти
завдань наведено в таблиці.

Програмна реалізація:
import math

h = 0.01
x1 = - 1
eps = 1e-3

# вибір x1 і x2 для оптимального _x


def opt(w, a, b, c, h):
print(w, a, b, c)
if w < a:
c = b
while a > w:
a -= h
elif w > c:
a = b
while c < w:
c += h
elif w < b:
c = b
elif w > b:
a = b
else:
w = b
return a, w, c

def fun(a):
return a + a * a - a * a * a + (2 / 3) * a * a * a * a - (4 / 5) * a * a * a
* a * a + (5 / 3) * a * a * a * a * a * a

def find_min(h, x1):


k = 0
x2 = x1 + h
f1 = fun(x1)
f2 = fun(x2)
if f1 > f2:
x3 = x1 + 2 * h
_x = x2
3
else:
x3 = x1 - h
_x = x1
f3 = fun(x3)
# задаємо мінімум і максимум
fmin = min(f1, f2, f3)
f_x = max(f1, f2, f3)
# сортуємо три точки
x1, x2, x3 = sorted([x1, x2, x3])
# цикл ітерацій
it = 0
while abs((fmin - f_x) / f_x) > eps:
it += 1
# задаємо граничні точки такі, щоб x1 < _x < x2
x1, x2, x3 = opt(_x, x1, x2, x3, h)
f1 = fun(x1)
f2 = fun(x2)
f3 = fun(x3)
# знаходимо мінімум
tmp = sorted([(f1, x1), (f2, x2), (f3, x3)])
fmin, xmin = tmp[0]
# знаходимо коефіцієн для апроксимації
a1 = (f2 - f1) / (x2 - x1)
a2 = (1 / (x3 - x2)) * (((f3 - f1) / (x3 - x1)) - ((f2 - f1) / (x2 -
x1)))
# знаходимо _x і f(_x)
_x = (x2 + x1) / 2 - a1 / (2 * a2)
f_x = fun(_x)

return f1, f2, f3, fmin, _x, f"Кс-ть ітерацій = {it}"

print(f"Результат = {find_min(h, x1)}");

Результати виконання програми:

Результати перевірки достовірності результатів


Перевірку проводив з допомогою бібліотеки SciPy:

4
Висновок: на цій лабораторній роботі я вивчив основні алгоритми розв’язку
одновимірних оптимізаційних задач. Написав програму для виконання
індивідуального завдання, яка використовує метод Пауелла.

You might also like