Решатель с переменным шагом динамически регулирует размер временного шага, вызывая его увеличение при медленном изменении переменной и уменьшение при быстром изменении переменной. Это поведение приводит к тому, что решатель делает много небольших шагов вблизи разрыва, поскольку переменная быстро изменяется в этой области. Это повышает точность, но может привести к чрезмерному времени моделирования.
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') в командной строке.
Как только появится блок-схема, задайте для параметра Параметры параметров конфигурации решателя > Параметры пересечения нуля > Алгоритм на панели Решатель (Solver) параметров конфигурации модели значение 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'
--------------------------------------------------------------------------------
Хотя этот предел можно увеличить, настроив параметр Параметры конфигурации модели (Model Configuration Parameters) > Решатель (Solver) > Количество последовательных пересечений нулей (Number of series zero crossings), это изменение по-прежнему не позволяет моделированию продолжаться в течение 25 с.
Измените параметры «Параметры пересечения нулей» > «Алгоритм» на панели «Параметры конфигурации модели». Adaptive и снова смоделировать модель в течение 25 с.

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

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

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


Используйте следующую таблицу для предотвращения чрезмерных ошибок пересечения нулей в модели.
| Изменить тип | Процедура изменения | Преимущества |
|---|---|---|
Увеличить количество разрешенных нулевых переходов | Увеличьте значение параметра Число последовательных пересечений нуля. на панели Решатель (Solver) в диалоговом окне Параметры конфигурации (Configuration Parameters). | Это может дать модели достаточно времени для разрешения пересечения нуля. |
Смягчить пороговое значение сигнала | Выберите Адаптивный (Adaptive) в раскрывающемся списке Алгоритм (Algorithm) и увеличьте значение опции Порог сигнала (Signal threshold) на панели Решатель (Solver) в диалоговом окне Параметры конфигурации (Configuration Parameters). | Решателю требуется меньше времени для точного определения местоположения пересечения нуля. Это может сократить время моделирования и исключить чрезмерное количество последовательных ошибок пересечения нуля. Однако ослабление порога сигнала может снизить точность. |
Использовать адаптивный алгоритм | Выберите Адаптивный (Adaptive) в раскрывающемся списке Алгоритм (Algorithm) на панели Решатель (Solver) в диалоговом окне Параметры конфигурации (Configuration Parameters). | Этот алгоритм динамически регулирует порог пересечения нуля, что повышает точность и уменьшает количество обнаруженных последовательных пересечений нуля. С помощью этого алгоритма можно задать допуск по времени и порог сигнала. |
Отключить обнаружение пересечения нулей для определенного блока |
| Локальное отключение обнаружения пересечения нуля предотвращает остановку моделирования определенным блоком из-за чрезмерных последовательных пересечений нуля. Все остальные блоки продолжают извлекать выгоду из повышенной точности, которую обеспечивает обнаружение пересечения нуля. |
Отключить обнаружение пересечения нулей для всей модели | Выбрать | Это предотвращает обнаружение нулевых пересечений в любом месте модели. Следствием этого является то, что ваша модель больше не получает преимуществ от повышенной точности, которую обеспечивает обнаружение пересечения нуля. |
При использовании | Выберите значение из списка | Дополнительные сведения см. в разделе Максимальный порядок. |
Уменьшить максимальный размер шага | Введите значение для | Решатель выполняет шаги, достаточно небольшие для разрешения пересечения нуля. Однако уменьшение размера шага может увеличить время моделирования и редко является необходимым при использовании адаптивного алгоритма. |
Модели отскока и двойного отскока в разделе Моделирование шара отскока и двойного шара отскока: использование адаптивного местоположения пересечения нулей показывает, что высокочастотные флуктуации о разрыве (болтовня) могут вызвать преждевременную остановку моделирования.
Решатель также может полностью пропустить пересечение нулей, если допуски ошибок решателя слишком велики. Это возможно, поскольку метод обнаружения пересечения нуля проверяет, изменилось ли значение сигнала после основного временного шага. Изменение знака указывает, что пересечение нуля произошло, и алгоритм пересечения нуля ищет точное время пересечения. Однако если пересечение нуля происходит в пределах временного шага, но значения в начале и конце шага не указывают на изменение знака, решатель выполняет пересечение, не обнаруживая его.
На следующем рисунке показан сигнал, пересекающий ноль. В первом случае интегратор выполняет шаг над событием, поскольку знак не изменился между шагами времени. Во втором случае решатель обнаруживает изменение знака и, следовательно, обнаруживает событие пересечения нуля.

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

