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

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

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


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

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

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

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

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

« »__________ 2021 г.

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

2021
2. Вычислить минимальное значение функции на отрезке [0,5; 1],
используя следующие методы первого порядка:
• метод половинного деления;
• метод золотого сечения;
• метод Фибоначчи.
Точку оптимума определить с точностью до 10-3.
Построить график функции на отрезке. Привести код программы. Указать
число шагов, при котором требуемая точность достигается.

График функции на отрезке [0,5; 1] представлен на рисунке 1.

Рисунок 1 - График функции

В ходе работы были запрограммированы три функции в MatLab, реализующие


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

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

2
Таблица 1 - Результаты работы функций
Метод x¿ f (x ¿ ) Число
итераций
Половинного 0.8242 -1.6421 10
деления
Золотого сечения 0.8243 -1.6421 15
Фибоначчи 0.8202 -1.6421 12

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

halfdiv

x = 0.5:0.01:1;
plot(x, fun(x))
grid on
golddiv
fibonaccimethod

function halfdiv
clear all
eps = 0.001;
fprintf('\t ak \t yk \t xk \t zk\t\tbk \t Lk \t f(yk) \t f(xk)
f(zk) \n');
a=0;
b=1;
n=0;
while((b-a)>eps)
x=(a+b)/2;
y=(a+x)/2;
z=(x+b)/2;
dispLine=[a y x z b abs(a-b) fun(y) fun(x) fun(z)];
disp(dispLine);
if fun(y)<fun(x)
a=a;
b=x;
end
if fun(z)<fun(x)
a=x;
b=b;
end
if (fun(y)>=fun(x)&& fun(z)>=fun(x))
a=y;
b=z;
end
n=n+1;
end
xmin=x;
fmin=fun(x);
disp('Число итераций')
disp(n)
xmin
fmin
end

function golddiv
clear all
eps=0.001;
fprintf('\t ak \t yk \t zk\t bk\t\tLk\tf(yk) \t f(zk) \n');
a=0;
b=1;
n=0;
fi=(1+sqrt(5))/2;
while((b-a)>eps)

4
y=b-(b-a)/fi;
z=a+(b-a)/fi;
dispLine=[a y z b abs(a-b) fun(y) fun(z)];
disp(dispLine);
if fun(y)>=fun(z)
a=y;
else
b=z;
end
n=n+1;
end
xmin=(a+b)/2;
fmin=fun(xmin);
disp('Число итераций')
disp(n)
xmin
fmin
end

function f = fun(x)
f = x.^3 - 3*sin(x);
end

function t=fibonacci(x)
n(1)=1;
n(2)=1;
for i=3:x
n(i)=n(i-2)+n(i-1);
end
t=n(x);
end

function fibonaccimethod
clear all
eps=0.01;
a=0;
b=1;
Fn=max(b-a)/eps;
N=1;
while(fibonacci(N)<Fn)
N= N +1;
end
fprintf('\t ak \t yk \t zk\t bk\t\tLk\tf(yk) \t f(zk) \n');
for k=1:N-3
y(k)=a+(b-a)*(fibonacci(N-k-2)/fibonacci(N-k));
z(k)=b-(b-a)*(fibonacci(N-k-2)/fibonacci(N-k));
dispLine=[a y(k) z(k) b abs(a-b) fun(y(k)) fun(z(k))];
disp(dispLine);
if fun(y(k))<fun(z(k))
a=a;
b=z(k);
end
if fun(z(k))<fun(y(k))
a=y(k);
b=b;
end
if fun(y(k))==fun(z(k))
a=y(k);
5
b=z(k);
end
end
xmin=(a+b)/2;
fmin=fun(xmin);
disp('Число итераций')
disp(N)
xmin
fmin
end

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