В этом примере показано, как использовать setCustomSolver
функционируйте, чтобы автоматически сконфигурировать mpc
возразите, чтобы использовать quadprog
Optimization Toolbox™
функционируйте как пользовательский решатель MPC и для симуляции и для генерации кода.
Создайте mpc
объект.
-->The "PredictionHorizon" property of "mpc" object is empty. Trying PredictionHorizon = 10.
-->The "ControlHorizon" property of the "mpc" object is empty. Assuming 2.
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000.
-->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000.
-->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
Как значение по умолчанию, диспетчер собирается использовать решатель активного набора и для симуляции и для генерации кода.
ans = struct with fields:
Algorithm: 'active-set'
ActiveSetOptions: [1x1 struct]
InteriorPointOptions: [1x1 struct]
MixedIntegerOptions: [1x1 struct]
MinOutputECR: 0
UseSuboptimalSolution: 0
CustomSolver: 0
CustomSolverCodeGen: 0
Сконфигурируйте mpcobj
использовать quadprog
как пользовательский решатель
Установить quadprog
функционируйте как пользовательский решатель MPC и для симуляции и для генерации кода, вызовите setCustomSolver
с 'quadprog'
в качестве второго аргумента.
Функция генерирует, в текущей папке, файлы mpcCustomSolver.m
и mpcCustomSolverCodeGen.m
. Чтобы отобразить файлы MATLAB в текущей папке, используйте ls
команда.
mpcCustomSolverCodeGen.m mpcCustomSolver.m
Отобразить содержимое mpcCustomSolver.m
, и mpcCustomSolverCodeGen.m
используйте type
команда. Оба файла внутренне вызывают quadprog
, который сконфигурирован, чтобы использовать решатель активного набора, когда другие алгоритмы не поддерживаются.
function [x, status] = mpcCustomSolver(H, f, A, b, x0)
% "mpcCustomSolver" enables using "quadprog" from Optmization Toolbox
% as a custom QP solver with linear MPC controller for simulation.
%% Specify solver algorithm and options
options = optimoptions('quadprog','Algorithm','active-set');
if coder.target('MATLAB')
options.Display = 'none';
end
%% Process solver inputs
% Use -A and -b in "quadprog" because MPC QP uses Ax>=b instead
A_custom = -A;
b_custom = -b;
% ensure Hessian is symmetric
H = (H+H')/2;
%% Call "quadprog"
[x, ~, exitflag, output] = quadprog(H, f, A_custom, b_custom, [], [], [], [], x0, options);
%% Converts exit flag to MPC "status"
switch exitflag
case 1
status = output.iterations;
case 0
status = 0;
case -2
status = -1;
otherwise
status = -2;
end
%% If "quadprog" fails to find a solution, set x to the initial guess
if status <= 0
x = x0;
end
function [x, status] = mpcCustomSolverCodeGen(H, f, A, b, x0)
% "mpcCustomSolverCodeGen" enables using "quadprog" from Optmization
% Toolbox as a custom QP solver with linear MPC controller for code generation.
%#codegen
%% Specify solver algorithm (must be "active-set") and options
options = optimoptions('quadprog','Algorithm','active-set');
if coder.target('MATLAB')
options.Display = 'none';
end
%% Process solver inputs
% Use -A and -b in "quadprog" because MPC QP uses Ax>=b instead
A_custom = -A;
b_custom = -b;
% ensure Hessian is symmetric
H = (H+H')/2;
%% Call "quadprog"
[x, ~, exitflag, output] = quadprog(H, f, A_custom, b_custom, [], [], [], [], x0, options);
%% Converts exit flag to MPC "status"
switch exitflag
case 1
status = output.iterations;
case 0
status = 0;
case -2
status = -1;
otherwise
status = -2;
end
%% If "quadprog" fails to find a solution, set x to the initial guess
if status <= 0
x = x0;
end
setCustomSolver
функционируйте также устанавливает mpcobj.Optimizer.CustomSolver
и mpcobj.Optimizer.CustomSolverCodeGen
к true
, таким образом, подготовка mpcobj
возразите, чтобы использовать пользовательский решатель в связанных файлах для симуляции и генерации кода.
ans = struct with fields:
Algorithm: 'active-set'
ActiveSetOptions: [1x1 struct]
InteriorPointOptions: [1x1 struct]
MixedIntegerOptions: [1x1 struct]
MinOutputECR: 0
UseSuboptimalSolution: 0
CustomSolver: 1
CustomSolverCodeGen: 1
Вернитесь mpcobj
использовать встроенный решатель
Вернуться mpcobj
назад, чтобы использовать созданный в решателе, вызовите setCustomSolver
функция с 'none'
в качестве второго аргумента.
Это устанавливает mpcobj.Optimizer.CustomSolver
и mpcobj.Optimizer.CustomSolverCodeGen
к false
.
ans = struct with fields:
Algorithm: 'active-set'
ActiveSetOptions: [1x1 struct]
InteriorPointOptions: [1x1 struct]
MixedIntegerOptions: [1x1 struct]
MinOutputECR: 0
UseSuboptimalSolution: 0
CustomSolver: 0
CustomSolverCodeGen: 0
Диспетчер будет теперь использовать активный набор, созданный в решателе и для симуляции и для генерации кода.