МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ ОБРАТНЫМ ПОЛОВИННЫМ ШАГОМ

Применен для указанной функции: y=(x+2)*(x-4)

ВВОД ИСХОДНЫХ ДАННЫХ края диапазона поиска, точность по аргументу ИЛИ по функции

метод обратным половинным шагом

для одномерного поиска экстремума указанной ниже функции

y=(x+2)*(x-4)

исходные данные

введите левую границу интервала поиска -10

введите правую границу интервала поиска 10

ВОПРОС завершение работы по минимальному изменению функции? Да=1 нет=00

введите допустимую погрешность по аргументу:0.1

аргумент:-9.8 функция:107.64

аргумент:-9.6 функция:103.36

аргумент:-9.4 функция:99.16

аргумент:-9.2 функция:95.04

аргумент:-9 функция:91

аргумент:-8.8 функция:87.04

Часть вывода вырезана

аргумент:-0.2 функция:-7.56

аргумент:-2.0539e-015 функция:-8

аргумент:0.2 функция:-8.36

аргумент:0.4 функция:-8.64

аргумент:0.6 функция:-8.84

аргумент:0.8 функция:-8.96

аргумент:1 функция:-9

аргумент:1.2 функция:-8.96

В отличии от приведенного выше примера, работа при достижении минимального изменения функции завершена не была, поэтому произошла смена знака шага по аргументу и его уменьшение вдвое.

dx = -0.1000

аргумент:1.1 функция:-8.99

аргумент:1 функция:-9

xeps

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1

ВОПРОС выводить график? Да=1 нет=0 1

вывод результатов

номер= 1 аргумент= -9.800 функция=107.640

номер= 2 аргумент= -9.600 функция=103.360

номер= 3 аргумент= -9.400 функция= 99.160

номер= 4 аргумент= -9.200 функция= 95.040

номер= 5 аргумент= -9.000 функция= 91.000

номер= 6 аргумент= -8.800 функция= 87.040

Часть вывода вырезана

номер= 54 аргумент= 0.800 функция= -8.960

номер= 55 аргумент= 1.000 функция= -9.000

номер= 56 аргумент= 1.200 функция= -8.960

номер= 57 аргумент= 1.100 функция= -8.990

номер= 58 аргумент= 1.000 функция= -9.000

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=1 с точностью (по аргументу):0.1

минимум функции=-9 с точностью (по функции):0.01

выполнено:58 итераций

 

Метод золотого сечения

В основе этого метода лежит правило геометрического отношения или золотого сечения:

или ,

где – длина всего отрезка; – длина его большей части; – длина его меньшей части.

Рис. 2.5. Графическая иллюстрация правила золотого сечения

 

В соответствии с этим правилом определяются точки исследуемого интервала, в которых необходимо производить вычисление функции .

Из рис. 2.5 следует, что:

. (1)

Тогда, подставляя в (1) соотношение (2) получим:

 

. (2)

Обозначив отношение и подставив его в (2), получим:

, (3)

откуда следует:

. (4)

Решение этого уравнения дает:

. (5)

Поскольку , то его значение принимается равным:

. (6)

R
х3
х1
х2
х4
хmin
хmax

Рис. 2.6. Графическая иллюстрация метода золотого сечения

На исследуемом интервале (рис. 2.6) определяются две точки X1 = Xmin + k²a и X2 = Xmin + ka, где а – длина интервала [Xmin, Xmax]. Находим значения функции в точках Xmin, X1, X2, Xmax. Если наименьшее значение R будет соответствовать точке X1, то новым интервалом поиска будет [Xmin, X2], и на этом интервале находится новая точка X3 = Xmin + k²a, где ka – длина интервала [Xmin, X2] Если наименьшее значение R будет в соответствовать точке X2, то новым интервалом поиска будет [X1, Xmax], и на этом интервале находится новая точка X4 = X1 + ka, где ka – длина интервала [X1, Xmax]. Затем процедура повторяется. Абсолютная ошибка в определении экстремума после s вычислений будет вычисляться по формуле:

. (7)

Далее приведен текст программы, позволяющий реализовать описанный выше алгоритм.

function[]=ZolotSechenie1D_170809();

function y=f(x)

y=(x+2).*(x-4);

end

disp('МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ МЕТОДОМ ЗОЛОТОГО СЕЧЕНИЯ');

disp('Применен для указанной функции: y=(x+2)*(x-4)');

disp('ВВОД ИСХОДНЫХ ДАННЫХ точность по аргументу, края диапазона поиска');

