Развертывание приложений требует использования решателя фиксированного шага. Вы обычно используете решатель переменного шага для настольной симуляции. Решатели переменного шага делают меньшие шаги, когда они обнаруживают событие пересечения нулем. Меньшие шаги помогают получить движущие силы, которые вызывают нуль, пересекающийся точно. Решатели фиксированного шага не варьируются размер шагов, которые они делают. Если ваша модель полагается в большой степени на обнаружение нулевых пересечений, вы можете должны быть задать очень небольшой размер фиксированного шага, чтобы получить динамику точно. Размер небольшого шага может привести к переполнениям во время симуляции в реальном времени. Путем сокращения количества нулевых пересечений можно сконфигурировать решатель, чтобы использовать больший размер шага и для переменного шага и для развертывания фиксированного шага при генерации результатов, которые достаточно точны.
Симулируйте свою модель, чтобы сгенерировать данные, для которых можно использовать:
Решите который элементы модели измениться, чтобы сократить количество событий пересечения нулем.
Оцените точность своей модифицированной модели.
Открыть модель, в командной строке MATLAB®, введите:
model = 'ssc_pneumatic_rts_stiffness_redux';
open_system(model)
Симулируйте модель:
sim(model)
Сохраните данные к рабочей области.
simlogRef = simlog; timeRef = tout;
Постройте размер шага против времени симуляции.
h1 = figure; semilogy(timeRef(1:end-1),diff(timeRef),'-x') title('Solver Step Size') xlabel('Time (s)') ylabel('Step Size (s)')
Симуляция замедляется неоднократно в начале симуляции и во время t = ~1, 4, 5, 8, и 9 секунд.
Масштабируйте, чтобы исследовать данные между временем t = 0,8 и 1,03 секунды.
h1; xStart = 0; xEnd = 10; yStart = 0; yEnd = 10e0; xZoomStart1 = 0.8; xZoomEnd1 = 1.03; yZoomStart1 = 10e-20; yZoomEnd1 = 10e-1; axis([xZoomStart1 xZoomEnd1 yZoomStart1 yZoomEnd1])
Синий x
маркеры на рисунке указывают, что симуляция завершила выполнение шага. Окруженные маркеры указывают на размер очень небольшого шага и представляют события пересечения нулем. Размер шага уменьшается к приблизительно 10e-15 секунды для каждого обнаружения пересечения нулем.
Чтобы получить ссылочные результаты для частоты вращения двигателя, откройте подсистему Измерений. Выберите блок Ideal Rotational Motion Sensor. С выбранным блоком используйте simscape.logging.findNode
функционируйте, чтобы найти и сохранить узел, который содержит данные для W
, сигнал для скорости вращения двигателя.
nRef = simscape.logging.findNode(simlogRef,gcbh)
nRef = Node with properties: id: 'Ideal_Rotational_Motion_Sensor' savable: 1 exportable: 0 phi: [1×1 simscape.logging.Node] C: [1×1 simscape.logging.Node] R: [1×1 simscape.logging.Node] A: [1×1 simscape.logging.Node] w: [1×1 simscape.logging.Node] t: [1×1 simscape.logging.Node] W: [1×1 simscape.logging.Node]
Используйте simscape.logging.plot
функционируйте, чтобы построить ссылочные результаты для W
.
simscape.logging.plot(nRef.W);
Анализируйте данные моделирования, чтобы определить элементы, ответственные за нулевые пересечения. Измените модель, чтобы сократить количество нулевых пересечений, которые вызывают те элементы.
Используйте Simscape™ sscprintzcs
функционируйте, чтобы распечатать информацию о пересечении нулем для регистрируемых данных моделирования.
sscprintzcs(simlogRef)
ssc_pneumatic_rts_stiffness_redux (42 signals, 50 crossings) +-Directional_5_way_valve (38 signals, 46 crossings) | +-Variable_Area_Orifice_1 (9 signals, 13 crossings) | +-Variable_Area_Orifice_2 (9 signals, 10 crossings) | +-Variable_Area_Orifice_3 (9 signals, 14 crossings) | +-Variable_Area_Orifice_4 (11 signals, 9 crossings) +-Pipe_1 (2 signals, 0 crossings) | +-Constant_Chamber (2 signals, 0 crossings) +-Pneumatic_Motor (2 signals, 4 crossings)
Используйте sscexplore
функционируйте, чтобы открыть Проводник Результатов Simscape, чтобы взаимодействовать с регистрируемыми данными моделирования.
sscexplore(simlogRef)
В дереве результатов нажмите Pneumatic Motor, чтобы видеть результаты для двигателя.
Большинство нулевых пересечений находится между t = 0 и t =1 секунда, когда другие сигналы в блоке являются близким нулем. Несколько остающихся нулевых пересечений происходят приблизительно в t = 5 секунд.
Чтобы идентифицировать исходный код, который инициировал некоторые нулевые пересечения, выберите Directional 5-way valve> Variable Area Orifice 2> SimulationStatistics (ZeroCrossings)> zc_1 - 8 crossings. Щелкните по ссылке Pneumatic.Elements.VariableOrifice, которая появляется в ниже, левый угол окна.
Исходный код для блока Pneumatic Motor открывается курсором в этом коде:
% Area - limit to be greater than Area0 AreaL = if Area<Area0, Area0 else Area end;
Условный оператор, который ответственен за нулевые пересечения, связан с площадью постоянного отверстия.
Сократите число нулевых пересечений путем уменьшения максимальной площади постоянного отверстия Направленного клапана с 5 путями. Откройте Направленное диалоговое окно блока клапана с 5 путями и задайте 995
для параметра Maximum orifice area (mm^2).
Сравните результаты со ссылочными результатами гарантировать точность вашей модифицированной модели. Подтвердите, что ваша модифицированная модель имеет меньше нулевых пересечений.
Симулируйте модель и распечатайте нулевые данные о пересечении.
sim(model) sscprintzcs(simlog)
ssc_pneumatic_rts_stiffness_redux (42 signals, 30 crossings) +-Directional_5_way_valve (38 signals, 26 crossings) | +-Variable_Area_Orifice_1 (9 signals, 7 crossings) | +-Variable_Area_Orifice_2 (9 signals, 6 crossings) | +-Variable_Area_Orifice_3 (9 signals, 8 crossings) | +-Variable_Area_Orifice_4 (11 signals, 5 crossings) +-Pipe_1 (2 signals, 0 crossings) | +-Constant_Chamber (2 signals, 0 crossings) +-Pneumatic_Motor (2 signals, 4 crossings)
Общее количество нулевых пересечений уменьшилось с 50 до 30.
Сравните результаты с помощью simscape.logging.plot
функционируйте, чтобы построить ссылочные результаты и результаты модифицированной модели к одному графику:
simscape.logging.plot... ({simlogRef.Measurements.Ideal_Rotational_Motion_Sensor.W... simlog.Measurements.Ideal_Rotational_Motion_Sensor.W}, ... 'names', {'Reference','Modified'})
Результаты выглядят одинаково.
Масштабируйте управление для более внимательного рассмотрения в точке перегиба в t = ~ 5 секунд.
xStart = 0; xEnd = 10; yStart = -400; yEnd = 400; xZoomStart1 = 4.75; xZoomEnd1 = 5.15; yZoomStart1 = -20; yZoomEnd1 = 30; axis([xZoomStart1 xZoomEnd1 yZoomStart1 yZoomEnd1])
На этом уровне изменения масштаба вы видите небольшую разницу в результатах для модифицированной модели. Однако симуляция достаточно точна, что результаты оправдывают надежды на основе эмпирических и теоретических данных.
Чтобы улучшить скорость симуляции далее прежде, чем выполнить рабочий процесс симуляции в реальном времени с этой моделью, попробуйте:
Повторение метода, который, как показывают в этом примере, идентифицировал и настраивать другие элементы, которые вызывают нулевые пересечения, которые ответственны за небольшие шаги
Сокращение любой числовой жесткости, которая ответственна за небольшие шаги
simscape.logging.findNode
| simscape.logging.plotxy
| sscexplore
| sscprintzcs