Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР / ЛР2 / ПМО ЛР2

.pdf
Скачиваний:
3
Добавлен:
25.06.2023
Размер:
261.17 Кб
Скачать

ГУАП

КАФЕДРА №41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

ассистент

 

 

 

Б.К. Акопян

 

 

 

 

 

 

 

 

 

должность, уч. степень, звание

 

подпись, дата

 

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №2

РЕШЕНИЕ ОДНОМЕРНОЙ ЗАДАЧИ ОПТИМИЗАЦИИ

по курсу: Прикладные методы оптимизации

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

подпись, дата

 

инициалы, фамилия

Санкт-Петербург 2022

Цель работы

Изучение алгоритмов поиска экстремума унимодальной функции, определение сравнительной эффективности методов одномерной оптимизации.

Индивидуальный вариант

Индивидуальный вариант номер 10 в соответствии с таблицей 1.

Таблица 1 – Индивидуальный вариант задания

 

 

Погрешность

Функция Ф(х)

Интервал [a; b]

определения

варианта

 

 

экстремума εx

 

 

 

10

 

[–6,6; –4]

2–17

Задание:

Реализовать алгоритмы каждого из описанных методов поиска экстремума функции в указанном интервале с требуемой погрешностью в соответствии с вариантом задания, рассчитать значения критерия оптимальности каждого из алгоритмов.

2

Ход работы

1.Сначала подсчеты были выполнены вручную в соответствии с рисунком 1

Рисунок 1 – Подсчеты, выполненные вручную

Построили график функции, на котором можно наглядно увидеть точку максимума в соответствии с рисунком 2.

Рисунок 2 – График функции

3

После этого была написана программ на языке Python. Она выполняет поиск максимума функции на заданном интервале, при помощи методов равномерного поиска,

дихотомии золотого сечения и Фибоначчи. Полный листинг программы в соответствии с Приложением А.

Результат выполнения программы в соответствии с рисунком 3.

Рисунок 3 – Результат выполнения программы Графики построенные по результатам работы программы в соответствии с рисунком 4.

Рисунок 4 – График

4

Вывод

В ходе данной лабораторной работы были получены навыки по работе с алгоритмами поиска экстремума унимодальной функции, также была определена сравнительная эффективность методов одномерной оптимизации. Во время выполнения работы сначала были выполнены подсчеты вручную, затем была написана программ на

Python, которая выполняет поиск максимума функции на заданном интервале.

5

Приложение А. Код программы

import numpy as np import math as m

from matplotlib import pyplot as plt

def f(x):

return -x**2- 10*x + 5

eps = 2 ** (-15) a = -6.6

b = -4

eps0 = [[], [], [], []] res = []

# Алгоритм равномерного поиска r = 1

a1 = a

b1 = b n = 50

iterations = [0] * 4

while abs(b1 - a1) > eps:

x = np.arange(a1, b1, (b1 - a1) / n) vals = [f(i) for i in x[0:-1]]

ch = vals.index(min(vals)) a1, b1 = x[ch - 1], x[ch + 1] iterations[0] += 1 eps0[0].append(b1 - a1)

res.append([a1, b1, iterations[0]])

print(res)

# Алгоритм дихтомии(алгоритм деления пополам) a1, b1 = a, b

6

while abs(b1 - a1) > eps: n = (a1 + b1) / 2

x = [(a1 + n) / 2, (b1 + n) / 2] vals = [f(i) for i in x]

if vals[0] < vals[1]: b1 = n

else:

a1 = n iterations[1] += 1 eps0[1].append(b1 - a1)

res.append([a1, b1, iterations[1]])

#print(eps0)

#print(res)

#Метод золотого сечения

a1, b1 = a, b

while abs(b1 - a1) > eps:

x = [b1 - (b1 - a1) * 0.618, a1 + (b1 - a1) * 0.618] vals = [f(i) for i in x]

if vals[0] < vals[1]: b1 = x[1]

else:

a1 = x[0] iterations[2] += 1 eps0[2].append(b1 - a1)

res.append([a1, b1, iterations[2]])

# Метод Фибоначчи iterations[3] = 1 a1, b1 = a, b

fib = [1, 1]

while (b1 - a1) / fib[-1] > eps: fib.append(fib[-2] + fib[-1])

while abs(b1 - a1) > eps:

x = [a1 + (b1 - a1) * (fib[len(fib) - 1 - iterations[3]] / fib[len(fib) - iterations[3]]),

7

a1 + (b1 - a1) * (fib[len(fib) - 1 - iterations[3]] / fib[len(fib) - iterations[3]])]

if x[0] == x[1]:

x[1] = x[0] + (b1 - a1) / 10 vals = [f(i) for i in x]

if vals[1] < vals[0]: a1 = x[0]

else:

b1 = x[1] iterations[3] += 1

eps0[3].append(b1 - a1) iterations[3] -= 1

res.append([a1, b1, iterations[3]])

lbls = ['Алгоритм равномерного поиска', 'Метод дихтомии', 'Метод золотого сечения',

'Метод Фибоначчи']

[print(lbls[i], '\n', res[i]) for i in range(len(res))] plt.plot(eps0[0], range(iterations[0]), label=lbls[0]) plt.plot(eps0[1], range(iterations[1]), label=lbls[1]) plt.plot(eps0[2], range(iterations[2]), label=lbls[2]) plt.plot(eps0[3], range(iterations[3]), label=lbls[3]) plt.legend()

plt.show()

f_ax = []

x_ax = np.arange(a, b, 0.01)

for j in x_ax: f_ax.append(f(j))

print(f_ax)

8

Соседние файлы в папке ЛР2