Сгенерируйте код для quadprog

Первые шаги в quadprog Генерация кода

В этом примере показано, как сгенерировать код для quadprog решатель оптимизации. Для генерации кода требуется MATLAB® Coder™ лицензию. Для получения дополнительной информации о требованиях к генерации кода смотрите Code Generation для quadprog Background.

Задача состоит в том, чтобы минимизировать квадратичное выражение

12xTHx+fTx

где

H=[111122124]

и

f=[231]

удовлетворяющее ограничениям 0x1, x=1/2.

Создайте файл с именем test_quadp.m содержащего следующий код.

function [x,fval] = test_quadp
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [2;-3;1];
lb = zeros(3,1);
ub = ones(size(lb));
Aeq = ones(1,3);
beq = 1/2;
x0 = zeros(3,1);
opts = optimoptions('quadprog','Algorithm','active-set');
[x,fval] = quadprog(H,f,[],[],Aeq,beq,lb,ub,x0,opts)

Сгенерируйте код для test_quadp файл.

codegen -config:mex test_quadp

Через некоторое время, codegen создает файл MEX с именем test_quadp_mex.mexw64 (расширение файла изменяется в зависимости от вашей системы). Запустите полученный код С

[x,fval] = test_quadp_mex
x =

         0
    0.5000
         0


fval =

   -1.2500

Пример изменения эффективности

Следуя некоторым предложениям в теме Генерация кода оптимизации для приложений реального времени, сконфигурируйте сгенерированный код, чтобы иметь меньше проверок и использовать статическое выделение памяти.

cfg = coder.config('mex');
cfg.IntegrityChecks = false;
cfg.SaturateOnIntegerOverflow = false;
cfg.DynamicMemoryAllocation = 'Off';

Создайте файл с именем test_quadp2.m содержащего следующий код. Этот код устанавливает более свободный допуск оптимальности, чем по умолчанию 1e-8.

function [x,fval,eflag,output] = test_quadp2
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [2;-3;1];
lb = zeros(3,1);
ub = ones(size(lb));
Aeq = ones(1,3);
beq = 1/2;
x0 = zeros(3,1);
opts = optimoptions('quadprog','Algorithm','active-set',...
    'OptimalityTolerance',1e-5);
[x,fval,eflag,output] = quadprog(H,f,[],[],Aeq,beq,lb,ub,x0,opts)

Сгенерируйте код для test_quadp2 файл.

codegen -config cfg test_quadp2

Запустите полученный код.

[x,fval,eflag,output] = test_quadp2_mex
x =

         0
    0.5000
         0


fval =

   -1.2500


eflag =

     1


output = 

  struct with fields:

          algorithm: 'active-set'
      firstorderopt: 8.8818e-16
    constrviolation: 0
         iterations: 3

Изменение допуска оптимальности не влияет на процесс оптимизации, потому что 'active-set' алгоритм не проверяет этот допуск до тех пор, пока он не достигнет точки, где он останавливается.

Создайте третий файл, который ограничивает количество разрешенных итераций 2, чтобы увидеть эффект на процесс оптимизации.

function [x,fval,exitflag,output] = test_quadp3
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [2;-3;1];
lb = zeros(3,1);
ub = ones(size(lb));
Aeq = ones(1,3);
beq = 1/2;
x0 = zeros(3,1);
opts = optimoptions('quadprog','Algorithm','active-set','MaxIterations',2);
[x,fval,exitflag,output] = quadprog(H,f,[],[],Aeq,beq,lb,ub,x0,opts)

Чтобы увидеть эффект этих настроек на решателе, запустите test_quadp3 в MATLAB без генерации кода.

[x,fval,exitflag,output] = test_quadp3
Solver stopped prematurely.

quadprog stopped because it exceeded the iteration limit,
options.MaxIterations = 2.000000e+00.


x =

   -0.0000
    0.5000
         0


fval =

   -1.2500


exitflag =

     0


output = 

  struct with fields:

          algorithm: 'active-set'
         iterations: 2
    constrviolation: 1.6441e-18
      firstorderopt: 2
            message: '↵Solver stopped prematurely.↵↵quadprog stopped because it exceeded the iteration limit,↵options.MaxIterations = 2.000000e+00.↵↵'
       linearsolver: []
       cgiterations: []

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

См. также

| | (MATLAB CODER)

Похожие темы