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