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

Базовые средства матпакета Scilab

.pdf
Скачиваний:
55
Добавлен:
04.04.2023
Размер:
6.29 Mб
Скачать
err
значения:

xopt – вектор аргументов, обеспечивших оптимальное значение функции;

gopt – градиент целевой функции (или производной в случае одномерной оптимизации) в точке xopt;

work – рабочий массив перезапуска для Квази-Ньютоновских методов. iters – скаляр, число итераций, которое отображается при iprint=2. evals – скаляр, число вычислений функции cost, которое отображается

при iprint=2.

– скаляр, индикатор завершения, может иметь следующие

err=1 – норма вычисленного градиента ниже допустимого;

err=2 – на последней итерации f уменьшается;

err=3 – оптимизация останавливается из-за слишком малых

изменений для X;

err=4 – остановка: максимальное количество обращений к f;

err=5 – остановка: максимальное количество итераций;

err=6 – остановка: слишком маленькие изменения в

направлении градиента;

err=7 – остановка: во время расчета направления спуска;

err=8 – остановка: во время расчета оценки матрицы Гессе;

err=9 – окончание оптимизации, успешное завершение;

err=10 – успешное окончание оптимизации (линейный поиск

не выполняется).

Каждый алгоритм, реализованный в optim, имеет свои собственные критерии завершения, которые могут использовать параметры, полученные от пользователя, такие как: nap, iter, epsg, epsf и epsx.

Рассмотрим пример использования решателя optim для случая решения задачи оптимизации одномерной функции f(x)=x4+3x3-13x2-6x+26, имеющей на отрезке [-4;-2] единственный минимум (исследование которой приведено выше на рис. 2.7.1-2 и 2.7.1-3), выбрав в качестве начальной точки х0=-3 (рис. 2.7.3-1). В нашем случае используется достаточно простой формат функции optim – передается имя вспомогательной функции (costf) и начальное значение аргумента (х0), а в качестве выходных параметров выступают координаты точки минимума функции f(х).

271

-->// Нахождение координат точки минимума с использованием решателяoptim

--> -->exec('РИС2731.sce'); -->x0 = -3;

--> // Вычисление координат точки минимума

--> [fmin, xmin] = optim(costf, x0); // Обращение к функции optim --> disp([fmin, xmin])

-95.089413 -3.8407084

Рис. 2.7.3-1. Нахождение координат точки минимума функции f(x)с использованием решателя optim

В примере, приведенном на рис. 2.7.3-1 для вычисления производной используется функция numderivative, что позволяет устранить проблему получения аналитических выражений производных в случае сложного выражения целевой функции. Однако использовать эту функцию совсем необязательно. Так, например, на рис. 2.7.3-2 приведен сценарий, в котором для вычисления значений производной используется аналитическое выражение.

Рис. 2.7.3-2. Вычисление производной с использованием ее математического выражения

272

В следующем примере (рис.2.7.3-3) определим координаты точки минимума и значение многомерной функции Розенброка:

f(x1,x2)=100(x2-x12)2+(1-x1)2,

с использованием того же упрощенного формата функции optim. Ранее (рис.2.7.1-4) в качестве начального приближения уже был выбран вектор начальных значений [0,0].

--> // Нахождение минимума многомерной функции f(x1,x2)

-->

-->exec('РИС2733.sce', 0);

-->x0 = [0; 0]; // Начальныезначения

--> [f,

xopt] = optim(cst, x0);

// Обращение к функции optim

