Используйте эти методы, чтобы удалить алгебраические циклы в модели.
Этот пример демонстрирует, как удалить алгебраические циклы в модели, вводя задержки между блоками в цикле. Это один из подходов к удалению алгебраических циклов в больших моделях, где такие циклы могут происходить из-за обратной связи между атомарными подсистемами.
Рассмотрим модель, присоединенную к этому примеру. В модели существуют два алгебраических циклов, вызванные атомарными подсистемами
Blackbox A
- > Blackbox B
- > Blackbox C
- > Blackbox A
Blackbox B
- > Blackbox C
- > Blackbox B
Когда вы обновляете эту модель, Simulink ® обнаруживает цикл Blackbox A
- > Blackbox B
- > Blackbox C
- > Blackbox A
Поскольку вы не знаете содержимого этих подсистем, разорвите циклы, добавив блок Unit Delay вне подсистем. Существует три способа использовать блок Unit Delay для разрыва этих циклов:
Добавьте Unit Delay между Blackbox A
и Blackbox C
.
Добавьте Unit Delay между Blackbox B
и Blackbox C
.
Добавьте блоки Unit Delay к обоим алгебраическим циклам.
Добавьте модуля задержку между BlackBox A
и BlackBox C
Если вы добавляете модуля задержку по сигналу обратной связи между подсистемами Blackbox A
и Blackbox C
, вы вводите минимальное количество задержек модуля (1) в систему. Путем введения задержки перед Blackbox A
, Blackbox B
и Blackbox C
использовать данные текущего временного шага.
Добавьте модуля задержку между BlackBox B
и BlackBox C
Если вы добавляете модуля задержку между подсистемами Blackbox B
и Blackbox C
, вы ломаете алгебраический цикл между Blackbox B
и Blackbox C
. В сложение вы разрываете цикл между Blackbox A
и Blackbox C
, потому что этот сигнал завершает алгебраический цикл. Путем вставки блока Unit Delay перед Blackbox C
, Blackbox C
теперь работает только с данными предыдущего временного шага.
Добавьте единичные задержки к обеим алгебраическим циклам
В примере здесь вы вставляете блоки Unit Delay, чтобы разбить оба алгебраических циклов. В этой модели BlackBox_A и BlackBox_B используют данные предыдущего временного шага. BlackBox_C использует данные текущего временного шага.
Если Simulink® не может решить алгебраический цикл, программа сообщает об ошибке. Используйте один из следующих методов, чтобы решить цикл вручную:
Реструктуризируйте базовые ДАУ с помощью таких методов, как дифференцирование или изменение координат. Эти методы помещают ДАУ в форму, которую легче решить алгебраическому решателю цикла.
Преобразуйте ДАУ в ОДУ, что устраняет любые алгебраические циклы.
Создайте начальные догадки, используя IC и Алгебраические блоки ограничений
Ваша модель может содержать циклы, для которых решатель цикла не может сходиться без хорошего, начального предположения для алгебраических состояний. Можно задать начальное предположение для переменных алгебраического состояния, но использовать этот метод только тогда, когда вы считаете цикл легитимным.
Существует два способа задать начальное предположение:
Поместите IC блок в алгебраический цикл.
Задайте начальное предположение для сигнала в алгебраическом цикле, используя блок Algebraic Constraint.
Когда вы включаете Minimize algebraic loop occurrences, Simulink пытается устранить искусственные алгебраические циклы. В этом примере модель содержит атомарную подсистему, которая вызывает искусственный алгебраический цикл.
Содержимое атомарной подсистемы не является прямым сквозным соединением, но Simulink идентифицирует атомарную подсистему как прямое сквозное соединение.
Если для диагностики Algebraic loop задано значение error
, симуляция модели приводит к ошибке, потому что модель содержит искусственный алгебраический цикл с участием ее атомарной подсистемы.
Чтобы исключить этот алгебраический цикл,
Создайте модель из предыдущей графики с атомарной подсистемой, которая вызывает искусственный алгебраический цикл.
На панели Diagnostics Model Параметры Конфигурации установите параметр Algebraic loop равным warning
или none
.
На панели Data Import/Export убедитесь, что параметр Signal logging отключен. Если логгирование сигнала включено, Simulink не может устранить искусственные алгебраические циклы.
Чтобы отобразить порядок выполнения блоков для этой модели и атомарной подсистемы, на вкладке Debug, выберите Information Overlays > Execution Order.
Просмотр порядка выполнения может помочь вам понять, как исключить искусственный алгебраический цикл.
Все блоки подсистемы выполняются на одном уровне: 1. (0 - самый низкий уровень, указывающий на первые блоки для выполнения.)
Примечание
Для получения дополнительной информации о порядке выполнения блока, смотрите Управление и Отображение Заказа на выполнение.
В диалоговом окне Subsystem Parameters модели верхнего уровня выберите Minimize algebraic loop occurrences. Этот параметр направляет Simulink, чтобы попытаться устранить алгебраический цикл, который содержит атомарную подсистему, когда он симулирует модель. Сохраните изменения.
На вкладке Modeling щелкните Update Model, чтобы перерасчитать порядок выполнения.
Теперь внутри подсистемы есть два уровня порядка выполнения: 1 и 2.
Чтобы исключить искусственный алгебраический цикл, Simulink пытается сделать вход подсистемы или ссылку модели непрямое сквозное соединение.
Когда вы моделируете модель, все блоки выполняют методы в этом порядке:
mdlOutputs
mdlDerivatives
mdlUpdate
В исходной версии этой модели выполняется mdlOutputs
метод начинается с блока Объекта, потому что блок Объекта является непрямым сквозным соединением. Выполнение завершается блоком Controller.
Для получения дополнительной информации об этих методах см. Simulink Моделей.
Если вы включите параметр Minimize algebraic loop occurrences для атомарной подсистемы, Simulink делит подсистему на два атомарных модулей.
Эти условия верны:
Атомный модуль 2 не является прямым сквозным соединением.
Атомный модуль 1 имеет только mdlOutputs
способ.
Только mdlDerivatives
или mdlUpdate
методы атомарного модуля 2 нуждаются в выходе атомарного модуля 1. Simulink может выполнить то, что обычно выполнялось бы во время mdlOutput
метод Атомного модуля 1 в mdlDerivatives
методы Атомного модуля 2.
Новый порядок выполнения для модели:
mdlOutputs
метод модели
mdlOutputs
метод Атомного модуля 2
mdlOutputs
методы других блоков
mdlDerivatives
метод модели
mdlOutputs
метод Атомного модуля 1
mdlDerivatives
метод Атомного модуля 2
mdlDerivatives
метод других блоков
Чтобы метод Minimize algebraic loop occurrences был успешным, подсистема или ссылка на модель должны иметь блок, не сквозное соединение направления, соединенный непосредственно с Inport. Simulink может затем задать DirectFeedthrough
свойство блока Inport to false
чтобы указать, что порт входа не имеет прямых сквозных соединений.
Если атомарная подсистема вызывает искусственный алгебраический цикл, преобразуйте атомарную подсистему в виртуальную подсистему. Это изменение не влияет на поведение модели. Когда подсистема является атомарной, и вы симулируете модель, Simulink вызывает алгебраический решатель цикла. Решатель завершает работу после одной итерации. Алгебраический цикл автоматически решается, потому что алгебраическая константа отсутствует. После того, как вы сделаете подсистему виртуальной, Simulink не вызывает алгебраический цикл, решатель во время симуляции.
Чтобы преобразовать атомарную подсистему в виртуальную подсистему:
Откройте модель, которая содержит атомарную подсистему.
Щелкните правой кнопкой мыши атомарную подсистему и выберите Subsystem Parameters.
Очистите параметр Treat as atomic unit.
Сохраните изменения.
Если вы заменяете атомарную подсистему на виртуальную подсистему, а симуляция все еще прекращает работать с алгебраической ошибкой цикла, исследуйте модель на одно из следующего:
Алгебраическое ограничение
Искусственный алгебраический цикл, который не был вызван этой атомарной подсистемой
Некоторые модели связывают сигналы вместе. Это связывание может заставить Simulink обнаружить алгебраический цикл, даже когда алгебраическое ограничение не существует. Если вы перенаправляете один или несколько сигналов, вы можете удалить искусственный алгебраический цикл.
В этом примере линеаризированная модель моделирует динамику системы с двумя резервуарами, питаемой одним насосом. В этой модели:
Выходные q1
- скорость потока жидкости в бак от насоса.
Выходные h2
- высота жидкости во втором баке.
Блок State-Space определяет динамическую характеристику системы бака на операцию насоса:
Выход блока State-Space является вектором, который содержит q1
и h2
.
Если вы симулируете эту модель с Algebraic loop набора параметров, чтобы warn
или error
Simulink определяет алгебраический цикл.
Чтобы исключить этот алгебраический цикл:
Измените C
и D
матрицы следующим образом:
Передайте q1
непосредственно в возможности вместо через блок State-Space.
Теперь вход (q1
) не передается непосредственно к выходу (D
матрица - 0), поэтому блок State-Space больше не имеет прямого сквозного соединения. Сигнал обратной связи теперь имеет только один элемент, поэтому блок Selector больше не нужен, как можно увидеть в следующей модели.
Существует два параметра, которые следует учитывать, когда вы думаете, что ваша модель имеет искусственный алгебраический цикл:
Minimize algebraic loop occurrences параметр - Задайте, что Simulink пытается исключить любые искусственные алгебраические циклы для:
Атомарные подсистемы - В диалоговом окне Параметры выберите Minimize algebraic loop occurrences.
Блоки Model - Для ссылок на модель в панели Model Referencing параметров конфигурации выберите Minimize algebraic loop occurrences.
Minimize algebraic loop параметр - Задает, какое диагностическое действие принимает Simulink, если параметр Minimize algebraic loop occurrences не влияет.
Параметр Minimize algebraic loop находится на панели Diagnostics Параметров конфигурации. Диагностические действия для этого параметра:
Настройка | Реакция симуляции |
---|---|
none | Simulink не принимает никаких действий. |
warning | Simulink отображает предупреждение об отсутствии эффекта у параметра Minimize algebraic loop occurrences. |
error | Simulink завершает симуляцию и отображает ошибку, что параметр Minimize algebraic loop occurrences не имеет эффекта. |
Когда вы включаете оптимизацию Block reduction в параметрах конфигурации модели, Simulink сворачивает определенные группы блоков в один, более эффективный блок или удаляет их полностью. Включение сокращения блоков приводит к более быстрому выполнению во время симуляции модели и в генерации кода.
Включение сокращения блоков может также помочь Simulink решить искусственные алгебраические циклы.
Рассмотрим следующий пример модели.
При симуляции этой модели подсистема Atomic Unit и блоки Gain и Compare to Constant являются частью алгебраического цикла, который Simulink не может решить.
Если вы включите сокращение блоков и порядок выполнения и снова симулируете модель, Simulink не отображает порядок выполнения для блоков, которые были уменьшены. Теперь можно быстро увидеть, какие блоки были сокращены.
Блоки Compare to Constant и Gain были исключены из модели, поэтому они больше не генерируют алгебраическую ошибку цикла. Подсистема Atomic Unit генерирует предупреждение:
Warning: If the inport 'ex_aloop_block_reduction_errwarn/ Atomic Unit/In1' of subsystem 'ex_aloop_block_reduction_errwarn/ Atomic Unit' involves direct feedback, then an algebraic loop exists, which Simulink cannot remove. Consider clearing the 'Minimize algebraic loop occurrences' parameter to avoid this warning.
Совет
Используйте блоки Bus Selector, чтобы передать только необходимые сигналы в атомарные подсистемы.
Установка параметра Minimize algebraic loop occurrences не всегда работает. Simulink не может изменить DirectFeedthrough
свойство блока Inport для атомарной подсистемы, если блок Inport соединен с блоком Outport только через блоки с прямой передачей.
В этой модели подсистема Plant+Controller вызывает алгебраический цикл, но она имеет дополнительный Gain блок и дополнительный выход.
Simulink не может переместить mdlOutputs
метод блока Controller в mdlDerivative
метод атомарного модуля 1, потому что выход атомарной подсистемы зависит от выхода Controller блока. Вы не можете сделать подсистему некорректной.
Можно изменить эту модель, чтобы исключить искусственный алгебраический цикл путем переопределения атомарной подсистемы путем добавления дополнительных Inport и Gain блоков, как вы можете видеть в модели здесь. Это делает In1 непрямым и In2 прямым сквозным соединением, таким образом нарушая алгебраический цикл.