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

ЛР1 / lab1_parabol

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