Этот пример показывает, как настроить параметры модели, чтобы удовлетворить требования частотного диапазона, с помощью команды 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')