В этом примере показано, как отлажить линеаризацию модели 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
объект.
Чтобы собрать диагностическую информацию во время линеаризации и создать советника для поиска и устранения проблем, сначала создайте 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
Входная рабочая точка блока.
Можно найти линеаризацию блока аналитически, взяв первую производную функции 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: [1×1 opcond.OperatingPoint] BlockDiagnostics: [1×3 linearize.advisor.BlockDiagnostic] QueryType: '((Has 1 Inputs & Has 1 Outputs) & Perturbation)'
В модели есть три блока SISO, которые линеаризируются с помощью численного возмущения.
Дополнительные сведения об использовании пользовательских запросов см. в разделе Поиск блоков в результатах линеаризации, соответствующих определенным критериям.
bdclose(mdl)