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

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

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

Simulink использует для этой цели два алгоритма: неадаптивный и адаптивный. Для получения информации об этих методах, см. Алгоритмы пересечения нулем.

Демонстрация эффектов чрезмерного обнаружения пересечения нулем

Этот пример предоставляет три модели, которые иллюстрируют поведение пересечения нулем: example_bounce_two_integrators, example_doublebounce, и example_bounce.

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

The example_bounce модель использует лучший проект модели, реализуя динамику мяча с помощью двойного интегратора, чем example_bounce_two_integrators.

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

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

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

  2. Когда появится блок-схема, установите параметр Solver details > Zero-crossing options > Algorithm в панели Solver параметров конфигурации Model равным Nonadaptive. Установите время остановки модели равным 20 с. Вы можете изменить эту настройку на панели инструментов Simulink или Solver параметров конфигурации модели.

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

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

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

Измените симуляцию время остановки на 25 с и симулируйте модель. Симуляция останавливается с ошибкой из-за чрезмерных последовательных событий пересечения нулем в блоках Compare To Zero и Position.

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'
--------------------------------------------------------------------------------
 

Несмотря на то, что вы можете увеличить этот предел путем корректировки параметра Model Configuration Parameters > Solver > Number of complinative null crossings, это изменение все еще не позволяет продолжаться симуляции в течение 25 с.

Измените детали Решателя > Пересечению нулем опций > Параметру алгоритма в панели Решателя параметров конфигурации Model на Adaptive и моделируйте модель снова в течение 25 с.

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

The example_bounce модель использует блок Интегратора Второго Порядка, чтобы смоделировать динамику прыгающего мяча. Это предпочтительный метод для моделирования двойного интегрирования динамики мяча для эффективности решателя. Сравнение эффективности решателя для example_bounce_two_integrators и example_bounceпопробуйте запустить Solver Profiler на обеих моделях. Подробное сравнение обеих моделей смотрите в Симуляции Прыгающего Мяча.

Для сравнение друга с другом адаптивных и неадаптивных алгоритмов обнаружения пересечения нулем смотрите Double Bouncing Ball: Использование адаптивного местоположения пересечения нулем.

Предотвращение чрезмерных пересечений нуля

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

Тип измененияПроцедура измененияПреимущества

Увеличение количества разрешенных пересечений нуля

Увеличьте значение Number of consecutive zero crossings. опция на панели Solver в диалоговом окне Параметры конфигурации (Configuration Parameters).

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

Расслабьте Signal threshold

Выберите Adaptive из раскрывающегося списка Algorithm и увеличьте значение опции Signal threshold на панели Solver в диалоговом окне Параметры конфигурации.

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

Используйте алгоритм Adaptive

Выберите Adaptive из раскрывающегося списка Algorithm на панели Solver в диалоговом окне Параметры конфигурации.

Этот алгоритм динамически корректирует порог пересечения нулем, что улучшает точность и уменьшает количество обнаруженных последовательных пересечений нуля. С помощью этого алгоритма у вас есть опция задать и Time tolerance, и Signal threshold.

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

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

  2. Выберите Use local settings из раскрывающегося списка Zero-crossing control на панели Solver диалогового окна Параметры конфигурации.

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

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

Выберите Disable all из раскрывающегося списка Zero-crossing control на панели Solver диалогового окна Параметры конфигурации.

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

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

Выберите значение из Maximum order щелкните на панели Solver диалогового окна Параметры конфигурации.

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

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

Введите значение для Max step size опция на панели Solver диалогового окна Параметры конфигурации (Configuration Parameters).

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

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

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

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

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

Рассмотрим реализацию модели отскока с двумя интеграторами.

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

From File

Первый, чтобы обнаружить, когда входной сигнал имеет разрыв в направлении подъёма или падения

From Workspace

Первый, чтобы обнаружить, когда входной сигнал имеет разрыв в направлении подъёма или падения

Hit Crossing

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

If

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

Integrator

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

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

MinMax

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

Relational Operator

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

Relay

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

Saturation

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

Second-Order Integrator

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

Sign

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

Signal Editor

Первый, чтобы обнаружить, когда входной сигнал имеет разрыв в направлении подъёма или падения

Step

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

Switch

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

Switch Case

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

Trigger

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

Enabled and Triggered Subsystem

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

  • либо - пересечение нуля происходит, если происходит условия подъёма или падения.

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

Похожие темы