setCustomSolver

Конфигурирует объект MPC использовать решатель QP от Optimization Toolbox как пользовательский решатель

    Описание

    пример

    setCustomSolver(mpcobj,'quadprog') конфигурирует mpcobj использовать quadprog от Optimization Toolbox™ как пользовательский решатель QP и для симуляции и для генерации кода. А именно, этот синтаксис генерирует, в текущей папке, файлы mpcCustomSolver.m и mpcCustomSolverCodeGen.m, которые внутренне вызывают активный набор quadprog (Optimization Toolbox) решатель. Это затем устанавливает mpcobj.Optimizer.CustomSolver и mpcobj.Optimizer.CustomSolverCodeGen к true.

    пример

    setCustomSolver(mpcobj,'none') наборы mpcobj.Optimizer.CustomSolver и mpcobj.Optimizer.CustomSolverCodeGen к false, таким образом, возвращающийся mpcobj назад использовать встроенный алгоритм, заданный в mpcobj.Optimizer.Algorithm и для симуляции и для генерации кода.

    Примеры

    свернуть все

    В этом примере показано, как использовать setCustomSolver функционируйте, чтобы автоматически сконфигурировать mpc возразите, чтобы использовать quadprog Optimization Toolbox™ функционируйте как пользовательский решатель MPC и для симуляции и для генерации кода.

    Создайте mpc объект.

    mpcobj = mpc(tf(1,[2 1],0.1));
    -->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.
    

    Как значение по умолчанию, диспетчер собирается использовать решатель активного набора и для симуляции и для генерации кода.

    mpcobj.Optimizer
    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' в качестве второго аргумента.

    setCustomSolver(mpcobj,'quadprog')

    Функция генерирует, в текущей папке, файлы mpcCustomSolver.m и mpcCustomSolverCodeGen.m. Чтобы отобразить файлы MATLAB в текущей папке, используйте ls команда.

    ls *.m
    mpcCustomSolverCodeGen.m  mpcCustomSolver.m
    

    Отобразить содержимое mpcCustomSolver.m, и mpcCustomSolverCodeGen.m используйте type команда. Оба файла внутренне вызывают quadprog, который сконфигурирован, чтобы использовать решатель активного набора, когда другие алгоритмы не поддерживаются.

    type mpcCustomSolver
    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
    
    type mpcCustomSolverCodeGen.m
    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 возразите, чтобы использовать пользовательский решатель в связанных файлах для симуляции и генерации кода.

    mpcobj.Optimizer
    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' в качестве второго аргумента.

    setCustomSolver(mpcobj,'none')

    Это устанавливает mpcobj.Optimizer.CustomSolver и mpcobj.Optimizer.CustomSolverCodeGen к false.

    mpcobj.Optimizer
    ans = struct with fields:
                    Algorithm: 'active-set'
             ActiveSetOptions: [1x1 struct]
         InteriorPointOptions: [1x1 struct]
          MixedIntegerOptions: [1x1 struct]
                 MinOutputECR: 0
        UseSuboptimalSolution: 0
                 CustomSolver: 0
          CustomSolverCodeGen: 0
    
    

    Диспетчер будет теперь использовать активный набор, созданный в решателе и для симуляции и для генерации кода.

    Входные параметры

    свернуть все

    Контроллер MPC в виде контроллера MPC объект. Используйте mpc команда, чтобы создать контроллер MPC.

    Введенный в R2021b