Обнаружение пересечения нулем

Решатель переменного шага динамически настраивает размер временного шага, заставляя его увеличиться, когда переменная изменяется медленно и уменьшиться, когда переменная изменяется быстро. Это поведение заставляет решатель делать много небольших шагов около разрыва, потому что переменная быстро изменяется в этой области. Это улучшает точность, но может привести к чрезмерным временам симуляции.

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 модель. Это использует два один интегратора, чтобы вычислить вертикальную скорость и положение мяча за время симуляции.

  1. Откройте модель путем выполнения open_system('example_bounce_two_integrators') в командной строке.

  2. Если блок-схема появляется, установите детали Решателя> опции Пересечения нулем> Параметр алгоритма в панели Решателя параметров конфигурации Модели к Nonadaptive. Установите время остановки модели к 20 с. Можно изменить эти настройки в панели инструментов Simulink или панели Решателя параметров конфигурации модели.

  3. Симулируйте модель.

Можно теперь просмотреть и анализировать результаты симуляции.

После более близкого исследования последнего фрагмента симуляции вы будете видеть, что скорость наводит чуть выше нуля.

Измените Время остановки симуляции в 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.

Отключите обнаружение пересечения нулем для определенного блока

  1. Снимите флажок Enable zero-crossing detection на диалоговом окне параметра блока.

  2. Выберите Use local settings от Zero-crossing control, выпадающего на панели Solver диалогового окна Configuration Parameters.

Локально отключающее обнаружение пересечения нулем препятствует тому, чтобы определенный блок остановил симуляцию из-за чрезмерных последовательных нулевых пересечений. Все другие блоки продолжают извлекать выгоду из увеличенной точности, которую обеспечивает обнаружение пересечения нулем.

Отключите обнаружение пересечения нулем для целой модели

Выберите Disable all от Zero-crossing control, выпадающего на панели Solver диалогового окна Configuration Parameters.

Это препятствует тому, чтобы нулевые пересечения были обнаружены где угодно в вашей модели. Последствие - то, что ваш номер модели более длинные преимущества от увеличенной точности, которую обеспечивает обнаружение пересечения нулем.

При использовании ode15s решатель, рассмотрите корректировку порядка числовых формул дифференцирования

Выберите значение из Maximum order выпадающий на панели Solver диалогового окна Configuration Parameters.

Для получения дополнительной информации смотрите Максимальный порядок.

Уменьшайте максимальный размер шага

Введите значение для Max step size опция на панели Solver диалогового окна Configuration Parameters.

Решатель предпринимает шаги достаточно маленький, чтобы разрешить нулевое пересечение. Однако сокращение размера шага может увеличить время симуляции и редко необходимо при использовании адаптивного алгоритма.

Как средство моделирования может пропустить События пересечения нулем

Возврат и модели двойного возврата, в Симуляции Прыгающего мяча и Двойного Прыгающего мяча: Использование Адаптивного Местоположения Пересечения нулем показывает, что высокочастотные колебания о разрыве (болтовня) могут заставить симуляцию преждевременно останавливаться.

Для решателя также возможно полностью пропустить нулевые пересечения, если ошибочные допуски решателя являются слишком большими. Это возможно, потому что проверки метода обнаружения пересечения нулем, чтобы видеть, изменило ли значение сигнала знак после главного временного шага. Изменение знака указывает, что произошло нулевое пересечение, и алгоритм пересечения нулем ищет точное время пересечения. Однако, если нулевое пересечение происходит во временном шаге, но значения вначале и конец шага не указывают на изменение знака, решатель переступает через пересечение, не обнаруживая его.

Следующий рисунок показывает сигнал, что кресты обнуляют. Прежде всего интегратор переступает через событие, потому что знак не изменился между временными шагами. Во втором решатель обнаруживает изменение знака и поэтому обнаруживает событие пересечения нулем.

Рассмотрите реализацию 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.

Блоки тот нуль регистра пересечения

В следующей таблице перечислены блоки, которые указывают нулевые пересечения, и объясняет, как блоки используют нулевые пересечения.

БлокКоличество нулевых обнаружений пересечения

Abs

Один, чтобы обнаружить, когда входной сигнал пересекает нуль или в повышении или в падающем направлении.

Backlash

Два, один, чтобы обнаружить, когда верхний порог занят, и один, чтобы обнаружить, когда более низкий порог занят.

Сравните с постоянным

Один, чтобы обнаружить, когда сигнал равняется константе.

Сравните с нулем

Один, чтобы обнаружить, когда сигнал равняется нулю.

Dead Zone

Два, один, чтобы обнаружить, когда мертвая зона вводится (входной сигнал минус нижний предел), и один, чтобы обнаружить, когда из мертвой зоны выходят (входной сигнал минус верхний предел).

