Метод локализации представляет собой модификацию метода сканирования. При его использовании существенно снижается количество выполняемых вычислений. Весь интервал поиска, как и в методе сканирования, разбивается на несколько частей, но более крупных размеров (чаще всего на 4 отрезка). Вычисление критерия R (х) осуществляется во всех точках разбиения и на краях интервала. Выбирается значение аргумента, соответствующее наименьшему значению R (х). Новый интервал поиска будет состоять из двух отрезков, на общей границе которых находится найденный минимум. Процедура повторяется.
Абсолютная ошибка в нахождении экстремума при 4 отрезках разбиения равна
,
где s – количество точек, в которых вычисляется значение критерия.
Далее приведен текст программы, позволяющий реализовать описанный выше алгоритм.
function[]=LocalizExtrem1D_170809();
%метод одномерного поиска экстремума для указанной ниже функции
function y=f(x)
%функция вычисляется от одного аргумента и возвращает одно значение
%или от вектора аргумента и возвращает вектор, каждый элемент
%которого вычислен от соответствующего элемента вектора аргумента
y=(x+2).*(x-4); %поэтому перед знаком умножения * стоит точка.
%если не ставить;точку с запятой в конце строки то произойдет
%вывод на экран
end
%метод одномерного поиска минимума: локализации экстремума
disp('МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ ЛОКАЛИЗАЦИЕЙ ЭКСТРЕМУМА');
disp('Применен для указанной функции: y=(x+2)*(x-4)');
disp('ВВОД ИСХОДНЫХ ДАННЫХ края диапазона поиска, точность по аргументу ИЛИ по функции ');
function[x,y,mas1x,mas1y,xleft1,xright1,nn]=LocExt1(); % функция локализации экстремума
disp('Одномерная оптимизация методом локализации экстремума');
disp('ЗАДАЧА найти минимум указанной ниже функции ');
disp('y=(x+2)*(x-4)');
disp('в интервале, определяемом пользователем')
% ввод диапазона значений аргумента функции
xleft=input('введите левую границу диапазона поиска=');
xright=input('введите правую границу диапазона поиска=');
choice=input('ВОПРОС завершение работы по минимальному изменению функции? Да=1 нет=0');
if choice==0
yeps=input('введите допустимую погрешность по аргументу:');
else
yeps=input('введите минимальное изменение функции:');
end
xleft1=xleft;
xright1=xright;
%создание массива точек
n=5; %5 точек, чтобы было 4 отрезка
nn=1;
TheEnd=0;
while TheEnd==0
dx=(xright-xleft)/4;
masx(1)=xleft;
masy(1)=f(xleft);
disp(' очередная итерация');
for i=2:n
%вычисление значений аргументов и функции от каждого из них
masx(i)=masx(i-1)+dx;
masy(i)=f(masx(i));
string=strcat(‘аргумент:’,num2str(masx(i)),’ функция:’,num2str(masy(i)));
disp(string);
% проверка условий окончания работы функции
if choice==1
if abs(masy(i)-masy(i-1))<yeps
TheEnd=1;
end
else
if abs(xright-xleft)<eps
TheEnd=1;
end
end
end
%поиск минимума
min=masy(1)
num=1;
for i=2:n
if masy(i)<min
min=masy(i);
num=i;
end
end
string=strcat(‘В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:’,num2str(masx(num)),’ минимальная функция:’,num2str(masy(num)));
disp(string);
%подготовка к новой итерации
if num==1
xright=masx(2);
elseif num==n
xleft=masx(n-1);
else
xleft=masx(num-1);
xright=masx(num+1);
end
%возвращаемый массив точек
for i=1:5
mas1x(nn)=masx(i);
mas1y(nn)=masy(i);
nn=nn+1;
end
end
%возвращаемые значения минимума функции и соответствующего аргумента
x=masx(num);
y=masy(num);
end
disp('Одномерная оптимизация методом локализации экстремума');
disp('ЗАДАЧА найти минимум указанной ниже функции ');
disp('y=(x+2)*(x-4)');
disp('в интервале, определяемом пользователем')
%обращение к функции локализации экстремума
[x,y,mas1x,mas1y,xleft1,xright1,nn]=LocExt1();
nn=nn-1;
%выбор оформления вывода на экран
choiceTab=input('ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 ');
choiceGraf=input('ВОПРОС выводить график? Да=1 нет=0 ');
%вывод таблицы
if choiceTab==1
disp('вывод результатов');
for i=1:nn
string=print(‘номер= %4i\tаргумент= %7.3f\tфункция= %7.3f’,i,mas1x(i),mas1y(i));
disp(string);
end
end
% подготовка к выводу текста
% num2str преобразует число в строку символов
disp('НАЙДЕН МИНИМУМ')
sx=strcat('оптимальное значение аргумента=',num2str(x));
sy=strcat('минимум функции=',num2str(y),' с точностью:',num2str(abs(mas1y(nn)-mas1y(nn-1))));
sn=strcat('выполнено:',num2str(nn),' итераций');
disp(sx) % вывод на экран
disp(sy)
% подготовка к построению графика
h=0.1;
x1=xleft1:h:xright1;
y1=f(x1);
plot(x1,y1,’k-‘);
grid on;
title('y=(x+2)(x-4)');
xlabel('X');
ylabel('Y');
text(x,y,’\leftarrow Minimum’);
zeroMas=x1*0;
hold on;
if choiceGraf==1
plot(mas1x,mas1y,’r.’);
legend(‘plot with minimal step’,’points by Localisation method’,0);
else
legend(‘plot with minimal step’,0);
end
hold on;
plot(x1,zeroMas,’k-‘,zeroMas,y1,’k-‘);
end
После выполнения этой программы пользователь видит на экране соответствующий текст, вводит нужные значения и получает график:
МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ ЛОКАЛИЗАЦИЕЙ ЭКСТРЕМУМА
Применен для указанной функции: y=(x+2)*(x-4)
ВВОД ИСХОДНЫХ ДАННЫХ края диапазона поиска, точность по аргументу ИЛИ по функции
Одномерная оптимизация методом локализации экстремума
• ЗАДАЧА найти минимум указанной ниже функции
• y=(x+2)*(x-4)
в интервале, определяемом пользователем
введите левую границу диапазона поиска=-10
введите правую границу диапазона поиска=10
• ВОПРОС завершение работы по минимальному изменению функции? Да=1 нет=01
введите минимальное изменение функции:0.01
очередная итерация
аргумент:-5 функция:27
аргумент:0 функция:-8
аргумент:5 функция:7
аргумент:10 функция:72
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0 минимальная функция:-8
очередная итерация
аргумент:-2.5 функция:3.25
аргумент:0 функция:-8
аргумент:2.5 функция:-6.75
аргумент:5 функция:7
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0 минимальная функция:-8
очередная итерация
аргумент:-1.25 функция:-3.9375
аргумент:0 функция:-8
аргумент:1.25 функция:-8.9375
аргумент:2.5 функция:-6.75
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:1.25 минимальная функция:-8.9375
очередная итерация
аргумент:0.625 функция:-8.8594
аргумент:1.25 функция:-8.9375
аргумент:1.875 функция:-8.2344
аргумент:2.5 функция:-6.75
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:1.25 минимальная функция:-8.9375
очередная итерация
аргумент:0.9375 функция:-8.9961
аргумент:1.25 функция:-8.9375
аргумент:1.5625 функция:-8.6836
аргумент:1.875 функция:-8.2344
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0.9375 минимальная функция:-8.9961
очередная итерация
аргумент:0.78125 функция:-8.9521
аргумент:0.9375 функция:-8.9961
аргумент:1.0938 функция:-8.9912
аргумент:1.25 функция:-8.9375
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0.9375 минимальная функция:-8.9961
ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1
ВОПРОС выводить график? Да=1 нет=0 1
вывод результатов
номер= 1 аргумент=-10.000 функция=112.000
номер= 2 аргумент= -5.000 функция= 27.000
номер= 3 аргумент= 0.000 функция= -8.000
номер= 4 аргумент= 5.000 функция= 7.000
номер= 5 аргумент= 10.000 функция= 72.000
номер= 6 аргумент= -5.000 функция= 27.000
номер= 7 аргумент= -2.500 функция= 3.250
номер= 8 аргумент= 0.000 функция= -8.000
номер= 9 аргумент= 2.500 функция= -6.750
номер= 10 аргумент= 5.000 функция= 7.000
номер= 11 аргумент= -2.500 функция= 3.250
номер= 12 аргумент= -1.250 функция= -3.938
номер= 13 аргумент= 0.000 функция= -8.000
номер= 14 аргумент= 1.250 функция= -8.938
номер= 15 аргумент= 2.500 функция= -6.750
номер= 16 аргумент= 0.000 функция= -8.000
номер= 17 аргумент= 0.625 функция= -8.859
номер= 18 аргумент= 1.250 функция= -8.938
номер= 19 аргумент= 1.875 функция= -8.234
номер= 20 аргумент= 2.500 функция= -6.750
номер= 21 аргумент= 0.625 функция= -8.859
номер= 22 аргумент= 0.938 функция= -8.996
номер= 23 аргумент= 1.250 функция= -8.938
номер= 24 аргумент= 1.563 функция= -8.684
номер= 25 аргумент= 1.875 функция= -8.234
номер= 26 аргумент= 0.625 функция= -8.859
номер= 27 аргумент= 0.781 функция= -8.952
номер= 28 аргумент= 0.938 функция= -8.9961
номер= 29 аргумент= 1.094 функция= -8.991
номер= 30 аргумент= 1.250 функция= -8.938
НАЙДЕН МИНИМУМ
оптимальное значение аргумента=0.9375
минимум функции=-8.9961 с точностью:0.053711
Рис. 2.3. Пример вывода на экран при оптимизации методом локализации экстремума
Вывод результатов исполнения той же программы при изменении условий проведения поиска:
МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ ЛОКАЛИЗАЦИЕЙ ЭКСТРЕМУМА
Применен для указанной функции: y=(x+2)*(x-4)
ВВОД ИСХОДНЫХ ДАННЫХ края диапазона поиска, точность по аргументу ИЛИ по функции
Одномерная оптимизация методом локализации экстремума
ЗАДАЧА найти минимум указанной ниже функции
• y=(x+2)*(x-4)
в интервале, определяемом пользователем
введите левую границу диапазона поиска=-10
введите правую границу диапазона поиска=10
ВОПРОС завершение работы по минимальному изменению функции? Да=1 нет=00
введите допустимую погрешность по аргументу:0.1
очередная итерация
аргумент:-5 функция:27
аргумент:0 функция:-8
аргумент:5 функция:7
аргумент:10 функция:72
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0 минимальная функция:-8
очередная итерация
аргумент:-2.5 функция:3.25
аргумент:0 функция:-8
аргумент:2.5 функция:-6.75
аргумент:5 функция:7
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0 минимальная функция:-8
очередная итерация
аргумент:-1.25 функция:-3.9375
аргумент:0 функция:-8
аргумент:1.25 функция:-8.9375
аргумент:2.5 функция:-6.75
Часть вывода вырезана
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:1.0156 минимальная функция:-8.9998
очередная итерация
аргумент:0.97656 функция:-8.9995
аргумент:1.0156 функция:-8.9998
аргумент:1.0547 функция:-8.997
аргумент:1.0938 функция:-8.9912
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:1.0156 минимальная функция:-8.9998
очередная итерация
аргумент:0.99609 функция:-9
аргумент:1.0156 функция:-8.9998
аргумент:1.0352 функция:-8.9988
аргумент:1.0547 функция:-8.997
В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент:0.99609 минимальная функция:-9
ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1
ВОПРОС выводить график? Да=1 нет=0 1
вывод результатов
номер= 1 аргумент=-10.000 функция=112.000
номер= 2 аргумент= -5.000 функция= 27.000
номер= 3 аргумент= 0.000 функция= -8.000
номер= 4 аргумент= 5.000 функция= 7.000
номер= 5 аргумент= 10.000 функция= 72.000
номер= 6 аргумент= -5.000 функция= 27.000
номер= 7 аргумент= -2.500 функция= 3.250
номер= 8 аргумент= 0.000 функция= -8.000
номер= 9 аргумент= 2.500 функция= -6.750
номер= 10 аргумент= 5.000 функция= 7.000
номер= 11 аргумент= -2.500 функция= 3.250
номер= 12 аргумент= -1.250 функция= -3.938
номер= 13 аргумент= 0.000 функция= -8.000
номер= 14 аргумент= 1.250 функция= -8.938
номер= 15 аргумент= 2.500 функция= -6.750
Часть вывода вырезана
номер= 39 аргумент= 1.055 функция= -8.997
номер= 40 аргумент= 1.094 функция= -8.991
номер= 41 аргумент= 0.977 функция= -8.999
номер= 42 аргумент= 0.996 функция= -9.000
номер= 43 аргумент= 1.016 функция= -9.000
номер= 44 аргумент= 1.035 функция= -8.999
номер= 45 аргумент= 1.055 функция= -8.997
НАЙДЕН МИНИМУМ
оптимальное значение аргумента=0.99609
минимум функции=-9 с точностью:0.0017548