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

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