Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Система компьютерной математики Octave. Лабораторный практикум
.pdf
[x, val] = fminsearch(func, x0)
– кроме точки минимума функция
возвращает само минимальное значение;
[x, val] = fminsearch(func, x0, options)
значение, используя при этом заданные с помощью функции
– находит минимальное
optimset
пара-
метры поиска.
В следующем примере зададим максимальное число итераций (параметр
'MaxIter') и точность определения точки минимума (параметр 'TolX');
fn = @(x) x(1)./(1 + x(1).^2 + x(2).^2);
opt = optimset('MaxIter',1000,'TolX',1e-5);
[u,val]=fminsearch(fn,[2;1],opt)
Получим
u =
1.0000e+000
2.4600e-006
val = -0.50000
Таким образом, точка, в которой достигается минимум, имеет координаты
x=1, y=0, а само значение минимума равно -0.5. Однако рассматриваемая функ-
ция имеет еще одну точку локального минимума. Мы получим ее, если изменим "стартовую" точку:
[u,val]=fminsearch(fn,[-2;-1],opt)
Результат:
u =
-1.0000e+000
-2.4600e-006
val = -0.50000
Понятно, что выбирать начальную точку наугад нет смысла. Предварительно следует приблизительно определить размещение точек минимума. Построим
для этого линии уровня функции fn с помощью функции
[x1, x2, y1, y2])
. Она строит линии уровня функции двух переменных в
ezcontourf(func,
прямоугольной области [x1,x2] x [y1,y2].
Перепишем функцию fn в виде функции fw двух переменных и построим
ее график. Рядом разместим шкалу
colorbar
соответствия цветов закраски
и значений функции:
fw = @(x,y) -abs(x)./(1 + x.^2 + y.^2);
ezcontourf (fw, [-3,3,-2,2]);
colorbar
grid on
Цветовую палитру графика можно изменить функцией
colormap
('имя_палитры'). На рисунке представлен график той же функ-
ции при использовании цветовой палитры 'hot':
fw = @(x,y) -abs(x)./(1 + x.^2 + y.^2);
colormap('hot');
50

ezcontourf (fw, [-3,3,-2,2]);
colorbar
grid on
Замечание. Чтобы найти максимальные значения функции f(x), следует получить минимальные значения функции –f(x), а затем сменить знак результата
на противоположный.
Пример. Найти максимальное значение функции
22
)1exp(),(
yxyxf −−=
.
Напишем программу, в которой определим функцию mf с противоположным
знаком:
mf = @(x) -exp(1-x(1).^2-x(2).^2);
[u,val] = fminsearch(mf, [1,1]);
51

max=-val
Результат:
max = 2.7183
2. Нахождение локальных и глобальных экстремумов функции при
наличии ограничений. В простых случаях можно использовать функцию
fminbnd
[xmin, fval,info,output] = fminbnd(функция, пределы,
список параметров)
где
xmin
(bnd от английского bound – ограничение). Синтаксис функции:
– точка локального минимума на заданном отрезке;
fval
info
– значение функции в этой точке;
– код возврата:
1 – получено решение;
0 – превышено максимальное число итераций;
-1 – вычисления остановлены функцией пользователя, ссылка на кото-
рую указана в списке параметров;
output
– служебная информация, в том числе количество итераций вычис-
лительного процесса.
Список параметров может содержать:
– 'FunValCheck' – указатель на функцию проверки корректности значе-
ния исследуемой функции;
– 'OutputFcn' – указатель на функцию пользователя (вызывается на
каждой итерации);
– 'TolX' – точность вычислений;
– 'MaxIter' – максимальное количество итераций;
– 'MaxFunEvals' – максимальное количество вычислений значения ис-
следуемой функции.
Пример:
fn = @(x) x + abs(x.^2-4*x+3);
[xmin,fval,info] = fminbnd(fn,0,4)
Вывод:
xmin = 1.0000
fval = 1.0000
info = 1
Для контроля построим график функции на отрезке [0, 4]:
h = ezplot(fn, [0,4]);
set(h,'linewidth',3);
grid on
52

Для нахождения максимума найдем минимум "перевернутой" функции. Для
этого умножим исходную функцию на -1, а потом поменяем знак результата.
Судя по графику, мы должны получить максимум в точке x=4. Но на самом деле результат другой:
xmax = 2.5000
fval = 3.2500
info = 1
То есть мы нашли точку локального, а не глобального максимума!
Для поиска глобальных экстремумов функции на заданном отрезке можно
определить значения локальных экстремумов и сравнить их со значениями функции на концах отрезка-ограничения. Но самый простой вариант – использовать
встроенные функции
fn = @(x) x + abs(x.^2-4*x+3);
X=0:0.1:4;
Y=fn(X);
% ----- min ------ymin = min(Y);
for i=1:length(X)
w=X(i);
if (fn(w)==ymin) disp([w,ymin])
min
и
max
. Напишем программу для нашего случая:
53

end
end
% ----- max ------ymax = max(Y);
for i=1:length(X)
w=X(i);
if (fn(w)==ymax) disp([w,ymax])
end
end
Недостатком этого подхода является экспоненциальный рост количества
вычислений при необходимости повысить точность результата: для получения
следующей цифры значения x нужно уменьшить шаг по оси x в 10 раз. Однако
можно существенно снизить количество вычислений, если одновременно в 10
раз уменьшать интервал поиска.
Для нахождения экстремумов функций нескольких переменных используем
функцию Octave
1
sqp
. Имя функции есть аббревиатура слов sequential quadratic
programming – "последовательное квадратичное программирование", основной
идеей которого является последовательное решение задач квадратичного программирования, аппроксимирующих данную задачу оптимизации. Заметим, что
для решения задачи квадратичного программирования можно использовать и
функцию
qp
2
.
Рассмотрим общую задачу нелинейного программирования с ограничения-
ми типа равенств и неравенств. Будем искать минимум целевой функции F(x)
при ограничениях g(x) = 0 и h(x) >= 0. Часть неравенств можно задать в виде
ограничений на вектор независимых переменных: lb <= x <= ub.
min F(x)
g(x) = 0
h(x) >= 0
lb <= x <= ub
Наиболее полный синтаксис функции
[x, y, info, iter, nf, lambda] =
= sqp (x0, F, g, h, lb, ub, maxiter, tol)
Аргументы функции:
x0 – начальное приближение;
F – целевая функция;
g – ограничения равенства;
h – ограничения неравенства;
lb – нижняя граница (lower bound) для x;
ub – верхняя граница (upper bound) для x;
maxiter – максимальное число итераций (по умолчанию 100);
tol – точность решения (по умолчанию равна
1
В Matlab аналогичная функция называется fmincon.
2
В Matlab аналогичная функция называется quadprog.
54
ε
).

При вызове функции обязательными являются первые два параметра –
начальное приближение x0 и целевая функция F.
Возвращаемые значения:
x – координаты точки минимума;
y – значение целевой функции в точке минимума;
info – код возврата:
101 – получено корректное решение, все ограничения выполняются
с заданной точностью;
102 – ошибка алгоритма;
103 – выполнено максимальное количество итераций;
104 – расчет остановлен из-за слишком медленного приближения
к точке минимума;
iter – выполненное количество итераций.
Последние два параметра, возвращаемые функцией, на практике не исполь-
зуются.
Приведем примеры.
Задача 1. Найти точку минимума и наименьшее значение целевой функции
22
3)2(),( yxyxf +−= на
прямоугольнике
[0; 3]x[1; 5],
включая его границу
.
Решение. Заменим переменные
ция запишется в виде
F = @(x) (x(1)-2).^2 + 3*x(2).^2;
Зададим ограничения на
lb=[0;1]; % 0<=x(1)<=3
ub=[3;5]; % 1<=x(2)<=5
x(1) и x(2):
Выберем начальную точку
x0=[1;3];
Вызовем функцию
[res,val,info]=sqp(x0,F,[],[],lb,ub)
Поскольку параметры
sqp
g и h
ратными скобками. Последние параметры
этому они получат значения по умолчанию
Возвращаем мы только первые три параметра
x, y
вектором
x(1), x(2),
отсутствуют, то они заменяются пустыми квад
(maxiter и tol)
.
–
координаты точки миниму
ма, значение целевой функции в этой точке и код возврата
Результат
:
тогда целевая функ
тоже отсутствуют, по
.
-
-
-
-
res =
2.0000
1.0000
val = 3
info = 101
55

(
)
(
)
Задача 2. Найти точку минимума и наименьшее значение целевой функции
22
3)2(),( yxyxf +−= на
окружности
22
=+ yx .
16
Приведем сразу программу
F = @(x) (x(1)-2).^2 + 3*x(2).^2;
g = @(x) x(1).^2 + x(2).^2-16;
x0=[1;3];
[res,val,info]=sqp(x0,F,g)
и результат
res =
4.0000e+000
-8.7558e-009
val = 4.0000
info = 104
Код возврата
изменения переменной
шение действительно является решением поставленной задачи
Функция
график этой функции
sqp
104
означает, что вычисления остановлены, так как величина
x
не
всегда находит правильное решение. Рассмотрим функцию
.
стала очень маленькой. Тем не менее полученное ре
22
134),( yxxxyxf +⋅+−+=
на прямоугольнике
[0;4]x[-1;1].
.
Построим
-
x=0:0.05:4; y=-1:0.05:1;
[X,Y]=meshgrid(x,y);
Z=(X+abs(X.^2-4*X+3)).*(1+Y.^2);
contourf(X,Y,Z,40)
colormap('hsv')
colorbar
56

Мы видим на графике две точки локального минимума (1;0) и (3;0) и седло-
вую точку (2.5; 0). Посмотрим, что выдаст функция
sqp
, если в качестве
начальных приближений мы возьмем значения, близкие к этим точкам:
F = @(x) (x(1)+abs(x(1).^2-4*x(1)+3))*(1+x(2).^2);
lb=[0;-1]; ub=[4;1];
x0 = [2.4;0.5]
[x,y,info,iter]=sqp(x0,F,[],[],lb,ub)
x0 = [2.5;0.5]
[x,y,info,iter]=sqp(x0,F,[],[],lb,ub)
x0 = [2.6;0.5]
[x,y,info,iter]=sqp(x0,F,[],[],lb,ub)
Сведем полученные результаты в таблицу.
x0 x y info iter
2.40000
1.0000e+000
1.0000 104 23
0.50000
2.50000
7.5977e-005
2.5000e+000
3.2500 104 3
0.50000
2.60000
-3.7359e-009
3.0000e+000
3.0000 104 21
0.50000
Получили неожиданный результат: функция
1.2271e-006
sqp
определила седловую точ-
ку как точку локального минимума.
3. Решение задачи линейного программирования. Задача, в которой
и целевая функция, и все ограничения линейны, называется задачей линейного
программирования. В этом случае вместо функции
функцию
glpk
3
из библиотеки GLPK – GNU Linear Programming Kit – свободно
sqp
нужно использовать
распространяемого пакета для решения задач линейного программирования.
Пакет предназначен для решения задач линейного программирования большой
размерности. Помимо стандартного набора алгоритмов для решения задач линейного программирования с непрерывными переменными (прямой, двойственный и прямо-двойственный варианты «симплекс-метода»), пакет позволяет решать задачи с целочисленными и булевыми переменными «методом ветвей и границ» в сочетании с различными вариантами «методов отсечений».
Кроме того, пакет уже давно включает реализацию метода внутренней точки
(primal-dual interior-point), который оказывается эффективным при решении некоторых задач линейного программирования большой размерности. Отметим
еще, что автором этого пакета является российский программист, доцент МАИ
к.т.н. А.О. Махорин.
Математическая формулировка задачи:
Найти min [ или max ] C'*x
при ограничениях типа равенств и неравенств
A*x = [или <= или >=] b
3
В MatLab аналогичная функция называется linprog.
57

Часто в задаче линейного программирования выделяют ограничения на
компоненты вектора решения в виде
ния снизу), например x>=0 (условия неотрицательности) и/или
x >= LB
(ограничение компонент реше-
x <= UB
(ограничение компонент решения сверху).
Синтаксис вызова функции достаточно сложен:
[xopt, fopt, errnum, extra] = glpk (C, A, B, LB, UB,
ctype, vartype, sense, param)
Входные параметры:
C – вектор-столбец коэффициентов целевой функции;
A – матрица коэффициентов системы линейных ограничений;
B – вектор-столбец правых частей системы ограничений;
LB
– вектор-столбец ограничений снизу для неизвестных, по умолчанию
все значения равны нулю;
UB
– вектор-столбец ограничений сверху для неизвестных, по умолчанию
все значения равны бесконечности (Inf);
ctype
– символьная строка, i-тый символ которой определяет характер
i-того ограничения в матрице A:
'S'
– ограничение равенства: A(i,:)*x = b(i);
'U'
– ограничение сверху: A(i,:)*x<= b(i);
'L'
– ограничение снизу: A(i,:)*x >= b(i);
vartype
'D'
– двойное ограничение: A(i,:)*x >= -b(i) и A(i,:)*x <= b(i);
– символьная строка, i-тый символ которой определяет тип i-той
переменной:
sense
'C'
– x(i) принимает вещественные значения;
'I'
– x(i) принимает только целые значения;
– параметр определяет тип задачи:
1 – нахождение минимума целевой функции;
-1 – нахождение максимума целевой функции;
param
– большой набор дополнительных параметров, с помощью которых программист может управлять ходом решения задачи. Обычно этот параметр не используется.
Выходные параметры:
xopt
fopt
errnum
– найденная точка экстремума;
– значение целевой функции в точке экстремума;
– код ошибки:
0 – нет ошибок;
1–19 – обнаружена ошибка (подробности – в системе помощи);
extra
– дополнительная информация, в частности, поле time содержит
время решения задачи.
Приведем пример использования функции glpk.
Пример. Найти максимум функции у = x+y при ограничениях:
4x+y<=5;
58

x+4y<=5;
x>=0, y>=0.
В программе зададим часть параметров до вызова функции glpk:
C = [1; 1];
A = [4,1; 1,4];
B = [5; 5];
Значения остальных параметров зададим при вызове функции (многоточие
означает, что оператор продолжается на следующей строке):
[xopt, fmax, errnum] = ...
glpk(C, A, B, [], [], 'UU','CC', -1)
Напомним, что пустые скобки для параметра LP означают нулевые значения
для ограничений снизу, а для параметра UP – бесконечные значения для ограничений сверху множества допустимых решений.
Получим результат:
xopt =
1
1
fmax = 2
errnum = 0
Нулевой код ошибки чаще всего означает, что задача решена верно. Однако,
необходимо дополнительно проверять и значение переменной
extra.status
Перечислим ее возможные значения:
1 – статус решения не определен;
2 – получено допустимое (но, может быть, неоптимальное) решение;
3 – получено недопустимое решение;
4 – отсутствие допустимых решений;
5 – получено оптимальное решение;
6 – неограниченное возрастание или убывание целевой функции.
Дополним список возвращаемых значений параметром
extra
, тогда
в выводе появится следующая информация:
extra =
scalar structure containing the fields:
lambda =
0.20000
0.20000
redcosts =
0
0
time = 0
status = 5
.
Значение переменной
ченного решения.
status
, равное 5, подтверждает корректность полу-
59
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