Профилирование последних 0,5 с моделирования с использованием профилировщика решателя показывает, что моделирование обнаруживает 44 события пересечения нуля в блоке сравнения с нулем и 22 события на выходе блока положения.


Увеличение значения параметра Относительный допуск (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, он обеспечивает возможность обнаружения нулевых пересечений. Дополнительные сведения см. в разделе Использование включенных подсистем. | |
Во-первых, чтобы обнаружить, когда входной сигнал имеет разрыв в направлении подъема или падения | |
Во-первых, чтобы обнаружить, когда входной сигнал имеет разрыв в направлении подъема или падения | |
Один или два. Если выходной порт отсутствует, имеется только одно пересечение нуля для обнаружения того, когда входной сигнал достигает порогового значения. При наличии выходного порта второе пересечение нуля используется для возврата выходного сигнала к 0 из 1 для создания импульсного выходного сигнала. | |
Во-первых, чтобы определить, когда выполняется условие If. | |
Если порт сброса присутствует, для определения момента сброса. Если выход ограничен, есть три пересечения нуля: одно для обнаружения, когда достигнут верхний предел насыщения, одно для обнаружения, когда достигнут нижний предел насыщения, и одно для обнаружения, когда насыщение осталось. | |
Один для каждого элемента выходного вектора, чтобы обнаружить, когда входной сигнал является новым минимумом или максимумом. | |
Во-первых, чтобы определить, является ли указанное отношение истинным. | |
Один, если реле выключено, для обнаружения точки включения. Если реле включено, для обнаружения точки отключения. | |
Во-вторых, один для обнаружения, когда верхний предел достигнут или оставлен, и один для обнаружения, когда нижний предел достигнут или оставлен. | |
Пять, два для обнаружения, когда достигнуто состояние x верхнего или нижнего предела, два для обнаружения, когда достигнуто состояние dx/dt верхнего или нижнего предела, и один для обнаружения, когда состояние выходит из насыщения. | |
Во-первых, чтобы определить, когда вход пересекает ноль. | |
Во-первых, чтобы обнаружить, когда входной сигнал имеет разрыв в направлении подъема или падения | |
Во-первых, чтобы определить время шага. | |
Во-первых, чтобы определить, когда возникает состояние переключения. | |
Во-первых, чтобы определить, когда выполняется условие обращения. | |
Во-первых, если порт Triggered находится внутри блока Subsystem, он обеспечивает возможность обнаружения нулевых пересечений. Дополнительные сведения см. в разделе Использование инициированных подсистем. | |
Два, один для разрешающего порта и один для триггерного порта. Дополнительные сведения см. в разделе Использование включенных и запускаемых подсистем |
Примечание
Обнаружение пересечения нулей также доступно для диаграммы Stateflow ®, использующей режим непрерывного времени. Дополнительные сведения см. в разделе Настройка диаграммы потока состояний для моделирования непрерывного времени (поток состояний).
Примером блока Simulink, который регистрирует пересечение нуля, является блок насыщенности. Обнаружение пересечения нуля идентифицирует следующие события состояния в блоке Насыщения:
Входной сигнал достигает верхнего предела.
Входной сигнал выходит за верхний предел.
Входной сигнал достигает нижнего предела.
Входной сигнал выходит за нижний предел.
Считается, что блоки симулятора, определяющие собственные события состояния, имеют собственные пересечения нулей. Используйте блок пересечения совпадений для получения явного уведомления о событии пересечения нуля. Список блоков с нулевыми пересечениями см. в разделе Блоки, регистрирующие нулевые пересечения.
Обнаружение события состояния зависит от построения внутреннего сигнала пересечения нуля. Этот сигнал недоступен для блок-схемы. Для блока насыщения сигнал, который используется для обнаружения пересечений нуля для верхнего предела, равен zcSignal = UpperLimit - u, где u - входной сигнал.
Сигналы пересечения нуля имеют атрибут направления, который может иметь следующие значения:
повышение - пересечение нуля происходит, когда сигнал поднимается до нуля или через ноль, или когда сигнал выходит из нуля и становится положительным.
падение - пересечение нуля происходит, когда сигнал падает до нуля или через ноль, или когда сигнал выходит из нуля и становится отрицательным.
либо - пересечение нуля происходит, если возникает состояние подъема или падения.
Для верхнего предела блока насыщения направление пересечения нуля равно. Это позволяет обнаруживать входные и выходные события насыщения с использованием одного и того же сигнала пересечения нуля.