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

ЛР1 / lab1_parabol

.m
Скачиваний:
28
Добавлен:
14.12.2022
Размер:
2 Кб
Скачать
    function [f_min, x_min] = lab1_parabol(a, b, eps)
    a_start = a;
    b_start = b;
    
    x1 = input('Введите x1: ');
    x2 = input('Введите x2: ');
    x3 = input('Введите x3: ');
    while (x1 >= x2) || (x3 <= x2) || (myfun(x1) <= myfun(x2)) || (myfun(x3) <= myfun(x2))
        x1 = input('Введите x1: ');
        x2 = input('Введите x2: ');
        x3 = input('Введите x3: ');
    end
     
    fx1 = myfun(x1);
    fx3 = myfun(x3);
    fx2 = myfun(x2);
    counter = 3;

    a1 = (fx2-fx1)/(x2-x1);                                                 % Самая первая итерация по вычислению x_min, x1, x2, x3
    a2 = 1/(x3-x2) * ( (fx3-fx1)/(x3-x1) - (fx2-fx1)/(x2-x1) );
    x_min = 0.5*(x1+x2-a1/a2);
    fx_min=myfun(x_min);
    if (x_min<x2)
           if (fx_min<fx2) 
               x3=x2; fx3=fx2; x2=x_min; fx2=fx_min;
           else
               x1=x_min; fx1=fx_min;
           end
          
       else
          if (fx_min<fx2) 
              x1=x2; fx1=fx2; x2=x_min; fx2=fx_min;
          else
              x3=x_min; fx3=fx_min;
          end
    end
    counter = counter + 1;

    delta = 1000; % Т.к. первый раз дельту вычислить невозможно

    while abs(delta) > eps
       x_min_old = x_min;
       a1 = (fx2-fx1)/(x2-x1);
       a2 = 1/(x3-x2) * ( (fx3-fx1)/(x3-x1) - (fx2-fx1)/(x2-x1) );
       x_min = 0.5*(x1+x2-a1/a2);
       fx_min=myfun(x_min); 
       
       if (x_min<x2)
           if (fx_min<fx2) 
               x3=x2; fx3=fx2; x2=x_min; fx2=fx_min;
           else
               x1=x_min; fx1=fx_min;
           end
          
       else
          if (fx_min<fx2) 
              x1=x2; fx1=fx2; x2=x_min; fx2=fx_min;
          else
              x3=x_min; fx3=fx_min;
          end
       end
       counter = counter + 1;
       x_min_new = x_min;
       delta = abs(x_min_old - x_min_new);

    end

    f_min = myfun(x_min);
    str=sprintf('Минимум функции на отрезке [%d; %d] - %3f, в точке %3f',a_start, b_start, f_min, x_min);
    disp(str);
    str = sprintf('Количество вычислений функции - %d', counter);
    disp(str);
end
Соседние файлы в папке ЛР1