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

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

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

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)

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

Как показано в диалоговом окне 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.

diagInfo = getBlockInfo(adv1,1)
diagInfo = 

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')

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

diagInfo.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.

diagInfo = getBlockInfo(adv2,2)
diagInfo = 

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

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

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

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

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

diagInfo.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: [1x1 opcond.OperatingPoint]
    BlockDiagnostics: [1x3 linearize.advisor.BlockDiagnostic]
           QueryType: '((Has 1 Inputs & Has 1 Outputs) & Perturbation)'

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

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

bdclose(mdl)

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

Функции

Похожие темы