disp(f, [xopt']);

 

1.

1.

 

.083D-30

 

Рис. 2.7.3-3. Использование функции optim для нахождения координат точки минимума многомерной функции f(x1,x2)

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

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

273

--> // Загрузка сценария РИС2734

--> // и обращение к решателю optim с дополнительными параметрами

--> //

--> // exec('РИС2734.sce', 0)

 

Xopt =

1.2.3.; fopt=0.;

gopt= 0.0.0.

Xopt =

1. 2. 3.; fopt=0.;gopt=

0.-1.776D-14-1.199D-14

xopt=1. 2. 3.; fopt=2.297D-28; gopt=-0.5-1.0.

xopt=0.5 1.3.;fopt=0.625;

gopt=-0.5 -1. 0.

xopt=0.5 1. 3.;fopt=0.625; gopt=-0.5 -1.5559108 -0.7779554

xopt=0.5 1. 2.2220446 fopt=1.6380365 gopt=-0.5 -1.8308232 -0.9154116 xopt=0.5 1. 2.0845884 fopt=2.2199459

***** enters -qn code- (without bound cstr)

dimension=3, epsq=0.2220446049250313E-15, verbosity level: iprint=3

274

max number of iterations allowed: iter=100

max number of calls to costf allowed: nap=100

------------------------------------------------

iter num

 

1, nb calls=1, f=6.500

linear search: initial derivative=-3.606

 

 

 

step length=0.1000E-01, df=-0.4261, derivative=-3.485

 

 

 

step length=0.1000, df=-3.611, derivative=-2.404

iter num

 

2, nb calls=3, f=2.889

linear search: initial derivative=-2.404

 

 

 

step length=1.000,df=-2.889,derivative=0.3695E-15

iter num

 

3, nb calls=4, f=0.9861E-30

linear search: initial derivative=-0.1380E-14

 

 

 

step length=1.000,df=0.4142E-29, derivative=0.3192E-14

 

 

 

step length=0.2996,df=-0.9861E-30,derivative=0.0000E+00

iter num

 

4, nb calls=6, f=0.0000E+00

***** leaves -qn code-, gradient norm=0.0000000000000000E+00

optim: Норма проектируемого градиента ниже, чем 0.

xopt=1.2.3.fopt=0.

 

 

x0 =

 

1.

-1.

1.

 

xopt =

 

1.

2.

3.

 

fopt = 0.

 

 

 

gopt =

 

0.

0.

0.

 

xopt =

 

1.

2.

3.

 

fopt

=

0.

 

 

 

gopt

=

0. -1.776D-14 -1.199D-14

xopt

=

1.

2.

3.

 

fopt

=

2.297D-28

 

gopt

= -0.5 -1. 0.

 

xopt

=

0.5

1.

3.

 

fopt

=

0.625

 

 

gopt

= -0.5

-1.

0.

 

xopt

=

0.5

1.

3.

 

fopt

=

0.625

 

 

gopt

= -0.5

-1.5559108

-0.7779554

xopt

=

0.5

1.

2.2220446

fopt

=

1.6380365

 

 

gopt

= -0.5

-1.8308232

-0.9154116

xopt

=

0.5 1.

2.0845884

fopt

=

2.2199459

 

 

***** enters -qn code- (without bound cstr)

 

 

 

 

 

 

dimension=

3, epsq=

0.2220446049250313E-15, verbosity level: iprint=

3

 

 

 

 

 

 

 

 

 

max number of iterations allowed: iter=

 

100

 

 

 

 

 

max number of calls to costf allowed: nap=

100

 

 

 

 

 

------------------------------------------------

 

 

 

 

 

iter num

1, nb calls=

1, f= 6.500

 

 

 

 

 

 

linear search: initial derivative= -3.606

 

 

 

 

 

 

 

step length= 0.1000E-01, df=-0.4261

, derivative= -3.485

 

step length= 0.1000

, df= -3.611

, derivative= -2.404

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

275

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f=costf(X),

iter num

2,

nb calls=

3, f= 2.889

linear search: initial derivative= -2.404

 

 

step length=

1.000, df= -2.889, derivative= 0.3695E-15

iter num

3, nb calls=

4, f= 0.9861E-30

linear search: initial derivative=-0.1380E-14

 

 

step length=

1.000, df= 0.4142E-29, derivative= 0.3192E-14

 

 

step length= 0.2996, df=-0.9861E-30, derivative= 0.0000E+00

iter num

4, nb calls=

6, f= 0.0000E+00

***** leaves -qn code-, gradient norm= 0.0000000000000000E+00 optim: Норма проектируемого градиента ниже, чем 0.

xopt = 1. 2. 3. fopt = 0.

Рис. 2.7.3-4. Применение дополнительных параметров при использовании функции optim

Решатель fminsearch

Решатель fminsearch вычисляет безусловный минимум функции по алгоритму Нелдера-Мида и имеет следующие форматы [13]:

X=fminsearch(costf,х0) X=fminsearch(costf,х0,options) [X,fval]=fminsearch(costf,х0,options) [X,fval,exitflag]=fminsearch(costf,х0,options)

[X,fval,exitflag,output]=fminsearch(costf,х0,options)

Этот решатель является алгоритмом прямого поиска, не использующим производную целевой функции, а основан на обновлении симплекса, который является набором k>=n+1 вершин, где каждая вершина связана с одной точкой и одним значением функции. Алгоритм создан на базе neldermead компонент [13].

Рассмотрим подробнее назначение параметров:

Входные параметры:

сostf внешняя функция, которая возвращает значение целевой функции и имеет следующий заголовок

где X– текущая точка;

f – значение целевой функции;

X0 – матрица начальных значений;

options структура данных, содержащая настраиваемые параметры алгоритма оптимизации, значения которых и определяют

конфигурацию алгоритма fminsearch, причем fminsearch чувствительна к следующим опциям:

options.MaxIter – максимальное количество итераций, значение по умолчанию – 200*n, где n- количество переменных;

276

еxitflag
-1

options.MaxFunEvals – максимальное количество оценок функции затрат, значение по умолчанию – 200*n, где n – количество переменных;

options.TolFun – абсолютный допуск по значению функции, значение которого по умолчанию – 1.e-4;

options.TolX – абсолютный допуск на размер симплекса, значение по умолчанию – 1.e-4;

options.Display – подробный уровень, для которого возможны значения: "notify","iter","final" или "off", значение по умолчанию –

"notify";

options.OutputFcn – выходная функция или список выходных функций;

options.PlotFcns – функция печати или список функций печати.

Выходные параметры:

X – значение аргумента, обеспечившее минимальное значение функции;

fval– минимальное значение функции.

– флаг, связанный со статусом выполнения алгоритма:

– максимальное количество итераций достигнуто;

0– максимальное число оценок функций достигнуто;

1– допуск на размер симплекса и его изменения уже достигнут: алгоритм не имеет сходимости;

output – структура

данных,

которая хранит информацию о

выходных данных и содержит следующие поля:

output.algorithm

строка,

содержащая название алгоритма,

то есть алгоритма Нелдера-Мида;

 

output.funcCount – количество оценок функции; output.iterations – количество итераций;

output.message – строка, содержащая сообщение о завершении.

Критерии прекращения процесса оптимизации используют следующие переменные:

ssize – текущий размер симплекса;

shiftfv – абсолютное значение разности значения функции между самой высокой и самой низкой вершиной.

Процесс итерации останавливается, если выполняются следующие

условия: ssize<options.TolFun&shiftfv<options.TolFun.

Алгоритм, заложенный в fminsearch использует специальный начальный симплекс, который вычисляется эвристически в зависимости от начального предположения (подробнее см. в документации о optimsimplex

[x]) .

В следующих примерах для вычисления минимума функции Розенброка воспользуемся решателем fminsearch, описав предварительно

277

функцию под именем banana, и задав начальные значения поиска [-1.2 1.0]. В данном случае для поиска минимума потребовалось выполнение 85 итераций и 159 обращений к функции оценки (рис. 2.7.3-5).

--> // Загрузка сценария РИС2735

--> // и вычисление минимума с использованием решателя fminsearch

-->

--> exec('РИС2735.sce', 0)

[output.Output, output.funcCount, output.iterations, output.message] exitflag =

1. fval =

0.00000000081776611 x =

1.0000220217835567 1.0000422197517711

--> mprintf('algorithm = %c\nfuncCount = %4d\niterations = %3d',… output.algorithm, output.funcCount, output.iterations);

algorithm = Nelder-Mead simplex direct search funcCount = 159

iterations = 85 --> output.message ans =

!Optimization terminated:

!

! the current x satisfies the termination criteria using OPTIONS.TolX of 0.0001 ! and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 0.0001 !

Рис. 2.7.3-5 Вычисление минимума функции Розенброка с использованием решателя fminsearch

Далее рассмотрим пример вычисление минимума функции Розенброка решателем fminsearch с настраиваемыми опциями. Настроим абсолютный допустимый размер симплекса до большего значения, так чтобы алгоритм выполнял меньшее количество итераций. Поскольку по умолчанию значение tolX=1.e-4, заменим его в optimset на большее значение, например, 1.e-2. В данном случае потребовалось 70итераций и 130обращений к функции оценки (рис. 2.7.3-6).

278

-->// Загрузка сценария РИС2735, настройка некоторых опций -->// и вычисление минимума с использованием решателяfminsearch

--> exec('РИС2736.sce', 0)

options =

Display: [0x0 constant] FunValCheck: [0x0 constant] MaxFunEvals: [0x0 constant] MaxIter: [0x0 constant] OutputFcn: [0x0 constant] PlotFcns: [0x0 constant] TolFun: [0x0 constant] TolX: [1x1 constant]

output =

algorithm: [1x1 string] funcCount: [1x1 constant] iterations: [1x1 constant] message: [3x1 string]

exitflag = 1.

fval = 0.0000085

x =

1.001016 1.0017605 -->

--> mprintf('algorithm = %c\nfuncCount = %4d\niterations = %3d',… output.algorithm, output.funcCount, output.iterations);

algorithm = Nelder-Mead simplex direct search funcCount = 130

iterations = 70 -->

--> output.message ans =

!Optimization terminated:

!

!the current x satisfies the termination criteria using OPTIONS.TolX of 0.01

!and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 0.0001

Рис. 2.7.3-6. Вычисление минимума функции Розенброка решателем fminsearch с настраиваемыми опциями

279

Решатель nmplot

Кроме описанных выше решателей optim и fminsearch, в Scilab представляет интерес решатель nmplot [13], который использует алгоритмы оптимизации прямого поиска, при этом всю информацию о процессе оптимизации на каждой итерации можно отобразить на экране или сохранить в файлах для ее последующего анализа.

Решатель nmplot включает несколько методов оптимизации прямого поиска, основанных на симплексном методе. Он является модификацией компонента neldermead, с выводом результатов, и позволяет хранить историю значений данных в процессе итераций.

Этими данные могут быть:

значения координат симплекса;

значения функции, усредненные по вершинам;

минимальные значения функции в симплексе;

размеры симплекса.

Во время процесса оптимизации эти данные хранятся в нескольких файлах.

На рис. 2.7.3-7 приведен пример только графической траектории поиска минимума функции с использованием решателя nmplot. Подробноэтотпримериспользования решателя nmplot рассмотрен в [13]. Из которого следует, что выбор направления спуска определяется симплексом.

Рис. 2.7.3-7 Траектория спуска при поиске минимума с использованием решателя nmplot

280