Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Система компьютерной математики Octave. Лабораторный практикум

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
[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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]