Диагностируйте результаты линеаризации в командной строке

Этот пример показывает, как отладить линеаризацию модели Simulink® в командной строке с помощью объекта LinearizationAdvisor. Можно также диагностировать результаты линеаризации в интерактивном режиме. Для получения дополнительной информации смотрите Результаты Линеаризации Поиска и устранения неисправностей в Linear Analysis Tool.

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

mdl = 'scdpendulum';
open_system(mdl)

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

Линеаризуйте модель

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

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

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

bode(linsys)

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

Линеаризуйте модель с Enabled советником

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

opt = linearizeOptions('StoreAdvisor',true);

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

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

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

advisor = info.Advisor;

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

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

highlight(advisor)

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

open_system([mdl '/pendulum'])

Как показано в диалоговом окне Linearization path, блоки, подсвеченные в:

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

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

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

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

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

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

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

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

diag = getBlockInfo(adv1,1)
diag = 

Linearization Diagnostics for scdpendulum/pendulum/Saturation with properties:

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

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

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

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

Выберите Treat как усиление при линеаризации и нажмите ОК.

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

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

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

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

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

Повторно линеаризуйте модель

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

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

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

Чтобы проверять, потенциально проблематичны ли какие-либо блоки все еще для линеаризации, извлеките объект советника и используйте функцию 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: [1x1 ss]
                OperatingPoint: [1x1 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   

Входная рабочая точка блока.

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

Поэтому, когда оценено в линеаризации блока нуль. Источником входа является первый вывод интегратора второго порядка, который зависит от theta состояния. Поэтому этот блок линеаризует, чтобы обнулить, если, где целое число. То же условие применяется к другому блоку 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: [1x1 opcond.OperatingPoint]
    BlockDiagnostics: [1x3 linearize.advisor.BlockDiagnostic]
           QueryType: '((Has 1 Inputs & Has 1 Outputs) & Perturbation)'

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

Для получения дополнительной информации об использовании пользовательских запросов смотрите, Находят Блоки в Результатах Линеаризации, Совпадающих с Определенными Критериями.

bdclose(mdl)

Смотрите также

Функции

Похожие темы