ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 21
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Исследование операций и методы оптимизации КМ-1
Выполнил студент
Группы: ИЭ-62-21
ФИО: Купчик Ю. Г.
1.Задание.
Составить программы реализующие методы поиска и найти точку минимума функции x^2+e^x на отрезке [-1;0] с количеством итераций n=18
Сравнить заданные в варианте методы по получаемой длине локализации.
1.1 Метод перебора на равномерной сетке.
f = @(x) x^2 + exp(x);
a = -1;
b = 0;
n = 18;
x_vals = linspace(a, b, n+1);
min_value = inf;
for i = 1:length(x_vals)
curr_value = f(x_vals(i));
if curr_value < min_value
min_value = curr_value;
x_min = x_vals(i);
end
end
disp(['Минимальное значение функции: ', num2str(min_value)]);
disp(['Точка минимума: ', num2str(x_min)]);
1.2 Метод дихотомии.
f = @(x) x^2 + exp(x);
a = -1;
b = 0;
n = 18;
for k = 1:n
x_k = (a + b - 0.1) / 2;
y_k = (a + b + 0.1) / 2;
if f(x_k) < f(y_k)
b = y_k;
else
a = x_k;
end
end
x_min = (a + b) / 2;
min_value = f(x_min);
disp(['Минимальное значение функции: ', num2str(min_value)]);
disp(['Точка минимума: ', num2str(x_min)]);
1.3 Метод золотого сечения.
f = @(x) x^2 + exp(x);
a = -1;
b = 0;
n = 18;
phi = (1 + sqrt(5)) / 2;
x_k = b - (b - a) / phi;
y_k = a + (b - a) / phi;
for k = 1:n
if f(x_k) < f(y_k)
b = y_k;
y_k = x_k;
x_k = b - (b - a) / phi;
else
a = x_k;
x_k = y_k;
y_k = a + (b - a) / phi;
end
end
x_min = (a + b) / 2;
min_value = f(x_min);
disp(['Минимальное значение функции: ', num2str(min_value)]);
disp(['Точка минимума: ', num2str(x_min)]);
1.4 Метод Фибоначчи.
f = @(x) x^2 + exp(x);
a = -1;
b = 0;
n = 18;
F = zeros(1, n + 1);
F(1) = 1;
F(2) = 1;
for i = 3:n+1
F(i) = F(i-1) + F(i-2);
end
x_k = zeros(1, n+1);
y_k = zeros(1, n+1);
x_k(1) = a + (b - a) * F(n-1) / F(n+1);
y_k(1) = a + b - x_k(1);
for k = 2:n
if f(x_k(k-1)) > f(y_k(k-1))
a = x_k(k-1);
x_k(k) = y_k(k-1);
y_k(k) = a + b - x_k(k);
else
b = y_k(k-1);
y_k(k) = x_k(k-1);
x_k(k) = a + b - y_k(k);
end
end
x_min = (a + b) / 2;
min_value = f(x_min);
disp(['Минимальное значение функции: ', num2str(min_value)]);
disp(['Точка минимума: ', num2str(x_min)]);
1.5 Метод Больцано.
f = @(x) x^2 + exp(x);
a = -1;
b = 0;
n = 18;
for k = 1:n
x_k = a + (b - a) / 3;
y_k = b - (b - a) / 3;
if f(x_k) < f(y_k)
b = y_k;
else
a = x_k;
end
end
x_min = (a + b) / 2;
min_value = f(x_min);
disp(['Минимальное значение функции: ', num2str(min_value)]);
disp(['Точка минимума: ', num2str(x_min)]);
1.6 Метод касательных.
f = @(x) x^2 + exp(x);
df = @(x) 2*x + exp(x);
x0 = -0.5;
n = 18;
x_k = x0;
for k = 1:n
x_k1 = x_k - f(x_k) / df(x_k);
x_k = x_k1;
end
min_value = f(x_k);
disp(['Минимальное значение функции: ', num2str(min_value)]);
disp(['Точка минимума: ', num2str(x_k)]);
1.7 Метод парабол.
f = @(x) x^2 + exp(x);
a = -1;
b = 0;
n = 18;
tol = 1e-6;
x1 = a;
x2 = (a + b) / 2;
x3 = b;
f1 = f(x1);
f2 = f(x2);
f3 = f(x3);
for i = 1:n
a0 = f1;
a1 = (f2 - f1) / (x2 - x1);
a2 = ((f3 - f1) / (x3 - x1) - (f2 - f1) / (x2 - x1)) / (x3 - x2);
x_min = 0.5 * (x1 + x2 - a1 / a2);
f_min = f(x_min);
if x_min < x2
if f_min < f2
x3 = x2;
f3 = f2;
x2 = x_min;
f2 = f_min;
else
x1 = x_min;
f1 = f_min;
end
else
if f_min < f2
x1 = x2;
f1 = f2;
x2 = x_min;
f2 = f_min;
else
x3 = x_min;
f3 = f_min;
end
end
% Проверка точности
if abs(x3 - x1) < tol
break;
end
end
disp(['Минимальное значение функции: ', num2str(f_min)]);
disp(['Точка минимума: ', num2str(x_min)]);
2. Таблица результатов.
Название метода | Точка минимума |
Перебор на равномерной сетке | -0.33333 |
Метод дихотомии | -0.35184 |
Метод золотого сечения | -0.35173 |
Метод Фибоначчи | -0.35195 |
Метод Больцано | -0.3516 |
Метод касательных | -1.0063 |
Метод парабол | -0.35173 |
2.1 Вывод.
Наиболее точные результаты дали методы касательных и метод Больцано с очень маленькой длиной локализации, а метод золотого сечения и перебора на равномерной сетке дали наименее точные результаты.