exponenta event banner

Уменьшение числовой жесткости

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

В разделе Определение размера шага (Define Step Size) используются результаты моделирования с переменным шагом модели Simscape™, чтобы определить, когда размер шага уменьшается, чтобы точно зафиксировать поведение при разрывах и для быстрой динамики в численно жестких системах. Такие типы событий часто требуют, чтобы решатели предпринимали шаги, которые слишком малы для поддержки моделирования в реальном времени. В этом примере показано, как использовать результаты определения размера шага для идентификации численно жесткого элемента в модели. В нем также показано, как изменить элемент для более быстрого моделирования без ущерба для точности.

Зачем уменьшать жесткость?

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

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

Обзор справочных результатов

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

    model = 'ssc_pneumatic_rts_reference';
    open_system(model)

  2. Моделирование модели:

    sim(model)

  3. Создайте фигуру, содержащую полулогарифмический график размера шага решателя, график результатов скорости двигателя и график результатов потока газа.

    h1 = figure;
    subplot(3,1,1)
    semilogy(tout(1:end-1),diff(tout),'-x')
    title('Solver Step Size and Results')
    ylabel('Step Size (s)')
    subplot(3,1,2)
    plot(tout,Pneu_rts_RPM_DATA.signals.values)
    ylabel('Speed (rpms)')
    subplot(3,1,3)
    plot(tout,Pneu_rts_Vol_Flow_DATA.signals.values)
    xlabel('Time (s)')
    ylabel('Flow Rate (m^3/min)')

    Моделирование занимает менее 1e-10 секунд, когда:

    • Частота вращения двигателя близка к нулю (время моделирования t = ~ 1, 5 и 9 секунд)

    • Ступенчатое изменение скорости двигателя начинается с установившейся скорости на новую (время t = ~ 4 и 8 секунд).

    • Ступенчатое изменение расхода инициируется с установившейся скорости на новую скорость потока (время t = ~ 4 и 8 секунд).

    • Объемный расход близок к нулю м ^ 3/мин (t = ~ 1, 4 и 5 секунд)

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

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

    timeRef  = tout;
    simlogRef = simlog;

Идентификация и изменение жесткого элемента

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

  1. Сохранить модель как rts_stiffness_model в доступной для записи папке по пути MATLAB.

  2. Откройте диалоговое окно «Блок фрикционной нагрузки», блок «Вращательное трение». На рисунке показана характеристика крутящего момента трения/относительной скорости для простого приближения непрерывного трения, которое моделирует блок.

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

  3. На вкладке Параметры (Parameters) диалогового окна измените скорость трения при разрыве с 0.059137 кому 0.1 рад/с.

  4. Моделирование измененной модели.

Анализ результатов

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

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

    h2 = figure;
    semilogy(timeRef(1:end-1),diff(timeRef),'-x',...
    	'LineWidth',1,'MarkerSize',7)
    hold on
    semilogy(tout(1:end-1),diff(tout),'--x','Color','r',...
    	'LineWidth',.1,'MarkerSize',5)
    title('Solver Step Size')
    xlabel('Time (s)')
    ylabel('Step Size (s)')
    h1Leg = legend({'Reference','Modified'},'Location','best');

    Размер шага восстанавливается быстрее после события, которое происходит во время моделирования t = 4 и 9 секунд. Моделирование в это время менее жесткое.

  2. Извлеките данные о скорости и времени из узлов регистрации для исходной и измененной моделей.

    speedRefNode = simlogRef.Measurements.Ideal_Rotational_Motion_Sensor.R.w;
    speedRef = speedRefNode.series.values('rpm');
    timeRef = speedRefNode.series.time;
    speedModNode = simlog.Measurements.Ideal_Rotational_Motion_Sensor.R.w;
    speedMod = speedModNode.series.values('rpm');
    timeMod = speedModNode.series.time;
    
  3. Постройте график и сравните результаты для данных скорости для обоих моделей, чтобы убедиться в точности измененной модели.

    h3 = figure;
    plot(timeRef,speedRef)
    h3;
    hold on
    plot(timeMod,speedMod,'r--')
    title('Speed')	
    xlabel('Time (s)')
    ylabel('Speed (rpms)')
    h3Leg = legend({'Reference','Modified'},'Location','best');

  4. Увеличьте изображение точки перегиба в момент времени (t) = ~ 5 секунд.

    h3;
    xStart = 0;
    xEnd = 10;
    yStart = -4000;
    yEnd = 4000;
    xZoomStart1 = 4.8;
    xZoomEnd1 = 5.2;
    yZoomStart1 = -400;
    yZoomEnd1 = 150;
    axis([xZoomStart1 xZoomEnd1 yZoomStart1 yZoomEnd1])

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

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

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

См. также

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

Подробнее