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

В этом примере показано, как настроить параметры модели, чтобы удовлетворить требования частотного диапазона, с помощью 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 23-Jul-2021 09:11:21

                               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     1.57e-16     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 Optimizer, смотрите Оптимизацию Проекта, чтобы Удовлетворить Требования Частотного диапазона (графический интерфейс пользователя).

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

bdclose('sdoSimpleSuspension')