Сокращение пересечений нуля

Зачем сокращать пересечения нуля?

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

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

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

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

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

  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. Чтобы получить эталонные результаты для скорости двигателя, откройте Подсистему измерений. Выберите Идеальный Датчик Вращательного Движения,. С выбранным блоком используйте 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]

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

    simscape.logging.plot(nRef.W);

Идентифицируйте и изменяйте элементы, вызывающие пересечения нуля

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

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

  2. Используйте sscexplore функция для открытия Simscape Results Explorer для взаимодействия с записанными в журнал данными моделирования.

    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])

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

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

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

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

См. также

| | |

Похожие примеры

Подробнее о