В этом примере показано, как настроить параметры модели так, чтобы они соответствовали требованиям частотного диапазона, используя 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 блок, применяющий нарушение порядка силу к массе. Сила нарушения порядка принята ограниченной полосой белого шума.
Симулируйте модель, чтобы просмотреть отклик системы с приложенной нарушением порядка силой.

Начальная система имеет слишком высокую пропускную способность. Это можно увидеть из сигнала spicy position. Вы настраиваете значения пружины и демпфера так, чтобы они соответствовали следующим требованиям:
Пропускная способность -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');
Добавьте IO линеаризации к sdo.SystemLoggingInfo объект с именем регистрации и временем моментального снимка линеаризации. В этом случае время моментального снимка устанавливается на 0, начальное условие модели.
sys1 = sdo.SystemLoggingInfo; sys1.Source = 'IOs'; sys1.LoggingName = 'IOs'; sys1.LinearizationIOs = IOs; sys1.SnapshotTimes = 0;
Добавьте информацию системного логгирования в симулятор. Когда симулятор используется для запуска модели, линейная система, заданная заданными IO линеаризации, вычисляется и добавляется в журнал симуляции с заданным именем логгирования.
Simulator.SystemLoggingInfo = sys1;
Создайте функцию, которая вызывается при каждой итерации оптимизации, чтобы оценить требования проекта.
Используйте анонимную функцию с одним аргументом, который вызывает sdoSimpleSuspension_Design. The 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.
Чтобы узнать, как оптимизировать систему подвески с помощью Response Optimizer, смотрите Оптимизацию проекта для соответствия требованиям частотного диапазона (GUI).
Закройте модель.
bdclose('sdoSimpleSuspension')