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