Разработайте оптимизацию, чтобы удовлетворить требования частотного диапазона (код)

Этот пример показывает, как настроить параметры модели, чтобы удовлетворить требования частотного диапазона, с помощью команды sdo.optimize.

Этот пример требует Simulink® Control Design™.

Модель приостановки

Откройте модель Simulink.

open_system('sdoSimpleSuspension')

Модели массового пружинного демпфера представляют простые системы подвески, и для этого примера мы настраиваем систему, чтобы удовлетворить типичные требования приостановки. Модель реализует систему второго порядка, представляющую массовый пружинный демпфер с помощью блоков Simulink, и включает:

  • блок усиления Mass параметризован общей приостановленной массой, m0+mLoad. Общая масса является суммой номинальной массы, m0, и переменной массы загрузки, mLoad.

  • блок усиления Damper параметризован коэффициентом затухания, b.

  • блок усиления Spring параметризован коэффициентом упругости, k.

  • два блока интегратора, чтобы вычислить массовую скорость и положение.

  • блок Band-Limited Disturbance Force, прикладывающий силу воздействия к массе. Сила воздействия принята, чтобы быть ограниченной полосой белый шум.

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

Проблема проектирования

Начальная система имеет пропускную способность, которая слишком высока. Это видно от остроконечного сигнала положения. Вы настраиваете пружину и значения демпфера, чтобы удовлетворить следующие требования:

  • -3dB системная пропускная способность не должна превышать 10 рад/с.

  • Отношение затухания системы должно быть меньше, чем 1/sqrt (2). Это гарантирует, что никакие частоты в полосе передачи не усилены системой.

  • Минимизируйте ожидаемую интенсивность отказов системы. Ожидаемая интенсивность отказов описана распределением Weibull, зависящим от массы, значений пружины и демпфера.

  • Эти требования должны все быть удовлетворены, когда масса загрузки колеблется от 0 до 20 кг.

Задайте переменные проекта

DesignVars = sdo.getParameterFromModel('sdoSimpleSuspension',{'b','k'});
DesignVars(1).Minimum = 100;
DesignVars(1).Maximum = 10000;
DesignVars(2).Minimum = 10000;
DesignVars(2).Maximum = 100000;

Задайте неопределенные переменные

Задайте mLoad, массу загрузки, как неопределенная переменная. Это гарантирует, что оптимальное решение устойчиво к изменениям в массе загрузки.

UncVars = sdo.getParameterFromModel('sdoSimpleSuspension','mLoad');
UncVars_Values = {...
    10; ...
    20};

Задайте конструктивные требования

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

Requirements = struct;
Requirements.Bandwidth = sdo.requirements.BodeMagnitude(...
    'BoundFrequencies', [10 100], ...
    'BoundMagnitudes', [-3 -3]);
Requirements.DampingRatio = sdo.requirements.PZDampingRatio;

Требование надежности будет задано в целевой функции оптимизации, описанной ниже. Требование надежности используется, чтобы настроить пружину и значения демпфера, чтобы минимизировать ожидаемую интенсивность отказов за время жизни 100e3 мили. Интенсивность отказов вычисляется с помощью распределения Weibull на отношении затухания системы. Когда отношение затухания увеличивается, интенсивность отказов, как ожидают, увеличится.

Определение линеаризации

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

Simulator = sdo.SimulationTest('sdoSimpleSuspension');

Задайте линейные системы, чтобы вычислить путем определения вводов и выводов линеаризации системы. Входом линейной системы является вывод блока Band-Limited Disturbance Force и линейной системы, выводом является вывод блока x_dot (сигнал position).

IOs(1) = linio('sdoSimpleSuspension/Band-Limited  Disturbance Force',1,'input');
IOs(2) = linio('sdoSimpleSuspension/x_dot',1,'output');

Добавьте линеаризацию iOS в объект sdo.SystemLoggingInfo с именем журналирования, и время снимка состояния линеаризации. В этом случае время снимка состояния установлено в 0, образцовое начальное условие.

sys1 = sdo.SystemLoggingInfo;
sys1.Source = 'IOs';
sys1.LoggingName = 'IOs';
sys1.LinearizationIOs = IOs;
sys1.SnapshotTimes = 0;

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

Simulator.SystemLoggingInfo = sys1;

Создайте целевую функцию оптимизации

Создайте функцию, которая вызвана в каждой итерации оптимизации, чтобы оценить конструктивные требования.

Используйте анонимную функцию с одним аргументом, который вызывает sdoSimpleSuspension_Design. Функция sdoSimpleSuspension_Design имеет аргументы для параметров проекта, средства моделирования, конструктивных требований, неопределенных переменных и неопределенных значений переменных.

