quadprogquadprog Генерация кодаВ этом примере показано, как сгенерировать код для quadprog решатель оптимизации. Для генерации кода требуется MATLAB® Coder™ лицензию. Для получения дополнительной информации о требованиях к генерации кода смотрите Code Generation для quadprog Background.
Задача состоит в том, чтобы минимизировать квадратичное выражение
где
и
удовлетворяющее ограничениям , .
Создайте файл с именем 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: []
В этом случае решатель достиг решения за меньшее количество шагов, чем по умолчанию. Обычно, однако, ограничение количества итераций не позволяет решателю достичь правильного решения.
optimoptions | quadprog | codegen (MATLAB CODER)