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