Компания ALT Linux
Опубликован: 24.03.2015 | Доступ: свободный | Студентов: 550 / 136 | Длительность: 19:00:00
Лекция 4:

Численные методы и программирование с Maxima

4.3.4 Оптимизация с использованием пакета lbfgs

Основная функция пакета (lbfgs(FOM,X,X0,epsilon,iprint)) позволяет найти приближенное решение задачи минимизации без ограничений целевой функции, определяемой выражением FOM, по списку переменных X с начальным приближением X0. Критерий окончания поиска определяется градиентом нормы целевой функции (градиент нормы FOM < epsilonmax(1,normX)).

Данная функция использует квазиньютоновский алгоритм с ограниченной памятью (алгоритм BFGS). Этот метод называют методом с ограниченным использованием памяти, потому что вместо полного обращения матрицы Гессе (гессиана) используется приближение с низким рангом. Каждая итерация алгоритма — линейный (одномерный) поиск, то есть, поиск вдоль луча в пространстве переменных X с направлением поиска, вычисленным на базе приближенного обращения матрицы Гессе. В результате успешного линейного поиска значение целевой функции (FOM) уменьшается. Обычно (но не всегда) норма градиента FOM также уменьшается.

Параметр функции iprint позволяет контролировать вывод сообщений о прогрессе поиска. Величина iprint[1] управляет частотой вывода (iprint[1] < 0 — сообщения не выводятся; iprint[1] = 0 — сообщения на первых и последних итерациях; iprint[1] > 0 — вывод сообщений на каждой iprint[1] итерации). Величина iprint[2] управляет объёмом выводимой информации (если iprint[2] = 0, выводится счётчик итераций, число вычислений целевой функции, её величину, величину нормы градиента FOM и длины шага). Увеличение iprint[2] (целая переменная, принимающая значения 0,1,2,3) влечёт за собой увеличение количества выводимой информации.

Обозначения колонок выводимой информации:

  • I — число итераций, которое увеличивается после каждого линейного поиска;
  • NFN — количество вычислений целевой функции;
  • FUNC — значение целевой функции в конце линейного поиска;
  • GNORM — норма градиента целевой функции в конце очередного линейного поиска;
  • STEPLENGTH — длина шага (внутренний параметр алгоритма поиска).

Функция lbfgs реализована разработчиками на Lisp путём перекодирования классического алгоритма, первоначально написанного на Фортране, поэтому сохранила некоторые архаичные черты. Однако используемый алгоритм обладает высокой надёжностью и хорошим быстродействием.

График исследуемой функции в окрестности минимума

увеличить изображение
Рис. 4.1. График исследуемой функции в окрестности минимума

Рассмотрим примеры использования lbfgs.

Простейший пример — минимизация функции одной переменной. Необходимо найти локальный минимум функции f(x) = x^3 + 3x^2 - 2x + 1. Результаты расчётов:

(%i1)	load (lbfgs);
/usr/share/maxima/5.13.0/share/lbfgs/lbfgs.mac\leqno{(\%o1) }
(%i2)	FOM:x^3+3*x^2-2*x+1;
{x}^{3}+3\,{x}^{2}-2\,x+1\leqno{(\%o2) }
(%i3) lbfgs(FOM,[x],[1.1], 1e-4, [1, 0]);

*************************************************  
  N=    1   NUMBER OF CORRECTIONS=25       
       INITIAL VALUES 
F=  3.761000000000001D+00   GNORM=  8.230000000000001D+00
*************************************************   
I  NFN     FUNC                    GNORM                   STEPLENGTH   
1    2     8.309999999999997D-01   1.370000000000000D+00   1.215066828675577D-01     
2    3     7.056026396574796D-01   3.670279947916664D-01   1.000000000000000D+00     
3    4     6.967452517789576D-01   3.053950958095847D-02   1.000000000000000D+00     
4    5     6.966851926112383D-01   5.802032710369720D-04   1.000000000000000D+00     
5    6     6.966851708806983D-01   8.833119583551152D-07   1.000000000000000D+00   
THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS. 
IFLAG = 0
[x=0.29099433470072]\leqno{(\%o3) }

Рассмотрим результаты минимизации функции нескольких переменных при помощи lbfgs:

(%i1)	load (lbfgs)$
(%i2)	FOM:2*x*y+8*y*z+12*x*z+1e6/(x*y*z);
8\,y\,z+12\,x\,z+\frac{1000000.0}{x\,y\,z}+2\,x\,y\leqno{(\%o2) }
(%i3)	lbfgs(FOM,[x,y,z],[1,1,1],1e-4,[-1,0]);
\%o3)\  [x=13.47613086835734, y=20.21398622934409,\\ z=3.369022781547174]
4.3.4.1 Оптимизация с ограничениями методом неопределённых множителей Лагранжа

Для решения задач минимизации с ограничениями в составе Maxima предусмотрен пакет augmented_lagrangian_method, реализующий метод неопределённых множителей Лагранжа.

Синтаксис вызова функции:

  • augmented_lagrangian_method(FOM,xx,C,yy);
  • augmented_lagrangian_method(FOM,xx,C,yy,optional_args).

Рассматриваемая функция возвращает приближенное решение задачи минимизации функции нескольких переменных с ограничениями, представленными в виде равенств. Целевая функция задаётся выражением FOM, варьируемые переменные — списком xx, их начальные значения — списком yy, ограничения — списком C (предполагается, что ограничения приравниваются к 0). Переменные optional_args задаются в форме символ=значение.

Распознаются следующие символы:

  • niter — число итераций метода неопределённых множителей Лагранжа;
  • lbfgs_tolerance — точность поиска LBFGS;
  • iprint — тот же параметр, что и для lbfgs;
  • \%lambda — начальное значение неопределённого множителя для метода Лагранжа.

Для использования функции augmented_lagrangian_method необходимо загрузить её командой load(augmented_lagrangian).

Данная реализация метода неопределённых множителей Лагранжа базируется на использовании квазиньютоновского метода LBFGS.