Поиск и устранение проблем с результатами линеаризации в командной строке

В этом примере показано, как отлажить линеаризацию модели Simulink ® в командной строке с помощью LinearizationAdvisor объект. Можно также диагностировать результаты линеаризации в интерактивном режиме. Для получения дополнительной информации смотрите Поиск и устранение проблем с результатами линеаризации в Model Linearizer.

Откройте модель.

mdl = 'scdpendulum';
open_system(mdl)

Начальное условие угла маятника 90 степени против часовой стрелки от вертикального нестабильного равновесия 0 степени. Начальное условие скорости вращения маятника 0 град/с. Номинальный крутящий момент для поддержания этого состояния -49.05 N м. Это строение сохранено как начальное условие модели.

Линеаризация модели

Линеаризируйте модель с помощью точек анализа, определенных в модели и рабочей точке модели.

io = getlinio(mdl);
linsys = linearize(mdl,io);

Чтобы проверить результат линеаризации, постройте график его отклика Bode.

bode(linsys)

Модель линеаризировалась до нуля, так что крутящий момент, tau, не влияет на угол или скорость вращения. Чтобы найти источник нулевой линеаризации, можно использовать LinearizationAdvisor объект.

Линеаризация модели с включенным Advisor

Чтобы собрать диагностическую информацию во время линеаризации и создать советника для поиска и устранения проблем, сначала создайте linearizeOptions набор опций, задающий StoreAdvisor опция как true.

opt = linearizeOptions('StoreAdvisor',true);

Линеаризируйте модель Simulink, используя этот набор опций. Верните info выходной аргумент, который содержит диагностическую информацию линеаризации в LinearizationAdvisor объект.

[linsys1,~,info] = linearize(mdl,io,opt);

Извлечение LinearizationAdvisor объект.

advisor = info.Advisor;

Подсветка пути линеаризации

Чтобы показать путь линеаризации для текущей линеаризации, используйте highlight.

highlight(advisor)

Просмотрите подсистему маятника.

Как показано в диалоговом окне Путь линеаризации, блоки подсвечены в:

  • Синий численно влияет на линеаризацию модели.

  • Красный цвет находится на пути линеаризации, но не влияет на линеаризацию модели для текущей рабочей точки и параметров блоков.

Поскольку модель линеаризирована до нуля, нет блоков, которые способствуют линеаризации.

Исследуйте потенциально проблематичные блоки

Чтобы получить диагностическую информацию для блоков, которые могут быть проблематичными для линеаризации, используйте advise. Эта функция возвращает новое LinearizationAdvisor объект, который содержит информацию о блоках в пути линеаризации, которые удовлетворяют, по крайней мере, одному из следующих критериев:

  • Иметь диагностические сообщения относительно их линеаризации

  • Линеаризируйте в нуль

  • Иметь замещенные линеаризации

adv1 = advise(advisor);

Просмотрите сводные данные диагностической информации для этих блоков, используйте getBlockInfo.

getBlockInfo(adv1)
ans = 

Linearization Diagnostics for the Blocks:

Block Info:
-----------
Index   BlockPath                                           Is On Path   Contributes To Linearization   Linearization Method   
1.      scdpendulum/pendulum/Saturation                     Yes          No                             Exact                  
2.      scdpendulum/angle_wrap/Trigonometric Function1      Yes          No                             Perturbation           
3.      scdpendulum/pendulum/Trigonometric Function         Yes          No                             Perturbation           

В этом случае советник сообщает о трех потенциально проблематичных блоках, блоке Насыщения и двух блоках Тригонометрической Функции. Когда вы запускаете этот пример в MATLAB, пути к блокам отображаются как гиперссылки. Чтобы перейти к одному из этих блоков в модели, щелкните соответствующую гиперссылку пути блока.

Чтобы просмотреть дополнительные сведения об определенной линеаризации блоков, используйте getBlockInfo. Для получения информации о доступной диагностике смотрите BlockDiagnostic.

Для примера получите диагностическую информацию для блока Насыщения.

diag = getBlockInfo(adv1,1)
diag = 

Linearization Diagnostics for scdpendulum/pendulum/Saturation with properties:

                      IsOnPath: 'Yes'
    ContributesToLinearization: 'No'
           LinearizationMethod: 'Exact'
                 Linearization: [1×1 ss]
                OperatingPoint: [1×1 linearize.advisor.BlockOperatingPoint]

Этот блок имеет два диагностических сообщения относительно его результата линеаризации. Первое сообщение указывает, что блок линеаризируется вне нижнего предела насыщения -49, так как рабочая точка входа -49.05.

Сообщение также указывает, что блок может быть линеаризирован как усиление, что линеаризирует блок как 1 независимо от входа рабочей точки.

Когда вы запускаете этот пример в MATLAB, текст, линеаризирующий блок как усиление, отображается как гиперссылка. Чтобы открыть диалоговое окно Параметров блоков для блока Насыщения и выделить опцию для линеаризации блока как усиления, щелкните эту гиперссылку.

При линеаризации выберите Обработку как коэффициент усиления и нажмите кнопку ОК.

