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

ЛР2 / lab2_simplex

.m
Скачиваний:
14
Добавлен:
14.12.2022
Размер:
4.91 Кб
Скачать
function [x_min, f_min, value_counter, iter_counter] = lab2_simplex(y, x_base, eps)
% green_shade = 0; % shade dlya postroeniua base tochek simplexov
value_counter = 0;
iter_counter = 0;
l = 1; %dlina rebra
simplex_matrix = zeros(3,2);

% Vychislenie startovogo simplexa ceherz bazovuyu tochku
simplex_matrix(1,:) = x_base;
for i = 2:3
for j = 1:2
if(i == j+1)
simplex_matrix(i,j) = simplex_matrix(1,j) + l/(sqrt(2)*2)*(sqrt(3)-1);
value_counter = value_counter + 1;
else
simplex_matrix(i,j) = simplex_matrix(1,j) + l/(sqrt(2)*2)*(sqrt(3)+1);
value_counter = value_counter + 1;
end
end
end

number_of_current_vertex = 1; % eto prosto zaglushka seychas
f_min = 0;

while(1)
iter_counter = iter_counter +1;

% Esli vershiny konchilis to proverka na okonchanie poiska
if(number_of_current_vertex == 0)
number_of_current_vertex = 1;
if(l < eps)
break;
end
end

% Menyaem vershinu na tu, kotoraya udachno otobrazilas
simplex_matrix(number_of_current_vertex, :) = x_base;

% Vychislenie znacheniy simplexa v ego tochkah i sortirovka tochek
% po vozrastaniyu dlya pravilnoy numeracii vershin
simplex_values = [y(simplex_matrix(1,1), simplex_matrix(1,2)), y(simplex_matrix(2,1), simplex_matrix(2,2)), y(simplex_matrix(3,1), simplex_matrix(3,2))];
simplex_matrix = [simplex_matrix simplex_values']; % prisoedinyaem stolbec znacheniy k matrice simplexa
simplex_matrix = sortrows(simplex_matrix, 3); % sortiruem vershiny po znacheniyam (po 3 stolbcu)
number_of_current_vertex = 3; % tak kak pravilnaya numeraciya, to poslednyaya vershina budet imet' maksimalnoe znachenie, a u nas ih vsego 3

while(1)

% Vychislenie novogo otobrazheniya
x_base = zeros(1,2);
for i=1:3
if(i ~= number_of_current_vertex)
% Vychislenie centra regular simplexa
% Skladyvaem vershiny vse krome toy, otnositelno kotoroy
% ishem otobrazhenie
x_base = x_base + simplex_matrix(i, [1 2]); value_counter = value_counter + 2;
end
end
% Centr simplexa minus vershina otnositelno kotoroy ishem
% otobrazhenie
x_base = x_base - simplex_matrix(number_of_current_vertex, [1 2]); value_counter = value_counter + 2;

% Esli otobrazhenie udachnoe to perehodim k next iteration
if(simplex_values(number_of_current_vertex) > y(x_base(1), x_base(2)))
break
% Inache perehodim k vershine so znacheniem pomenshe
else
number_of_current_vertex = number_of_current_vertex - 1;
% Esli vershiny konchilis, to umenshaem dlinu rebra v 2
% raza i x_min schitaem versinu s indexom 1, tak kak
% numeraciya pravilnaya
if(number_of_current_vertex == 0)
l=l/2;
x_min = simplex_matrix(1, :);
f_min = y(x_base(1), x_base(2)); value_counter = value_counter + 1;
simplex_matrix = simplex_matrix(:, [1 2]);
simplex_matrix(1, :) = x_base;
for i=2:3
for j=1:2
if(i == j+1)
simplex_matrix(i,j) = simplex_matrix(1,j) + l/(sqrt(2)*2)*(sqrt(3)-1);
value_counter = value_counter + 1;
else
simplex_matrix(i,j) = simplex_matrix(1,j) + l/(sqrt(2)*2)*(sqrt(3)+1);
value_counter = value_counter + 1;
end
end
end


break;
end
end

end
simplex_matrix = simplex_matrix(:, [1 2]);
% hold on; grid on;
% plot(simplex_matrix(1,1), simplex_matrix(1,2), 'Color', [0 green_shade 0], 'Marker', '*')
% if(green_shade == 0)
% green_shade = 1;
% else
% green_shade = 0;
% end
end

str = sprintf('Минимум функции %3f, в точке x1 = %3f, x2 = %3f',f_min, x_min(1), x_min(2));
disp(str);
str = sprintf('Количество вычислений - %d. Количество итераций метода - %d', value_counter, iter_counter);
disp(str);
Соседние файлы в папке ЛР2