В этом примере показано, как настроить параметры модели в соответствии с требованиями частотной области с помощью sdo.optimize команда.
В этом примере требуется Simulink ® Control Design™.
Откройте модель Simulink.
open_system('sdoSimpleSuspension')

Модели с массовыми пружинными демпферами представляют собой простые системы подвески, и для этого примера мы настраиваем систему на соответствие типичным требованиям к подвеске. Модель реализует систему второго порядка, представляющую массово-пружинный демпфер с использованием блоков Simulink и включает в себя:
a Mass блок усиления, параметризованный суммарной подвесной массой, m0+mLoad. Общая масса представляет собой сумму номинальной массы, m0и переменную массу нагрузки, mLoad.
a Damper блок усиления, параметризованный коэффициентом демпфирования, b.
a Spring блок усиления, параметризованный постоянной пружины, k.
два интеграторных блока для вычисления массовой скорости и положения.
a Band-Limited Disturbance Force блок, прилагающий возмущающую силу к массе. Предполагается, что возмущающая сила является белым шумом ограниченного диапазона.
Моделирование модели для просмотра реакции системы на приложенное возмущающее усилие.

Начальная система имеет слишком высокую пропускную способность. Это видно по острому сигналу положения. Значения пружины и демпфера настраиваются в соответствии со следующими требованиями:
Пропускная способность -3dB системы не должна превышать 10 рад/с.
Коэффициент демпфирования системы должен быть меньше 1/sqrt (2). Это гарантирует, что никакие частоты в полосе пропускания не усиливаются системой.
Минимизация ожидаемой частоты отказов системы. Ожидаемая частота отказов описывается распределением Вейбулла, зависящим от массы, пружины и значений демпфера.
Все эти требования должны выполняться, поскольку масса груза находится в диапазоне от 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 миль. Частота отказов вычисляется с использованием распределения Вейбулла по коэффициенту демпфирования системы. По мере увеличения коэффициента демпфирования ожидается увеличение частоты отказов.
Требования к конструкции используют полосу пропускания и коэффициент демпфирования системы, эти характеристики частотной области требуют линеаризации модели. Создайте симулятор для модели и используйте симулятор для вычисления линейных систем, используемых требованиями.
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');
Добавление операций ввода-вывода линеаризации в sdo.SystemLoggingInfo с именем журнала и временем снимка линеаризации. В этом случае время снимка файловой системы устанавливается равным 0, что является начальным условием модели.
sys1 = sdo.SystemLoggingInfo; sys1.Source = 'IOs'; sys1.LoggingName = 'IOs'; sys1.LinearizationIOs = IOs; sys1.SnapshotTimes = 0;
Добавьте информацию системного журнала в симулятор. При использовании симулятора для запуска модели вычисляется линейная система, определенная указанными IO линеаризации, и добавляется в журнал моделирования с указанным именем регистрации.
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 27-Jan-2021 15:07:38
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.
Сведения об оптимизации системы подвески с помощью оптимизатора отклика см. в разделе Оптимизация конструкции для удовлетворения требований к частотной области (GUI).
Закройте модель.
bdclose('sdoSimpleSuspension')