Также можно задать этот параметр из командной строки.

set_param('scdpendulum/pendulum/Saturation','LinearizeAsGain','on')

Второе диагностическое сообщение утверждает, что линеаризация этого блока заставляет общую модель линеаризироваться до нуля. Просмотрите линеаризацию этого блока.

diag.Linearization
ans =
 
  D = 
       u1
   y1   0
 
Name: Saturation
Static gain.

Поскольку этот блок линеаризирован до нуля, модификация блочной линеаризации путем обработки его как усиления является хорошим первым шагом к получению ненулевой модельной линеаризации.

Релинеаризация модели

Чтобы увидеть эффект обработки блока Насыщения как усиления, перезапустите модель и постройте график ее отклика Bode.

[linsys2,~,info] = linearize(mdl,io,opt);
bode(linsys2)

Линеаризация модели теперь ненулевая.

Чтобы проверить, все ли блоки все еще потенциально проблематичны для линеаризации, извлеките объект advisor и используйте advise функция.

advisor2 = info.Advisor;
adv2 = advise(advisor2);

Просмотрите диагностическую информацию блока.

getBlockInfo(adv2)
ans = 

Linearization Diagnostics for the Blocks:

Block Info:
-----------
Index   BlockPath                                           Is On Path   Contributes To Linearization   Linearization Method   
1.      scdpendulum/angle_wrap/Trigonometric Function1      Yes          No                             Perturbation           
2.      scdpendulum/pendulum/Trigonometric Function         Yes          No                             Perturbation           

Два блока Тригонометрических функций все еще перечислены.

Выделите путь линеаризации для обновленной линеаризации.

highlight(advisor2)

Просмотрите подсистему маятника.

Чтобы понять, почему эти блоки не способствуют линеаризации, смотрите их соответствующую диагностическую информацию блока. Для примера получите диагностическую информацию для второго блока Trigonometric Function.

diag = getBlockInfo(adv2,2)
diag = 

Linearization Diagnostics for scdpendulum/pendulum/Trigonometric Function with properties:

                      IsOnPath: 'Yes'
    ContributesToLinearization: 'No'
           LinearizationMethod: 'Perturbation'
                 Linearization: [1×1 ss]
                OperatingPoint: [1×1 linearize.advisor.BlockOperatingPoint]

Просмотрите линеаризацию этого блока.

diag.Linearization
ans =
 
  D = 
       u1
   y1   0
 
Name: Trigonometric Function
Static gain.

Блок линеаризован до нуля. Чтобы увидеть, ожидается ли этот результат для текущего рабочего условия блока, проверьте его рабочую точку.

diag.OperatingPoint
ans = 

Block Operating Point for scdpendulum/pendulum/Trigonometric Function


Inputs:
-------
Port   u        
1      1.5708   

Входная рабочая точка блока.$\pi/2 = 1.5708$

Можно найти линеаризацию блока аналитически, взяв первую производную функции sin относительно входа.

$$\frac{\partial}{\partial u} \sin(u) = \cos(u)$$

Поэтому при оценке при$u = \pi/2$ линеаризации блока равен нулю. Источником входа является первый выход интегратора второго порядка, который зависит от состояния theta. Поэтому этот блок линеаризируется в нуль, если, $\theta = \pi/2 + k\pi$где$k$ является целым числом. То же условие применяется и к другому блоку Trigonometric Function в подсистеме angle_wrap. Если эти блоки не должны линеаризироваться в нуль, можно изменить состояние рабочей точки theta, и релинеаризируйте модель.

Создание и выполнение пользовательских запросов

Советник по линеаризации также предоставляет объекты и функции для создания пользовательских запросов. Используя эти запросы, можно найти блоки в модели, которые соответствуют определенным критериям. Например, чтобы найти все блоки SISO, которые линеаризированы с помощью числового возмущения, сначала создайте объекты запросов для каждого критерия поиска:

  • Имеет один вход

  • Имеет один выход

  • Численно возмущен

qIn = linqueryHasInputs(1);
qOut = linqueryHasOutputs(1);
qPerturb = linqueryIsNumericallyPerturbed;

Создайте CompoundQuery объект путем объединения этих объектов запросов с помощью логических операторов.

sisopert = qIn & qOut & qPerturb;

Поиск диагностики блоков в advisor2 для блоков, соответствующих этим критериям.

sisopertBlocks = find(advisor2,sisopert)
sisopertBlocks = 

  LinearizationAdvisor with properties:

               Model: 'scdpendulum'
      OperatingPoint: [1×1 opcond.OperatingPoint]
    BlockDiagnostics: [1×3 linearize.advisor.BlockDiagnostic]
           QueryType: '((Has 1 Inputs & Has 1 Outputs) & Perturbation)'

В модели есть три блока SISO, которые линеаризируются с помощью численного возмущения.

Дополнительные сведения об использовании пользовательских запросов см. в разделе Поиск блоков в результатах линеаризации, соответствующих определенным критериям.

bdclose(mdl)

См. также

Функции

Похожие темы