Решатель переменного шага динамически настраивает размер временного шага, заставляя его увеличиться, когда переменная изменяется медленно и уменьшиться, когда переменная изменяется быстро. Это поведение заставляет решатель делать много небольших шагов около разрыва, потому что переменная быстро изменяется в этой области. Это улучшает точность, но может привести к чрезмерным временам симуляции.
Simulink® использует метод, который, как известно как обнаружение пересечения нулем, точно определял местоположение разрыва, не обращаясь к чрезмерно маленьким временным шагам. Обычно этот метод улучшает время выполнения симуляции, но это может заставить некоторые симуляции останавливаться перед намеченным временем завершения.
Simulink использует два алгоритма с этой целью: неадаптивный и адаптивный. Для получения информации об этих методах см. Алгоритмы Пересечения нулем.
Этот пример предоставляет три модели, которые иллюстрируют поведение пересечения нулем: example_bounce_two_integrators
, example_doublebounce
, и example_bounce
.
example_bounce_two_integrators
модель демонстрирует, как чрезмерные нулевые пересечения могут заставить симуляцию останавливаться перед намеченным временем завершения, если вы не используете адаптивный алгоритм.
example_bounce
модель использует лучший проект модели, реализовывая динамику мяча с помощью двойного интегратора, чем example_bounce_two_integrators
.
example_doublebounce
модель демонстрирует, как адаптивный алгоритм успешно решает сложную систему с двумя отличными требованиями пересечения нулем.
Рассмотрите example_bounce_two_integrators
модель. Это использует два один интегратора, чтобы вычислить вертикальную скорость и положение мяча за время симуляции.
Откройте модель путем выполнения open_system('example_bounce_two_integrators')
в командной строке.
Если блок-схема появляется, установите детали Решателя> опции Пересечения нулем> Параметр алгоритма в панели Решателя параметров конфигурации Модели к Nonadaptive
. Установите время остановки модели к 20 с. Можно изменить эти настройки в панели инструментов Simulink или панели Решателя параметров конфигурации модели.
Симулируйте модель.
Можно теперь просмотреть и анализировать результаты симуляции.
После более близкого исследования последнего фрагмента симуляции вы будете видеть, что скорость наводит чуть выше нуля.
Измените Время остановки симуляции в 25 с и симулируйте модель. Симуляция останавливается с ошибкой из-за чрезмерных последовательных событий пересечения нулем при Сравнивании С блоками Нуля и Положения.
Simulink will stop the simulation of model 'example_bounce_two_integrators' because the 2 zero crossing signal(s) identified below caused 1000 consecutive zero crossing events in time interval between 20.357636989536076 and 20.357636990631594. -------------------------------------------------------------------------------- Number of consecutive zero-crossings : 1000 Zero-crossing signal name : RelopInput Block type : RelationalOperator Block path : 'example_bounce_two_integrators/Compare To Zero/Compare' -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- Number of consecutive zero-crossings : 500 Zero-crossing signal name : IntgLoLimit Block type : Integrator Block path : 'example_bounce_two_integrators/Position' --------------------------------------------------------------------------------
Несмотря на то, что можно увеличить этот предел путем корректировки Параметров конфигурации Модели> Решатель>, Количество последовательного нулевого параметра пересечений, внося то изменение все еще не позволяет симуляции продолжаться в течение 25 с.
Измените детали Решателя> опции Пересечения нулем> Параметр алгоритма в панели Решателя параметров конфигурации Модели к Adaptive
и симулируйте модель снова в течение 25 с.
Увеличивая масштаб прошлых 5 секунд симуляции, вы видите, что результаты - больше завершенное и ближе к ожидаемому аналитическому решению динамики прыгающего мяча. Сумма болтовни, которую вы видите, является последствием состояний системы, приближающихся к нулю, и ожидается в числовых симуляциях.
example_bounce
модель использует блок Second-Order Integrator, чтобы смоделировать динамику прыгающего мяча. Это - предпочтительный метод смоделировать двойное интегрирование динамики мяча для эффективности решателя. Сравнить эффективность решателя для example_bounce_two_integrators
и example_bounce
, попытайтесь запустить Solver Profiler на обеих моделях. Для подробного сравнения обеих моделей смотрите Симуляцию Прыгающего мяча.
Для сравнения друг с другом адаптивных и неадаптивных алгоритмов обнаружения пересечения нулем смотрите Двойной Прыгающий мяч: Использование Адаптивного Местоположения Пересечения нулем.
Используйте следующую таблицу, чтобы предотвратить чрезмерные ошибки пересечения нулем в вашей модели.
Измените тип | Измените процедуру | Преимущества |
---|---|---|
Увеличьте число позволенных нулевых пересечений | Увеличьте значение Number of consecutive zero crossings. опция на Solver разделяет на области в диалоговом окне Configuration Parameters. | Это может дать ваше время достаточно модели, чтобы разрешить нулевое пересечение. |
Ослабьте Signal threshold | Выберите Adaptive из выпадающего Algorithm и увеличьте значение опции Signal threshold на панели Solver в диалоговом окне Configuration Parameters. | Решатель требует, чтобы меньше времени точно определило местоположение нулевого пересечения. Это может уменьшать время симуляции и устранить чрезмерное количество последовательных ошибок пересечения нулем. Однако ослабление Signal threshold может уменьшать точность. |
Используйте алгоритм Adaptive | Выберите Adaptive из Algorithm, выпадающего на панели Solver в диалоговом окне Configuration Parameters. | Этот алгоритм динамически настраивает порог пересечения нулем, который улучшает точность и сокращает количество последовательных нулевых обнаруженных пересечений. С этим алгоритмом у вас есть опция определения и Time tolerance и Signal threshold. |
Отключите обнаружение пересечения нулем для определенного блока |
| Локально отключающее обнаружение пересечения нулем препятствует тому, чтобы определенный блок остановил симуляцию из-за чрезмерных последовательных нулевых пересечений. Все другие блоки продолжают извлекать выгоду из увеличенной точности, которую обеспечивает обнаружение пересечения нулем. |
Отключите обнаружение пересечения нулем для целой модели | Выберите | Это препятствует тому, чтобы нулевые пересечения были обнаружены где угодно в вашей модели. Последствие - то, что ваш номер модели более длинные преимущества от увеличенной точности, которую обеспечивает обнаружение пересечения нулем. |
При использовании | Выберите значение из | Для получения дополнительной информации смотрите Максимальный порядок. |
Уменьшайте максимальный размер шага | Введите значение для | Решатель предпринимает шаги достаточно маленький, чтобы разрешить нулевое пересечение. Однако сокращение размера шага может увеличить время симуляции и редко необходимо при использовании адаптивного алгоритма. |
Возврат и модели двойного возврата, в Симуляции Прыгающего мяча и Двойного Прыгающего мяча: Использование Адаптивного Местоположения Пересечения нулем показывает, что высокочастотные колебания о разрыве (болтовня) могут заставить симуляцию преждевременно останавливаться.
Для решателя также возможно полностью пропустить нулевые пересечения, если ошибочные допуски решателя являются слишком большими. Это возможно, потому что проверки метода обнаружения пересечения нулем, чтобы видеть, изменило ли значение сигнала знак после главного временного шага. Изменение знака указывает, что произошло нулевое пересечение, и алгоритм пересечения нулем ищет точное время пересечения. Однако, если нулевое пересечение происходит во временном шаге, но значения вначале и конец шага не указывают на изменение знака, решатель переступает через пересечение, не обнаруживая его.
Следующий рисунок показывает сигнал, что кресты обнуляют. Прежде всего интегратор переступает через событие, потому что знак не изменился между временными шагами. Во втором решатель обнаруживает изменение знака и поэтому обнаруживает событие пересечения нулем.
Рассмотрите реализацию 2D интегратора модели возврата.
Профилирование прошлых 0,5 с симуляции с помощью Solver Profiler показывает, что симуляция обнаруживает 44 события пересечения нулем в блоке Compare To Zero и 22 события при выходе блока Position.
Увеличьте значение параметра Relative tolerance к 1e-2
вместо 1e-3
по умолчанию. Можно изменить этот параметр в разделе Solver Details панели Solver в диалоговом окне Configuration Parameters или использовании
set_param
задавать RelTol
как '1e-2'
.
Профилирование прошлых 0,5 с симуляции с новой относительной погрешностью решателя показывает, что обнаруживает только 24 события пересечения нулем в блоке Compare To Zero и 12 событий при выходе блока Position.
Блок может указать набор переменных пересечения нулем, каждая из которых является функцией переменной состояния, которая может иметь разрыв. Функция пересечения нулем проходит через нуль от положительной или отрицательной величины, когда соответствующий разрыв происходит. Зарегистрированные переменные пересечения нулем обновляются в конце каждого шага симуляции, и любая переменная, которая изменила знак, идентифицирована как имевший событие пересечения нулем.
Если какие-либо нулевые пересечения обнаруживаются, программное обеспечение Simulink интерполирует между предыдущими и текущими значениями каждой переменной, которая изменила знак, чтобы оценить времена нулевых пересечений, то есть, разрывов.
Примечание
Алгоритм обнаружения Пересечения нулем может заключить в скобки события пересечения нулем только для сигналов типа данных double
.
В следующей таблице перечислены блоки, которые указывают нулевые пересечения, и объясняет, как блоки используют нулевые пересечения.
Блок | Количество нулевых обнаружений пересечения |
---|---|
Один, чтобы обнаружить, когда входной сигнал пересекает нуль или в повышении или в падающем направлении. | |
Два, один, чтобы обнаружить, когда верхний порог занят, и один, чтобы обнаружить, когда более низкий порог занят. | |
Один, чтобы обнаружить, когда сигнал равняется константе. | |
Один, чтобы обнаружить, когда сигнал равняется нулю. | |
Два, один, чтобы обнаружить, когда мертвая зона вводится (входной сигнал минус нижний предел), и один, чтобы обнаружить, когда из мертвой зоны выходят (входной сигнал минус верхний предел). | |
Один, Если порт Enable в блоке Subsystem, он предусматривает возможность обнаружить нулевые пересечения. Для получения дополнительной информации, Используя Enabled Подсистемы. | |
Один, чтобы обнаружить, когда входной сигнал имеет разрыв или в повышении или в падающем направлении | |
Один, чтобы обнаружить, когда входной сигнал имеет разрыв или в повышении или в падающем направлении | |
Один или два. Если нет никакого выходного порта, существует только один нуль, пересекающийся, чтобы обнаружить, когда входной сигнал поразил пороговое значение. Если существует выходной порт, второе нулевое пересечение используется, чтобы возвратить выход 0 от 1, чтобы создать подобный импульсу выход. | |
Один, чтобы обнаружить, когда, Если условие соблюдают. | |
Если порт сброса присутствует, чтобы обнаружить, когда сброс происходит. Если выход ограничивается, существует три нулевых пересечения: один, чтобы обнаружить, когда верхний предел насыщения достигнут, один, чтобы обнаружить, когда более низкий предел насыщения достигнут, и один, чтобы обнаружить, когда насыщение оставляют. | |
Один, для каждого элемента выходного вектора, чтобы обнаружить, когда входной сигнал является новым минимумом или максимумом. | |
Один, чтобы обнаружить, когда заданное отношение верно. | |
Один, если реле выключено, чтобы обнаружить переключатель - на точке. Если реле работает, чтобы обнаружить выключать точку. | |
Два, один, чтобы обнаружить, когда верхний предел достигнут или оставлен, и один, чтобы обнаружить, когда нижний предел достигнут или оставлен. | |
Пять, два, чтобы обнаружить, когда state x верхнее или нижний предел достигнуты, два, чтобы обнаружить, когда dx состояния/dt верхний или нижний предел достигнут, и один, чтобы обнаружить, когда состояние оставляет насыщение. | |
Один, чтобы обнаружить, когда вход пересекается через нуль. | |
Один, чтобы обнаружить, когда входной сигнал имеет разрыв или в повышении или в падающем направлении | |
Один, чтобы обнаружить время шага. | |
Один, чтобы обнаружить, когда условие переключателя происходит. | |
Один, чтобы обнаружить, когда условие случая соблюдают. | |
Один, Если порт Triggered в блоке Subsystem, он предусматривает возможность обнаружить нулевые пересечения. Для получения дополнительной информации смотрите Используя Триггируемые подсистемы. | |
Два, один для разрешать порта и один для триггерного порта. Для получения дополнительной информации см.: Используя Enabled и Triggered подсистемы |
Примечание
Обнаружение пересечения нулем также доступно для графика Stateflow®, который использует режим непрерывного времени. Смотрите Конфигурируют диаграмму Stateflow для Симуляции Непрерывного времени (Stateflow) для получения дополнительной информации.
Примером блока Simulink, который указывает нулевые пересечения, является блок Saturation. Обнаружение пересечения нулем идентифицирует эти события состояния в блоке Saturation:
Входной сигнал достигает верхнего предела.
Входной сигнал оставляет верхний предел.
Входной сигнал достигает нижнего предела.
Входной сигнал оставляет нижний предел.
Блоки Simulink, которые задают их собственные события состояния, как рассматривается, имеют внутренние нулевые пересечения. Используйте блок Hit Crossing, чтобы получить явное уведомление о событии пересечения нулем. Смотрите Блоки, Что Нулевые Пересечения Регистра для списка блоков, которые включают нулевые пересечения.
Обнаружение события состояния зависит от конструкции внутреннего сигнала пересечения нулем. Этот сигнал не доступен блок-схемой. Для блока Saturation сигналом, который используется, чтобы обнаружить нулевые пересечения для верхнего предела, является zcSignal = UpperLimit
U
, где u
входной сигнал.
Сигналы пересечения нулем имеют атрибут направления, который может иметь эти значения:
при повышении — происходит нулевое пересечение, когда сигнал повышается до или через нуль, или когда сигнал оставляет нуль и становится положительным.
при падении — происходит нулевое пересечение, когда сигнал падает на или через нуль, или когда сигнал оставляет нуль и становится отрицательным.
также — Нулевое пересечение происходит, если или повышение или падающее условие происходят.
Для верхнего предела блока Saturation направление нулевого пересечения также. Это позволяет вводу и отъезду событий насыщения быть обнаруженным с помощью того же сигнала пересечения нулем.