quadprogquadprog Создание кодаВ этом примере показано, как создать код для quadprog решатель оптимизации. Для создания кода требуется лицензия MATLAB ® Coder™. Дополнительные сведения о требованиях к созданию кода см. в разделе Создание кода для фона квадропрога.
Проблема заключается в минимизации квадратичного выражения
fTx
где
− 21 − 24]
и
31]
с учетом ограничений, .
Создание файла с именем 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 (расширение файла зависит от системы). Запустите результирующий код C.
[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)