Уменьшайте нулевые пересечения

Почему уменьшают нулевые пересечения?

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

Получите ссылочные результаты и постройте размер шага симуляции

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

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

  • Оцените точность своей измененной модели.

  1. Открыть модель, в командной строке MATLAB®, введите:

    model = 'ssc_pneumatic_rts_stiffness_redux'; 
    open_system(model)
    

  2. Моделируйте модель:

    sim(model)

  3. Сохраните данные к рабочей области.

    simlogRef = simlog;
    timeRef = tout;

  4. Постройте размер шага против времени симуляции.

    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 секунд.

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

  6. Чтобы получить ссылочные результаты для частоты вращения двигателя, откройте подсистему Измерений. Выберите блок Ideal Rotational Motion Sensor. С выбранным блоком используйте функцию simscape.logging.sli.findNode, чтобы найти и сохранить узел, который содержит данные для W, сигнал для угловой скорости двигателя.

    nRef = simscape.logging.sli.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]

  7. Используйте функцию simscape.logging.plot, чтобы построить ссылочные результаты для W .

    simscape.logging.plot(nRef.W);

Идентифицируйте и измените элементы тот нуль причины пересечения

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

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

    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)
    
    Результаты показывают, что 50 обнаруженных нулевых пересечений происходят в Направленном блоке клапана с 5 путями (46 пересечений) и блоке Pneumatic Motor (4 пересечения).

  2. Используйте функцию sscexplore, чтобы открыть Проводник Результатов Simscape, чтобы взаимодействовать с регистрируемыми данными моделирования.

    sscexplore(simlogRef)

  3. В дереве результатов нажмите Pneumatic Motor, чтобы видеть результаты для двигателя.

    Большинство нулевых пересечений происходит между t = 0 и t =1 секунда, когда другие сигналы в блоке являются близким нулем. Несколько остающихся нулевых пересечений происходят приблизительно в t = 5 секунд.

  4. Чтобы идентифицировать исходный код, который инициировал некоторые нулевые пересечения, выберите 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 путями. Откройтесь Направленный клапан с 5 путями блокируют диалоговое окно и задают 995 для параметра Maximum orifice area (mm^2).

Анализируйте результаты измененной модели

Сравните результаты со ссылочными результатами гарантировать точность вашей измененной модели. Подтвердите, что ваша измененная модель имеет меньше нулевых пересечений.

  1. Моделируйте модель и распечатайте нулевые данные о пересечении.

    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.

  2. Сравните результаты с помощью функции simscape.logging.plot, чтобы построить ссылочные результаты и результаты измененной модели к одному графику:

    simscape.logging.plot...
        ({simlogRef.Measurements.Ideal_Rotational_Motion_Sensor.W...
        simlog.Measurements.Ideal_Rotational_Motion_Sensor.W}, ...
        'names', {'Reference','Modified'})

    Результаты выглядят одинаково.

  3. Масштабируйте управление для более внимательного рассмотрения в точке перегиба в 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])

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

    Чтобы улучшить скорость симуляции далее прежде, чем выполнить рабочий процесс симуляции в реальном времени с этой моделью, попробуйте:

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

    • Сокращение любой числовой жесткости, которая ответственна за небольшие шаги

Смотрите также

| | |

Связанные примеры

Больше о