Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ ОБРАТНЫМ ПОЛОВИННЫМ ШАГОМ
Применен для указанной функции: 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)
Рис. 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. Пример применения метода золотого сечения Популярное:
|
Последнее изменение этой страницы: 2017-03-03; Просмотров: 635; Нарушение авторского права страницы