Размер шага и количество итераций, которые вы задаете для решателей в модели, влияют на скорость и точность вашей симуляции в реальном времени. Если вы уменьшаете размер шага или увеличиваете количество итераций, результаты более точны, но симуляция выполняется медленнее. Если вы увеличиваете размер шага или уменьшаете количество итераций, симуляция выполняется быстрее, но результаты менее точны.
Чтобы оптимизировать модель для симуляции на машине реального времени, задайте комбинацию размера шага (Ts) и количества итераций (N), которая обеспечивает приемлемую точность и скорость, чтобы избежать переполнения. Как и в случае с типом решателя, можно задать различные комбинации Ts и N значений для Simulink® глобальный решатель и для каждой независимой Simscape™ сети в вашей модели.
Этот рабочий процесс помогает вам выбрать размер шага и количество итераций для симуляции в реальном времени:
Получите эталонные результаты путем выполнения симуляции переменного шага на модели гидравлического привода.
Используйте измененную версию модели, чтобы определить максимальный размер шага, чтобы достичь достаточно точных результатов симуляции фиксированных и фиксированных затрат. Симуляция с фиксированной и фиксированной стоимостью требуется для симуляции в реальном времени.
Задайте глобальные и локальные настройки решателя с фиксированным шагом и фиксированными затратами для измененной версии модели.
Выполните временную симуляцию с измененной моделью и оцените точность результатов.
Настройте размер шага и количество итераций, чтобы найти настройки решателя, которые обеспечивают необходимую скорость и точность для симуляции в реальном времени.
Чтобы получить ссылку результаты, симулируйте исходную версию модели гидравлического привода.
Чтобы открыть модель гидравлического привода, в MATLAB® в командной строке введите:
model = 'ssc_hydraulic_actuator_digital_control';
open_system(model)
Модель сконфигурирована так, чтобы ограничивать точки данных. Чтобы сконфигурировать модель для регистрации всех точек dat, откройте параметры конфигурации модели и на панели Simscape снимите флажок Limit data points.
Симулируйте модель.
sim(model)
Извлеките данные для давления и шага симуляции из записанного узла Simscape.
simlogRef = simlog_ssc_hydraulic_actuator_digital_control;
pRefNode = simlogRef.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
pRef = pRefNode.series.values('Pa');
tRef = pRefNode.series.time;
Постройте график размера шага.
h1 = figure; semilogy(tRef(1:end-1),diff(tRef),'-x') title('Solver Step Size') xlabel('Time (s)') ylabel('Step Size (s)')
Максимальный размер шага (Tsmax) для получения точных результатов в реальном времени для исходной модели составляет приблизительно 1e-2 секунды. Для получения информации об определении Tsmax см. Раздел «Определение размера шага».
Постройте график результатов симуляции.
h2 = figure; plot(tRef,pRef, 'b-') h2Legend1 = legend({'Reference'},'Location','southoutside'); title('Cylinder Pressure') xlabel('Time (s)') ylabel('Pressure (Pa)')
В измененной версии модели гидравлического привода можно изменить значение Tsmax, максимальный размер шага для достижения точных результатов симуляции в реальном времени.
Откройте измененную модель гидравлического привода.
ssc_hydraulic_actuator_HIL
Этот вариант гидравлического привода содержит дискретизированный, разделенный контроллер. Локальный решатель для гидравлической подсистемы привода включен для симуляции с фиксированной скоростью и фиксированной стоимостью. Размер шага параметризован (ts), так что можно сделать корректировки решателя, которые уменьшают вероятность генерации переполнения. Для примера, который показывает, как дискретизировать контроллер для гидравлического привода, смотрите Гидравлический привод, сконфигурированный для программное-аппаратного тестирования.
Чтобы определить максимальный размер шага для достижения точных результатов симуляции в реальном времени, вы симулируете с глобальным, переменным решателем. Чтобы сконфигурировать измененную модель для симуляции с переменным шагом с помощью глобального решателя, отключите строение решателя. В Подсистеме Гидравлического Привода в диалоговом окне Solver Configuration блока снимите флажок Use local solver.
Симулируйте модель.
Извлеките данные о давлении и времени из зарегистрированного узла Simscape.
simlog0 = simlog_ssc_hydraulic_actuator_HIL;
pNodeSim0 = simlog0.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
pSim0 = pNodeSim0.series.values('Pa');
tSim0 = pNodeSim0.series.time;
Постройте график размера шага к рисунку, который содержит данные размера шага для исходной модели.
figure(h1) hold on semilogy(tSim0(1:end-1),diff(tSim0),'--x', 'Color','r',... 'LineWidth',.1,'MarkerSize',5) title('Solver Step Size') xlabel('Time (s)') ylabel('Step Size (s)') h1Legend1 = legend({'Reference','Modified'},... 'Location','southoutside');
Для дискретизированной модели Tsmax находится между 1e-2 и 1e-3 секундами.
Чтобы уменьшить количество шагов для нахождения оптимальных настроек решателя симуляции в реальном времени, параметрируйте строение решателя с переменными рабочей области. В Дискретной Модели Гидравлического Привода, размер шага для локального строения решателя задан как ts переменной рабочей области. В данном примере вы также используете переменные рабочей области, чтобы параметризовать глобальный размер шага (tsG) и локальное количество нелинейных итераций (N).
Для измененной модели в диалоговом окне параметров конфигурации модели задайте следующие настройки:
Панель | Параметр | Значение | Цель |
---|---|---|---|
Solver | Type | Fixed-step | Сконфигурируйте глобальный решатель измененной модели для симуляции с фиксированным шагом. |
Solver | discrete (no continuous states) | Сконфигурируйте глобальный решатель так, чтобы он совпадал с состоянием контроллера. | |
Additional options > Fixed-step size (fundamental sample time) | tsG | Параметризируйте глобальный размер шага. | |
Simscape | Limit data points | Снимите флажок. | Когда вы уменьшаете размер шага решателя, количество точек данных, которые генерирует симуляция, увеличивается. Очистите опцию, чтобы убедиться, что вы собираете все данные, которые вам нужны для оценки точности симуляции. |
Сконфигурируйте локальный решатель для симуляции с фиксированным шагом. В Подсистеме Гидравлического Привода, в диалоговом окне Solver Configuration блока, выберите Use local solver.
Чтобы параметризовать стоимость симуляции, установите Nonlinear iterations равным N
.
Можно определить, подходят ли настройки решателя для симуляции в реальном времени, симулируя модель и затем оценивая точность результатов и скорость симуляции. Чтобы оценить точность, сравните результаты с ссылочными результатами и с результатами других симуляций с фиксированными и фиксированными затратами. Чтобы оценить скорость симуляции, сравните прошедшее время с заданным временем симуляции и с бюджетом выполнения симуляции. Если скорость или точность не приемлемы, настройте размер шага и количество итераций, чтобы ваша модель была способна в реальном времени.
Бюджет времени выполнения симуляции для этого примера составляет четыре секунды. Для получения информации об определении бюджета на время выполнения для вашей модели, смотрите Оценка вычислительных затрат.
Для первой симуляции задайте как глобальный, так и локальный размер шага как максимально возможное значение Tsmax от графика шага. Задайте относительно большое значение размера шага для обоих решателей и три для количества нелинейных итераций для локального решателя.
ts = 1e-2; tsG = 1e-2; N = 3;
Выполните размеченную по времени симуляцию фиксированных и фиксированных затрат.
tic; sim('ssc_hydraulic_actuator_HIL'); tSim1 = toc;
time1 = max(tSim1);
Извлеките данные для давления и времени симуляции из записанного узла Simscape.
simlog1 = simlog_ssc_hydraulic_actuator_HIL;
pNodeSim1 = simlog1.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
pSim1 = pNodeSim1.series.values('Pa');
tSim1 = pNodeSim1.series.time;
Постройте график результатов симуляции на рисунке, который содержит результаты ссылки. Запишите истекшее время в легенду рисунка.
figure(h2) hold on plot(tSim1, pSim1, 'g--') delete(h2Legend1) configSim1L = ['Local: Ts= ',num2str(ts),'s, N= ',num2str(N),'.']; configSim1G = [' Global: Ts= ',num2str(tsG),'s.']; timeSim1T = ['Time=',num2str(time1)]; cfgSim1 = [configSim1L,configSim1G,timeSim1T]; h2Legend2 = legend({'Reference',num2str(cfgSim1)},... 'Location','southoutside');
Прошедшее время изменяется, потому что это зависит от немедленной вычислительной емкости компьютера, который запускает симуляцию. Прошло время в легенде от симуляции на 3.6-GHz Intel® Центральный процессор с 16-GB памятью. Ваша легенда содержит истекшее время симуляции на вашем компьютере.
Симуляция заняла меньше времени, чем указанное время симуляции (10 с), поэтому она запускается на компьютере разработчика быстрее, чем в реальном времени. Истекшее время также меньше, чем бюджет времени выполнения симуляции для этого примера (четыре секунды). Поэтому заданное строение решателя обеспечивает приемлемый запас прочности для симуляции в реальном времени на целевой машине, которая предоставила бюджетные данные.
Изменение масштаба точки перегиба для оценки точности результатов.
figure(h2) xStart = 0; xEnd = 10; yStart = 0; yEnd = 3.5e6; xZoomStart = 0.3; xZoomEnd = 0.6; yZoomStart = 2.6e6; yZoomEnd = 3.5e6; axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])
Теоретические и эмпирические данные подтверждают эталонные результаты. Точность результатов симуляции неприемлема, потому что решатель колеблется, прежде чем он сходится к решению в ссылочных данных.
Если вы можете достичь приемлемой точности результата, но симуляция запускается слишком медленно для заданного бюджета на время выполнения, увеличьте скорость путем увеличения размера шага или уменьшите количество итераций.
Когда вы находите комбинацию настроек решателя, которые обеспечивают достаточно точные результаты и скорость симуляции, которая соответствует вашему бюджету на время выполнения, можно попытаться запустить модель на машине реального времени, выполнив рабочий процесс симуляции оборудования в цикле. Если вы не можете найти правильную комбинацию настроек решателя, выполните рабочий процесс подготовки модели реального времени или увеличьте свои вычислительные возможности в реальном времени, чтобы улучшить скорость и точность симуляции. Чтобы увеличить вычислительные возможности в реальном времени, обновите целевой компьютер или разделите модель на разделы для параллельной обработки.
Обычно можно улучшить точность, увеличив количество итераций или уменьшив размер шага.
Попытайтесь улучшить точность, увеличив количество итераций (N) до 10.
N = 10;
Запустите размеченную по времени симуляцию.
tic; sim('ssc_hydraulic_actuator_HIL'); tSim2 = toc;
time2 = max(tSim2);
Извлеките данные о давлении и времени симуляции.
simlog2 = simlog_ssc_hydraulic_actuator_HIL;
pNodeSim2 = simlog2.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
pSim2 = pNodeSim2.series.values('Pa');
tSim2 = pNodeSim2.series.time;
Постройте график результатов.
figure(h2) hold on plot(tSim2, pSim2, 'r:') delete(h2Legend2) axis([xStart xEnd yStart yEnd]) configSim2L = ['Local: Ts= ',num2str(ts),'s, N= ',num2str(N),'.']; configSim2G = [' Global: Ts= ',num2str(tsG),'s.']; timeSim2T = ['Time=',num2str(time2)]; cfgSim2 = [configSim2L,configSim2G,timeSim2T]; h2Legend3 = legend({'Reference',num2str(cfgSim1),num2str(cfgSim2)},... 'Location','southoutside');
Симуляция достаточно быстрая для симуляции в реальном времени, потому что для запуска потребовалось меньше времени, чем четырехсекундный бюджет выполнения симуляции.
Масштабирование для оценки точности.
figure(h2) axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])
В целом результаты не намного точнее, чем результаты симуляции с меньшим количеством итераций.
Попытайтесь улучшить точность, уменьшив размер шага до 1e-3 секунд для локальных и глобальных решателей. Задайте 3
для количества итераций (N).
ts = 1e-3; tsG = 1e-3; N = 3;
Запустите размеченную по времени симуляцию.
tic; sim('ssc_hydraulic_actuator_HIL'); tSim3 = toc;
time3 = max(tSim3);
Извлеките данные о давлении и времени симуляции.
simlog3 = simlog_ssc_hydraulic_actuator_HIL;
pNodeSim3 = simlog3.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
pSim3 = pNodeSim3.series.values('Pa');
tSim3 = pNodeSim3.series.time;
Постройте график результатов.
figure(h2) hold on plot(tSim3, pSim3, 'k--') delete(h2Legend3) axis([xStart xEnd yStart yEnd]) configSim3L = ['Local: Ts= ',num2str(ts),'s, N= ',num2str(N),'.']; configSim3G = [' Global: Ts= ',num2str(tsG),'s.']; timeSim3T = ['Time=',num2str(time3)]; cfgSim3 = [configSim3L,configSim3G,timeSim3T]; h2Legend4 = legend... ({'Reference',num2str(cfgSim1),num2str(cfgSim2),num2str(cfgSim3)},... 'Location','southoutside');
Симуляция занимает больше времени, но является достаточно быстрой, учитывая четырехсекундный бюджет времени выполнения симуляции.
Масштабирование, чтобы оценить точность лучше.
figure(h2) axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])
Точность результатов приемлема. Для симуляции в реальном времени с измененной моделью используйте настройки решателя, которые обеспечивали приемлемую скорость и точность:
Три нелинейные итерации
Глобальный и локальный размер шага 1e-3 секунды
Если вы можете достичь достаточно точных результатов, но симуляция запускается слишком медленно для вашего бюджета на время выполнения, улучшите скорость, увеличив размер шага или уменьшив количество итераций.
Когда вы находите комбинацию настроек решателя, которая обеспечивает достаточно точные результаты и скорость симуляции, которая меньше вашего бюджета на время выполнения, можно запустить модель на машине реального времени. Чтобы запустить модель на машине реального времени, выполните рабочий процесс симуляции оборудования в цикле.
Если вы не можете найти правильную комбинацию настроек решателя для симуляции в реальном времени, улучшите скорость и точность симуляции, изменив возможности или точность вашей модели. Для получения дополнительной информации смотрите Рабочий процесс подготовки модели реального времени.
Если вы не можете сделать свою модель в реальном времени способной путем изменения объема или точности вашей модели, увеличьте свои вычислительные возможности в реальном времени. Для получения дополнительной информации смотрите Обновление целевого компьютера и Симуляция частей системы в параллельном режиме.