quadprog
quadprog
Генерация кодаВ этом примере показано, как сгенерировать код для 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)