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

ЛР2 / lab2_huk_givs

.m
Скачиваний:
26
Добавлен:
14.12.2022
Размер:
2 Кб
Скачать
function [x_min, y_min, value_counter, iter_counter]  = lab2_huk_givs(y, x_start, eps)

iter_counter = 0;
value_counter = 0;
h = 1; 

x = x_start;

% Proverka funkcii v startovoy tochke
x0_ = x;
y_new = y(x0_(1), x0_(2));                 value_counter = value_counter + 1;
 
while (h > eps)
 iter_counter = iter_counter +1;
    
    % Issledovanie funkcii v okrestnosti tochki x (po koordinatam)
    x = x0_;
    r = y_new;
    x1 = x;

    for i=1:2
        x1(1,i) = x(1,i) + h;
        r1 = y(x1(1), x1(2));                    value_counter = value_counter + 1;
        if (r1 < r)
            x = x1;
            r = r1;
        else
            x1(1,i) = x(1,i) - h;
            r1 = y(x1(1), x1(2));                value_counter = value_counter + 1;
            if (r1 < r)
                x = x1;
                r = r1;
            end
        end
    end
 
    
    % Proverka znacheniya funkcii v tochke
    if (r < y_new)
 
      while(1)
        % Zapominaem predyduschie znacheniya
        % Berem novuyu start tochku
        x0 = x0_;
        x0_ = x;
        y_new = r;

    
        % Spusk po formule gde a=2
        for i=1:2
          x(1,i) = x0(1,i) + 2 * (x0_(1,i) - x0(1,i));         value_counter = value_counter + 1;
        end
      
        % Issledovanie funkcii v okrestnosti tochki x (po koordinatam)
        r = y(x(1), x(2));
        x1 = x;

        for i=1:2
            x1(1,i) = x(1,i) + h;
            r1 = y(x1(1), x1(2));                value_counter = value_counter + 1;
            if (r1 < r)
                x = x1;
                r = r1;
            else
                x1(1,i) = x(1,i) - h;
                r1 = y(x1(1), x1(2));                value_counter = value_counter + 1;
                if (r1 < r)
                    x = x1;
                    r = r1;
                end
            end
        end
     
        if (r >= y_new)
            break;
        end
        
      end
      
    end
    
    h = h / 10;
    
end
 x_min = x0_;
 y_min = y(x_min(1), x_min(2));

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