- •Оглавление
- •Глава 1. Краткие основы работы в matlab
- •1.1. Интерфейс.
- •1.2. Редактирование м-файлов
- •1.3. Построение графиков
- •1.4. Построение поверхности
- •1.5. Операции с матрицами.
- •1.6. Нелинейные уравнения и системы
- •1.7. Интегрирование
- •1.8. Решение обыкновенных дифференциальных уравнений и систем.
- •1.9. Поиск экстремума функции одной переменной.
- •1.10. Поиск экстремума функции нескольких переменной.
- •Глава 2. Одномерная оптимизация с применением пакета matlab минимальный шаг по аргументу
- •Минимальное изменение функции
- •2.1. Метод сканирования
- •2.2. Метод чисел Фибоначчи
- •2.3. Метод локализации экстремума
- •2.4. Метод обратного половинного шага
- •2.5. Метод золотого сечения
- •Глава 3. Двухмерная оптимизация с применением пакета matlab
- •3.1. Метод сканирования
- •3.2. Метод Гаусса–Зейделя
- •3.3. Метод пробных движений
- •Соломатин Алексей Сергеевич Решение типовых задач одномерной и многомерной оптимизации с применением пакета matlab
- •125047, Москва, Миусская пл. 9.
Глава 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. Пример применения метода сканирования