Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
417
Добавлен:
13.02.2015
Размер:
2.51 Mб
Скачать

1.10. Поиск экстремума функции нескольких переменной.

Минимум функции нескольких переменных z=f(x1, x2, …, xn) осуществляет встроенная функция [X,Z]=fminsearch(name, x0, options) где:

  • name имя М-функции вычисляющей z=f(x1, x2, …, xn),

  • х0 вектор из n элементов, содержащих координаты точки начального приближения,

  • options параметры управляющие ходом решения,

  • Х вектор из n элементов, содержащий значения переменных, при которых функция z=f(x1, x2, …, xn) минимальна,

  • Z это и есть минимальное значение функции.

Например, [X, Z]=fminsearch(@extr, [3 2]); где @extr обращение к М-функции extr, вычисляющей значение интересующей нас функции z=x12+x22-6x2-2x1+11, причем заданы начальные приближения [3 2] для х1 и х2 соответственно. В результате получим значения переменных в точке минимума и значение функции в минимуме.

Глава 2. Одномерная оптимизация с применением пакета matlab минимальный шаг по аргументу

Если выбрано окончание процесса поиска экстремума (например, минимума) при условии, что последнее изменение аргумента стало меньше заданной минимальной величины, то это означает, что найденный ответ (то есть значение аргумента, при котором функция минимальна) указан с погрешностью, не превышающей заданную минимальную величину.

Минимальное изменение функции

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

Однако, в зависимости от вида функции, тот или другой метод может быть неудобен. Например, если функция (точнее, ее график) имеет участок с очень малым наклоном, то на этом участке может быть ложное завершение поиска по условию минимального изменения функции. Если же функция (ее график) имеет минимум, расположенный между двумя участками с большим уклоном (или у края одного такого участка), то при завершении работы по минимальному изменению аргумента может быть приемлемая погрешность по аргументу, но далеко не приемлемая погрешность по функции.

Поэтому необходимо заранее выбирать, как будет завершен процесс поиска экстремума.

2.1. Метод сканирования

Интервал, в котором проводится поиск экстремума, разбивается на равные участки определенной длины, равной шагу поиска. Далее последовательно определяется значение функции во всех точках такого деления, и среди них выбирается наименьшее или наибольшее, в зависимости от того, минимум или максимум ищется. Таким образом, экстремум может быть найден с точностью до шага поиска.

Основным достоинством данного метода является возможность найти глобальный экстремум, а недостатком – большой объем вычислений.

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

Function[]=Scanirovanie1D_030809();

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

function y=f(x)

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

%или от вектора аргумента и возвращает вектор, каждый элемент

%которого вычислен от соответствующего элемента вектора аргумента

y=(x+2).*(x-4); %поэтому перед знаком умножения * стоит точка .

%если не ставить точку с запятой ; в конце строки то произойдет

%вывод на экран

end

%метод одномерного поиска экстремума: сканирование

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

% disp означает, что на экран будет выведено сообщение, выделенное апострофом

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

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

function[x,y,masx,masy,xleft,xright,n]=scan1() ;

% в квадратных скобках указан список возвращаемых переменных.

disp('метод cканирования ')

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

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

% на экран выводится сообщение и том, что нужно ввести исходные данные:

%диапазона значений аргумента функции

disp('исходные данные')

xleft=input('введите левую границу интервала поиска ');

xright=input('введите правую границу интервала поиска ');

h=input('введите допустимую погрешность по аргументу ');

%создание массива точек

n=ceil(abs((xright-xleft)/h)); % определяем число шагов

% функция ceil округляет число в сторону плюс бесконечности

masx(1)=xleft;

masy(1)=f(xleft);

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

for i=2:n

masx(i)=masx(i-1)+h;

masy(i)=f(masx(i));

end

%вывод на экран

for i=1:n

string=strcat(‘шаг номер:’,int2str(i),’ аргумент:’,num2str(masx(i)),’ функция от него:’,num2str(masy(i));

disp(string);

% string – имя переменной, strcat – функция, которая объединяет в одну строку символов все, что указано в круглых скобках, int2str(i) – функция, которая преобразует целое число в строку символов (где в круглых скобках указано число – аргумент функции)

end

% поиск минимума

min=masy(1); % стандартный алгоритм поиска минимума

num=1;

for i=2:n

if masy(i)<min

min=masy(i);

num=i;

end

end

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

x=masx(num);

y=masy(num);

end

%обращение к функции сканирования

[x,y,masx,masy,xleft,xright,n]=scan1();

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

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

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

%вывод таблицы

if choiceTab==1 % Два раза символ «равно» используется в операторе сравнения

disp('вывод результатов');

for i=1:n

%string=strcat(‘номер=’,int2str(i),’ аргумент=’,num2str(masx(i)),’ функция=’,num2str(masy(i)));

%disp(string);

string=sprint(‘номер= %4i\tаргумент= %7.3f\tфункция= %7.3f’,i,masx(i),masy(i));

% где %4i означает 4-х значное целое число с последующим знаком табуляции: \t

% где %7.3f означает десятичную дробь: 7 знаков до запятом, 3 – после с последующим знаком табуляции: \t

disp(string);

end

end

% подготовка к выводу текста

% num2str преобразует число в строку символов

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

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

% sx – имя переменной (строки символов). В данном случае оно не имеет никакого отношения к переменной x

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

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

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

disp(sy);

disp(sn);

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

h=0.1;

x1=xleft:h:xright; % создан массив точек для графика

y1=f(x1); % создан массив точек для графика

plot(x1,y1,’k-‘);

grid on; % покрыт сеткой

title('y=(x+2)(x-4)'); % подпись над графиком

xlabel('X'); % подпись к оси x

ylabel('Y'); % подпись к оси y

text(x,y,’\leftarrow Minimum’);

zeroMas=x1*0;

hold on;

if choiceGraf==1

plot(masx,masy,’r.’); % график построен

legend(‘plot with minimal step’,’plot with your step’,0);

else

legend(‘plot with minimal step’,0);

end

hold on;

plot(x1,zeroMas,’k-‘,zeroMas,y1,’k-‘); % построены оси

end

После выполнения этой программы пользователь видит на экране соответствующий текст, вводит нужные значения и получает график:

МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ С ИСПОЛЬЗОВАНИЕМ СКАНИРОВАНИЯ

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

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

метод cканирования

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

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

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

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

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

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

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

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

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

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

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

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

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

шаг номер:16 аргумент:-2.5 функция от него:3.25

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

шаг номер:18 аргумент:-1.5 функция от него:-2.75

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

шаг номер:20 аргумент:-0.5 функция от него:-6.75

шаг номер:21 аргумент:0 функция от него:-8

шаг номер:22 аргумент:0.5 функция от него:-8.75

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

шаг номер:24 аргумент:1.5 функция от него:-8.75

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

шаг номер:26 аргумент:2.5 функция от него:-6.75

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

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

шаг номер:36 аргумент:7.5 функция от него:33.25

шаг номер:37 аргумент:8 функция от него:40

шаг номер:38 аргумент:8.5 функция от него:47.25

шаг номер:39 аргумент:9 функция от него:55

шаг номер:40 аргумент:9.5 функция от него:63.25

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

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

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

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

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

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

Рис. 2.1. Пример вывода на экран при применении метода сканирования