В этом примере показано, как отладить линеаризацию модели Simulink ® в командной строке с помощью LinearizationAdvisor объект. Результаты линеаризации также можно устранять в интерактивном режиме. Дополнительные сведения см. в разделе Устранение неполадок результатов линеаризации в линеаризаторе модели.
Откройте модель.
mdl = 'scdpendulum';
open_system(mdl)

Исходное условие угла маятника - 90 градусов против часовой стрелки от вертикального неустойчивого равновесия 0 степени. Исходное условие угловой скорости маятника - 0 град ./с. Номинальный крутящий момент для поддержания этого состояния равен -49.05 N м. Эта конфигурация сохраняется как исходное условие модели.
Линеаризация модели с использованием точек анализа, определенных в модели, и рабочей точки модели.
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)

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

Как показано в диалоговом окне «Траектория линеаризации», блоки выделены следующим образом:
Синий цвет численно влияет на линеаризацию модели.
Красный цвет находится на пути линеаризации, но не влияет на линеаризацию модели для текущей рабочей точки и параметров блока.
Поскольку модель линеаризована до нуля, отсутствуют блоки, способствующие линеаризации.
Чтобы получить диагностическую информацию для блоков, которые могут быть проблематичны для линеаризации, используйте 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.
Поскольку этот блок линеаризован до нуля, изменение линеаризации блока путем его обработки как усиления является хорошим первым шагом к получению линеаризации ненулевой модели.
Чтобы увидеть эффект обработки блока Насыщения как коэффициента усиления, повторно выполните обработку модели и постройте график ее реакции Боде.
[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)
Просмотрите маятниковую подсистему.

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

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