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

ЛР2 / lab2_simplex

.m
Скачиваний:
26
Добавлен:
14.12.2022
Размер:
5 Кб
Скачать
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