function [x,y,xleft1,xright1,nn]=ZolS1()

eps=input('точность=');

xleft=input('левый край поиска=');

xright=input('правый край поиска=');

xleft1=xleft; %возвращаемые значения

xright1=xright; %возвращаемые значения

k=(sqrt(5)-1)/2; %число К, показывающее отношения длин отрезков

x1=xleft+k*k*abs(xleft-xright);

x2=xleft+k*abs(xleft-xright);

z=0;

j=0;

nn=1;

disp('ВЫВОД ПРОМЕЖУТОЧНЫХ РЕЗУЛЬТАТОВ ПОШАГОВО ');

while abs(xleft-xright)>eps

R1=f(x1);

R2=f(x2);

if R1<R2 % если минимум в точке Х1

z=x1; % для возвращения значения минимума

j=R1; % для возвращения значения минимума

%для следующей итерации подготавливаем интервал с четырьмя точками по правилу золотого сечения вместо xleft,x1,x2

xright=x2;

x2=x1;

x1=xleft+k*k*abs(xleft-xright);

%возвращаемые значения

mas1x(nn)=x1;

mas1y(nn)=R1;

else %если минимум в точке Х2

z=x2;

j=R2;

%для следующей итерации подготавливаем интервал с четырьмя точками по правилу золотого сечения вместо x1,x2,xright

xleft=x1;

x1=x2;

x2=xleft+k*abs(xleft-xright);

%возвращаемые значения

mas1x(nn)=x2;

mas1y(nn)=R2;

end %конец if

%вывод на экран минимума функции и соответствующего аргумента соответствующего аргумента для выполнения итерации

string=strcat('шаг номер:',int2str(nn),' аргумент:',num2str(mas1x(nn)),' функция от него:',num2str(mas1y(nn)));

disp(string);

nn=nn+1;

end %конец while

%возвращаемые значения найденного минимума и возвращения значения

x=z;

y=j;

nn=nn-1;

end

%обращение к функции методом золотого сечения

[x,y,xleft1,xright1,nn]=ZolS1();

%выбор оформления вывода на экран

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

disp('НАЙДЕН МИНИМУМ')

sx=strcat('оптимальное значение аргумента=',num2str(x),' с точностью:',num2str(abs(mas1x(nn)-mas1x(nn-1))));

sy=strcat('минимум функции=',num2str(y),' с точностью:',num2str(abs(mas1y(nn)-mas1y(nn-1))));

sn=strcat('выполнено:',num2str(nn),' итераций');

disp(sx) % вывод на экран

disp(sy)

disp(sn)

% подготовка к построению графика

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 Gold 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)

ВВОД ИСХОДНЫХ ДАННЫХ точность по аргументу, края диапазона поиска

точность=0.1

левый край поиска=-10

правый край поиска=10

ВЫВОД ПРОМЕЖУТОЧНЫХ РЕЗУЛЬТАТОВ ПОШАГОВО

шаг номер:1 аргумент:5.2786 функция от него:-7.1486

шаг номер:2 аргумент:0.55728 функция от него:-7.1486

шаг номер:3 аргумент:-0.55728 функция от него:-8.804

шаг номер:4 аргумент:1.2461 функция от него:-8.804

Часть вывода вырезана

шаг номер:9 аргумент:0.92089 функция от него:-8.9997

шаг номер:10 аргумент:1.0214 функция от него:-8.9997

шаг номер:11 аргумент:0.95928 функция от него:-8.9997

шаг номер:12 аргумент:0.99767 функция от него:-8.9997

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1

ВОПРОС выводить график? Да=1 нет=0 1

вывод результатов

номер= 1 аргумент= 5.279 функция= -7.149

номер= 2 аргумент= 0.557 функция= -7.149

номер= 3 аргумент= -0.557 функция= -8.804

номер= 4 аргумент= 1.246 функция= -8.804

номер= 5 аргумент= 1.672 функция= -8.939

номер= 6 аргумент= 0.983 функция= -8.939

номер= 7 аргумент= 0.820 функция= -9.000

номер= 8 аргумент= 1.084 функция= -9.000

номер= 9 аргумент= 0.921 функция= -9.000

номер= 10 аргумент= 1.021 функция= -9.000

номер= 11 аргумент= 0.959 функция= -9.000

номер= 12 аргумент= 0.998 функция= -9.000

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=0.98301 с точностью:0.038388

минимум функции=-8.9997 с точностью:0

выполнено:12 итераций

Рис. 2.7. Пример применения метода золотого сечения