Вы находитесь на странице: 1из 6

Санкт-Петербургский политехнический университет Петра Великого

Институт металлургии, машиностроения и транспорта

Высшая школа автоматизации и робототехники

Отчёт
Задание 3

Дисциплина: Методы и теория оптимизации

Студент гр. 3341506/00401 Иванов Д.А.

Преподаватель Третьяков Д.А.

« »__________ 2021 г.

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

2021
1) Вычислить наименьшее или наибольшее значение функции методом
Ньютона, самостоятельно определив отрезок унимодальности функции.
Построить график функции. Привести код программы.
2) Разработать численный алгоритм решения задачи методом
квадратичной аппроксимации. Привести код программы.
3) Привести данные сравнения результатов расчета методами Ньютона и
квадратичной аппроксимации (с указанием числа шагов до достижения
требуемой точности). Точку оптимума 𝑥𝑥∗ в обоих случаях определить с
точностью до 10−3.

После построения графика, был определён отрезок унимодальности


функции, содержащий локальный минимум: [-2; 4]. График отрезка (а также его
первой и второй производных) приведён на рисунке 1.

Рисунок 1 - График функции на выбранном отрезке

2
В ходе работы были написаны две функции в MatLab, реализующие
поиск локального минимума методами Ньютона и квадратичной
аппроксимации (метод Пауэлла). Код функций представлены в приложении 1.

Метод Пауэлла сокращает шаг вдвое на каждой итерации


(первоначальное значение выбирается равным половине заданного отрезка).
Первые три точки выбираются на середине и границах отрезка.

Результаты работы методов представлены в таблице 1.


Таблица 1 - Результаты работы функций
Метод Результат Число
итераций
Ньютона 1 1
Пауэлла 1 1

3
ПРИЛОЖЕНИE
Приложение А. Программа для расчёта по заданию 3.

fun = @(x)((x-1).^4);
dfun = @(x)(4*(x-1).^3);
d2fun = @(x)(12*(x-1).^2);
a = -2;
b = 4;
eps = 0.001;

x = a:0.01:b;
y = fun(x);
y1 = dfun(x);
y2 = d2fun(x);
plot(x, y, 'b');
hold on;
plot(x, y1, 'g');
plot(x, y2, 'r');

[min1, iters1] = Newtown(fun, dfun, d2fun, a, b, eps)


[min2, iters2] = Powell(fun, a, b, eps)

function [min, iters] = Newtown(f, df, d2f, a, b, eps)


x = (a + b) / 2;
dfun = df(x);
dfb = df(b);
dfa = df(a);
iters = 1;
while abs(dfun) > eps
step = - dfun / d2f(x);
if(sign((dfb - dfa) * dfun * step) > 0)
if(dfun * dfb > 0)
b = x;
dfb = df(b);
else
a = x;
dfa = df(a);
end
x = (a + b) / 2;
else
x = x + step;
end
iters = iters + 1;
dfun = df(x);
end
4
min = x;
end

function [min, iters] = Powell(f, a, b, eps)


step = (b - a) / 2;
x1 = (a + b) / 2;
y1 = f(x1);
x2 = x1 + step;
y2 = f(x2);
x3 = x1 - step;

y3 = f(x3);

iters = 1;

while true
if(and((y1 <= y2), y1 <= y3))
minX = x1;
minY = y1;
else
if(y2 <= y3)
minX = x2;
minY = y2;
else
minX = y3;
minY = y3;
end
end

a1 = (y2-y1) / (x2-x1);
a2 = ((y3-y1)/(x3-x1) - (y2-y1)/(x2-x1))/(x3-x2);
testX = (x2 + x1) / 2 - (a1/2/a2);
testY = f(testX);

if(abs(testX - minX) < eps)


min = testX;
return;
end

iters = iters + 1;
step = step / 2;
if(testY < minY)
x1 = testX;
else
x1 = minX;
end
5
y1 = f(x1);
x2 = x1 + step;
y2 = f(x2);
x3 = x1 - step;
y3 = f(x3);
end
end

Вам также может понравиться