optimfcn = @(P) sdoSimpleSuspension_Design(P,Simulator,Requirements,UncVars,UncVars_Values);
type sdoSimpleSuspension_Design
function Vals = sdoSimpleSuspension_Design(P,Simulator,Requirements,UncVars,UncVars_Values)
%SDOSIMPLESUSPENSION_DESIGN
%
%    The sdoSimpleSuspension_Design function is used to evaluate a simple
%    suspension system design.
%
%    The |P| input argument is the vector of suspension design parameters.
%
%    The |Simulator| input argument is a sdo.SimulinkTest object used to
%    simulate the |sdoSimpleSuspension| model and log simulation signals.
%
%    The |Requirements| input argument contains the design requirements
%    used to evaluate the suspension design.
%
%    The |UncVars| and |UncVars_Values| arguments specify the uncertain
%    variable and uncertain variable values.
%
%    The |Vals| return argument contains information about the design
%    evaluation that can be used by the |sdo.optimize| function to optimize
%    the design.
%
% See also sdoSimpleSuspension_cmddemo

% Copyright 2015 The MathWorks, Inc.

%% Evaluate the suspension reliability 
%
%Get the spring and damper design values
allVarNames = {P.Name}; 
idx         = strcmp(allVarNames,'k');
k           = P(idx).Value;
idx         = strcmp(allVarNames,'b');
b           = P(idx).Value;

%Get the nominal mass from the model workspace
wksp = get_param('sdoSimpleSuspension','ModelWorkspace');
m    = evalin(wksp,'m0');

%The expected failure rate is defined by the Weibull cumulative
%distribution function, 1-exp(-(x/l)^k), where k=3, l is a function of the
%mass, spring and damper values, and x the lifetime.
d        = b/2/sqrt(m*k);
pFailure = 1-exp(-(100e3*d/250e3)^3);

%% Nominal Evaluation
%
% Evaluate the model and requirements with uncertain parameters set to their
% nominal values.

% Simulate the model.
Simulator.Parameters = [P(:);UncVars(:)];
Simulator = sim(Simulator);

% Retrieve logged linearizations.
Sys = find(Simulator.LoggedData,'IOs');

% Evaluate the design requirements.
Cleq_Bandwidth = evalRequirement(Requirements.Bandwidth,Sys.values);
Cleq_DampingRatio = evalRequirement(Requirements.DampingRatio,Sys.values);

%% Uncertain Evaluation
%
% Evaluate the model and requirements for all combinations of uncertain
% parameter values.
for ct=1:size(UncVars_Values,1)
    UncVars(1).Value = UncVars_Values{ct,1};
    
    % Simulate the model.
    Simulator.Parameters = [P(:);UncVars(:)];
    Simulator = sim(Simulator);
    
    % Retrieve logged linearizations.
    Sys = find(Simulator.LoggedData,'IOs');
    
    % Evaluate the design requirements.
    Cleq_Bandwidth_UncVars = evalRequirement(Requirements.Bandwidth,Sys.values);
    Cleq_DampingRatio_UncVars = evalRequirement(Requirements.DampingRatio,Sys.values);
    
    Cleq_Bandwidth = [Cleq_Bandwidth; Cleq_Bandwidth_UncVars]; %#ok<AGROW>
    Cleq_DampingRatio = [Cleq_DampingRatio; Cleq_DampingRatio_UncVars]; %#ok<AGROW>
end

%% Return Values.
%
% Collect the evaluated design requirement values in a structure to
% return to the optimization solver.
Vals.F = pFailure;
Vals.Cleq = [...
    Cleq_Bandwidth(:); ...
    Cleq_DampingRatio(:)];
end

Опции оптимизации

Задайте опции оптимизации.

Options = sdo.OptimizeOptions;
Options.MethodOptions.Algorithm = 'active-set';
Options.MethodOptions.TolGradCon = 1e-06;

Оптимизируйте проект

Вызовите sdo.optimize с указателем целевой функции, параметры, чтобы оптимизировать, и опции.

[Optimized_DesignVars,Info] = sdo.optimize(optimfcn,DesignVars,Options);
 Optimization started 11-Jan-2019 03:34:57

                               max                     First-order 
 Iter F-count        f(x)   constraint    Step-size    optimality
    0      5    0.0619897       0.7642
    1     10     0.351266      -0.1277        0.461         1.22
    2     15     0.189345     -0.03881        0.188        0.312
    3     20    0.0829063      0.01312         0.51        0.425
    4     24    0.0365398            0        0.308         1.55
    5     28    0.0294977            0       0.0143        0.733
    6     32    0.0293065            0     0.000417      0.00142
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the  value of the constraint tolerance.

Связанные примеры

Чтобы изучить, как оптимизировать систему подвески с помощью инструмента Response Optimization, см. "Оптимизацию проекта, чтобы Удовлетворить Требования Частотного диапазона (графический интерфейс пользователя)".

Закройте модель.

bdclose('sdoSimpleSuspension')