Добавил:
unclefalkon
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ЛР1 / lab1_parabol
.m 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
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