lsqnonlin с моделью Simulink®

В этом примере показано, как настроить параметры модели Simulink. Модель, optsim, включен в optim/demos папка вашей установки MATLAB®. Модель включает нелинейный обрабатывающий завод, смоделированный как Диаграмму Simulink.

Объект с насыщением привода

Объект под - ослабленная модель третьего порядка с пределами привода. Пределы привода являются пределом насыщения и пределом скорости нарастания. Предел насыщения привода отключает входные значения, больше, чем 2 модуля или меньше чем-2 модуля. Предел скорости нарастания привода является 0,8 модулями/секунда. Ответ с обратной связью системы к входу шага показывают в Ответе С обратной связью. Вы видите, этот ответ путем открытия модели (введите optsim в командной строке или нажатии кнопки имя модели), и Run выбора в меню Simulation. Графики отклика к осциллографу.

Ответ с обратной связью

Проблема состоит в том, чтобы спроектировать цикл управления с обратной связью, который отслеживает модульный вход шага к системе. Объект с обратной связью вводится в терминах блоков, где объект и привод расположены в иерархическом блоке Subsystem. Блок Scope отображает выходные траектории во время процесса проектирования.

Модель с обратной связью

Чтобы решить эту задачу, минимизируйте ошибку между выходом и входным сигналом. (В отличие от этого в примере Используя fminimax с Моделью Simulink®, решение включает минимизацию максимального значения выхода.) Переменные являются параметрами контроллера Пропорциональной интегральной производной (PID). Если бы только необходимо минимизировать ошибку одновременно модуль, у вас была бы скалярная целевая функция. Но цель состоит в том, чтобы минимизировать ошибку, навсегда продвигается от 0 до 100, таким образом производя многоцелевую функцию (одна функция для каждого временного шага).

Используйте lsqnonlin выполнять метод наименьших квадратов на отслеживании выхода. Отслеживание выполняется функциональным tracklsq, который вкладывается в runtracklsq в конце этого примера. tracklsq возвращает сигнал ошибки yout, выход вычисляется путем вызова sim, минус входной сигнал 1.

Функциональный runtracklsq настраивает все необходимые значения и затем вызывает lsqnonlin с целевой функцией tracklsq. Переменная options переданный lsqnonlin задает характеристики отображения и критерии. Опции задают, чтобы иметь не отображенный вывод, использовать 'levenberg-marquardt' алгоритм и опции дают допуски завершения к ступенчатой и целевой функции порядка 0,001.

Запускать симуляцию в модели optsim, необходимо задать переменные Kp, Ki, Kd, a1, и a2 (a1 и a2 переменные в блоке Plant). Kp, Ki, и Kd переменные должны быть оптимизированы. Функциональный tracklsq вкладывается в runtracklsq так, чтобы переменные a1 и a2 совместно используются двумя функциями. Переменные a1 и a2 инициализируются в runtracklsq.

Целевая функция tracklsq запускает симуляцию. Можно запустить симуляцию или в базовом рабочем пространстве или в текущей рабочей области, то есть, рабочей области функции, вызвав sim, который в этом случае является рабочей областью tracklsq. В этом примере, SrcWorkspace опция установлена в 'Current' сказать sim запускать симуляцию в текущей рабочей области. runtracklsq запускает симуляцию к 100 секундам.

Когда симуляция завершена, runtracklsq создает myobj объект в текущей рабочей области (то есть, рабочей области tracklsq). Блок Outport в модели блок-схемы помещает yout поле объекта в текущую рабочую область в конце симуляции.

Когда вы запускаете runtracklsq, оптимизация дает решение для пропорционального, интеграла и производной (Kp, Ki, Kd) усиления контроллера.

[Kp, Ki, Kd] = runtracklsq
Kp = 3.1330
Ki = 0.1465
Kd = 14.3918

Осциллограф показывает оптимизированный переходной процесс с обратной связью.

Ответ с обратной связью после lsqnonlin

Примечание: вызов sim результаты в вызове одного из решателей для обыкновенных дифференциальных уравнений (ОДУ) Simulink. Необходимо выбрать который тип решателя использовать. С точки зрения оптимизации решатель ОДУ фиксированного шага является лучшим выбором, если достаточно решить ОДУ. Однако в случае жесткой системы, метод ОДУ переменного шага может потребоваться, чтобы решать ОДУ.

Числовое решение, произведенное решателем переменного шага, однако, не является сглаженной функцией параметров из-за механизмов управления неродного размера. Это отсутствие гладкости может препятствовать тому, чтобы стандартная программа оптимизации сходилась. Отсутствие гладкости не является проблемой, когда вы используете решатель фиксированного шага. (Для дальнейшего объяснения см. [53].)

Программное обеспечение Simulink Design Optimization™ рекомендуется для решения многоцелевых задач оптимизации в сочетании с решателями переменного шага Simulink. Это программное обеспечение обеспечивает специальный числовой расчет градиента, который работает с Simulink и старается не вводить проблему отсутствия гладкости.

Функция помощника

Следующий код создает runtracklsq функция помощника.

function [Kp,Ki,Kd] = runtracklsq
% RUNTRACKLSQ demonstrates using LSQNONLIN with Simulink.
mdl = 'optsim';
open_system(mdl)                             % Load the model
in = Simulink.SimulationInput(mdl);          % Create simulation input object
in = in.setModelParameter('StopTime','100'); % Stop time 100
pid0 = [0.63 0.0504 1.9688];                 % Initial gain values
a1 = 3; a2 = 43;                             % Initialize model plant variables
options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt',...
   'Display','off','StepTolerance',0.001,'OptimalityTolerance',0.001);
% Optimize the gains
set_param(mdl,'FastRestart','on');           % Fast restart
pid = lsqnonlin(@tracklsq,pid0,[],[],options);
set_param(mdl,'FastRestart','off');
% Return the gains
Kp = pid(1); Ki = pid(2); Kd = pid(3); 

    function F = tracklsq(pid)
      % Track the output of optsim to a signal of 1
      % Set the simulation input object parameters
      in = in.setVariable('Kp',pid(1),'Workspace',mdl);
      in = in.setVariable('Ki',pid(2),'Workspace',mdl);
      in = in.setVariable('Kd',pid(3),'Workspace',mdl);
      
      % Simulate
      out = sim(in);
      F = out.get('yout') - 1;
    end
end

Copyright 2019–2020 The MathWorks, Inc.