Enable

Один, Если порт Enable в блоке Subsystem, он предусматривает возможность обнаружить нулевые пересечения. Для получения дополнительной информации, Используя Enabled Подсистемы.

From File

Один, чтобы обнаружить, когда входной сигнал имеет разрыв или в повышении или в падающем направлении

From Workspace

Один, чтобы обнаружить, когда входной сигнал имеет разрыв или в повышении или в падающем направлении

Hit Crossing

Один или два. Если нет никакого выходного порта, существует только один нуль, пересекающийся, чтобы обнаружить, когда входной сигнал поразил пороговое значение. Если существует выходной порт, второе нулевое пересечение используется, чтобы возвратить выход 0 от 1, чтобы создать подобный импульсу выход.

If

Один, чтобы обнаружить, когда, Если условие соблюдают.

Integrator

Если порт сброса присутствует, чтобы обнаружить, когда сброс происходит.

Если выход ограничивается, существует три нулевых пересечения: один, чтобы обнаружить, когда верхний предел насыщения достигнут, один, чтобы обнаружить, когда более низкий предел насыщения достигнут, и один, чтобы обнаружить, когда насыщение оставляют.

MinMax

Один, для каждого элемента выходного вектора, чтобы обнаружить, когда входной сигнал является новым минимумом или максимумом.

Relational Operator

Один, чтобы обнаружить, когда заданное отношение верно.

Relay

Один, если реле выключено, чтобы обнаружить переключатель - на точке. Если реле работает, чтобы обнаружить выключать точку.

Saturation

Два, один, чтобы обнаружить, когда верхний предел достигнут или оставлен, и один, чтобы обнаружить, когда нижний предел достигнут или оставлен.

Second-Order Integrator

Пять, два, чтобы обнаружить, когда state x верхнее или нижний предел достигнуты, два, чтобы обнаружить, когда dx состояния/dt верхний или нижний предел достигнут, и один, чтобы обнаружить, когда состояние оставляет насыщение.

Sign

Один, чтобы обнаружить, когда вход пересекается через нуль.

Signal Editor

Один, чтобы обнаружить, когда входной сигнал имеет разрыв или в повышении или в падающем направлении

Step

Один, чтобы обнаружить время шага.

Switch

Один, чтобы обнаружить, когда условие переключателя происходит.

Switch Case

Один, чтобы обнаружить, когда условие случая соблюдают.

Trigger

Один, Если порт Triggered в блоке Subsystem, он предусматривает возможность обнаружить нулевые пересечения. Для получения дополнительной информации смотрите Используя Триггируемые подсистемы.

Enabled and Triggered Subsystem

Два, один для разрешать порта и один для триггерного порта. Для получения дополнительной информации см.: Используя Enabled и Triggered подсистемы

Примечание

Обнаружение пересечения нулем также доступно для графика Stateflow®, который использует режим непрерывного времени. Смотрите Конфигурируют диаграмму Stateflow для Симуляции Непрерывного времени (Stateflow) для получения дополнительной информации.

Пример реализации: блок насыщения

Примером блока Simulink, который указывает нулевые пересечения, является блок Saturation. Обнаружение пересечения нулем идентифицирует эти события состояния в блоке Saturation:

  • Входной сигнал достигает верхнего предела.

  • Входной сигнал оставляет верхний предел.

  • Входной сигнал достигает нижнего предела.

  • Входной сигнал оставляет нижний предел.

Блоки Simulink, которые задают их собственные события состояния, как рассматривается, имеют внутренние нулевые пересечения. Используйте блок Hit Crossing, чтобы получить явное уведомление о событии пересечения нулем. Смотрите Блоки, Что Нулевые Пересечения Регистра для списка блоков, которые включают нулевые пересечения.

Обнаружение события состояния зависит от конструкции внутреннего сигнала пересечения нулем. Этот сигнал не доступен блок-схемой. Для блока Saturation сигналом, который используется, чтобы обнаружить нулевые пересечения для верхнего предела, является zcSignal = UpperLimit U, где u входной сигнал.

Сигналы пересечения нулем имеют атрибут направления, который может иметь эти значения:

  • при повышении — происходит нулевое пересечение, когда сигнал повышается до или через нуль, или когда сигнал оставляет нуль и становится положительным.

  • при падении — происходит нулевое пересечение, когда сигнал падает на или через нуль, или когда сигнал оставляет нуль и становится отрицательным.

  • также — Нулевое пересечение происходит, если или повышение или падающее условие происходят.

Для верхнего предела блока Saturation направление нулевого пересечения также. Это позволяет вводу и отъезду событий насыщения быть обнаруженным с помощью того же сигнала пересечения нулем.

Похожие темы