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

Глава 3. Двухмерная оптимизация с применением пакета matlab

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

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

X1

Рис. 3.1. Графическое представление поиска экстремума для случая двух переменных методом сканирования

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

function[]=Scanirovanie2D_050809();

function z=fz_xy2(x,y)

nx=length(x); %функция вычисляется от двух аргументов и возвращает одно значение

ny=length(y); %или функция вычисляется от векторов аргументов

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

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

for i=1:nx

for j=1:ny

z(i,j)=-sqrt(256-x(i)*x(i)-y(j)*y(j));

end

end

end

%метод сканирования 2-мерный

function[x,y,z,masx,masy,masz,xleft,xright,yleft,yright,hx]=scan2();

disp('МЕТОД ПОИСКА МИНИМУМА ФУНКЦИЙ ДВУХ ПЕРЕМЕННЫХ МЕТОДОМ СКАНИРОВАНИЯ');

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

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

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

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

yright=input('введите правую границу диапазона Y поиска!');

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

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

masx=xleft:hx:xright;

masy=yleft:hy:yright;

masz=fz_xy2(masx,masy);

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

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

numx=1;

numy=1;

nx=length(masx);

ny=length(masy);

for i=1:nx

for j=1:ny

if masz(i,j)<min

min=masz(i,j);

numx=i;

numy=j;

end

end

end

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

x=masx(numx);

y=masy(numy);

z=min;

end

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

[x,y,z,masx,masy,masz,xleft,xright,yleft,yright,hx]=scan2();

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

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

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

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

if choiceTab==1

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

for i=1:length(masx)

for j=1:length(masy)

a=(length(masy))*(i-1)+j;

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

disp(string);

end

end

end

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

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

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

sxy=strcat('оптимальные значения аргументов: х=',num2str(x),' у=',num2str(y));

sz=strcat('минимум функции=',num2str(z));

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

disp(sz)

%подготовка данных для графика

if choiceGraf==1

n=floor(abs((xright-xleft)/hx));

hy=(yright-yleft)/n;

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

masx=xleft:hx:xright;

masy=yleft:hy:yright;

masz=fz_xy2(masx,masy);

mesh(masx,masy,masz); %построена сеточная поверхность

grid on;

title(‘z=-sqrt(256-x.^2-y.^2)’);

xlabel(‘X’);

ylabel(‘Y’);

zlabel(‘Z’);

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

zeroMas=masx*0;

hold on;

%surf(zeroMas,zeroMas,masz); % построены оси

%surf(zeroMas,masy,zeroMas); % построены оси

%surf(masx,zeroMas,zeroMas); % построены оси

legend(‘z(i,j)=-sqrt(256-x(i)*x(i)-y(j)*y(j))’,0); % подписи к линиям на графике

end

end

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

МЕТОД ПОИСКА МИНИМУМА ФУНКЦИЙ ДВУХ ПЕРЕМЕННЫХ МЕТОДОМ СКАНИРОВАНИЯ

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

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

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

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

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

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

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

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

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

номер= 1 аргумент x=-10.000 аргумент y=-10.000 функция= -7.483

номер= 2 аргумент x=-10.000 аргумент y= -9.500 функция= -8.109

номер= 3 аргумент x=-10.000 аргумент y= -9.000 функция= -8.660

номер= 4 аргумент x=-10.000 аргумент y= -8.500 функция= -9.152

номер= 5 аргумент x=-10.000 аргумент y= -8.000 функция= -9.592

номер= 6 аргумент x=-10.000 аргумент y= -7.500 функция= -9.987

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

номер=1677 аргумент x= 10.000 аргумент y= 8.000 функция= -9.592

номер=1678 аргумент x= 10.000 аргумент y= 8.500 функция= -9.152

номер=1679 аргумент x= 10.000 аргумент y= 9.000 функция= -8.660

номер=1680 аргумент x= 10.000 аргумент y= 9.500 функция= -8.109

номер=1681 аргумент x= 10.000 аргумент y= 10.000 функция= -7.483

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

оптимальные значения аргументов: х=0 у=0

минимум функции=-16

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