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

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

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

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

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: []

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

Смотрите также

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте