主要内容

并行模拟使用Parsim:参数扫描在快速加速器模式

此示例展示了如何使用并行计算工具箱™并行运行蒙特卡罗研究的多个模拟。并行执行利用主机的多个核心来更快地运行许多模拟。这些模拟也可以使用MATLAB并行服务器™在计算机集群上并行运行。即使并行计算工具箱™或MATLAB并行服务器™不可用,此示例也可以工作,但模拟将以串行方式运行。

探索范例模型

该模型sldemo_suspn_3dof基于路面与悬架之间的相互作用,模拟了不同路面情况下的车辆动力学。该模型在三个自由度上捕捉车辆动态:垂直位移、滚转和俯仰。信号编辑器块存储测量的左右轮胎的道路轮廓数据作为不同的测试组。道路-悬架交互子系统根据道路数据和当前车辆状态计算车辆在四个轮胎位置上的悬架力。车身动力学子系统使用这些力和产生的俯仰和侧倾力矩来计算每个三个自由度下的车辆运动。

在蒙特卡罗研究中,通过改变车辆质量来研究其对车辆动力学的影响。Parallel Computing Toolbox用于加速这些多重模拟,如下所示。

mdl =“sldemo_suspn_3dof”;isModelOpen = bdIsLoaded(mdl);open_system (mdl);

建立快速加速器目标的设置

模型的快速加速器可执行文件是在SetupFcn调用中使用金宝appSimulink.BlockDiagram.buildRapidAcceleratorTarget函数。的buildRapidAcceleratorTarget函数返回分配给全局变量的默认运行时参数集,RTP,在SetupFcn中,用于下一步修改参数值。开放sldemo_parsim_paramsweep_suspn_raccel_setup在编辑器中检查代码。请注意,构建过程是经过优化的,因此如果构建文件已经存在并且与模型和机器架构兼容,那么它就会提前返回。

使用SimulationInput对象设置多个模拟

将扫描值存储在一个变量中,Mb_sweep,在基本工作区中。

Mb_sweep = Mb*(0.5:5:45.5);

确定要运行的模拟的数量,它等于扫描值的数量。将数字存储在一个变量中,numSims

numSims = length(Mb_sweep);

使用一个循环:

  1. 创建金宝app仿真软件。SimulationInput对象。为每个模拟创建一个对象。将对象作为数组存储在变量中,

  2. 在SimulationInput对象上指定模型参数。

(i) = Simulink.Simulation金宝appInput(mdl);in(i) = in(i).setModelParameter(“SimulationMode”“快速”...“RapidAcceleratorUpToDateCheck”“关闭”);(我)。PreSimFcn = @(x) sldemo_parsim_paramsweep_susn_raccel_presim (x, Mb_sweep(i));结束

SimulationInput对象用于修改模型参数。'SimulationMode'被设置为使用快速加速器,'RapidAcceleratorUpToDateCheck'模型参数被设置为'off'以跳过最新的检查,因为在模拟和相同的构建文件之间没有对模型进行结构更改。注意,在SimulationInput对象上指定模型参数并不会立即将其应用于模型。指定的值将在模拟期间应用,并在模拟结束后(如果可能的话)恢复到其原始值。检查PreSimFcn中的代码,sldemo_parsim_paramsweep_suspn_raccel_presim.它使用modifyTunableParameters来自Simulin金宝appk。框图包改变相应的参数车辆质量。的第一个参数PreSimFcn总是SimulationInput对象,由Simulink®传递到函数中。金宝appPreSimFunction将另一个模型参数添加到SimulationInput对象中,并将其返回用于模拟。

使用Parsim并行运行模拟

使用parsim函数并行执行模拟。SimulationInput对象数组,,在最后一步中创建的parsim函数作为第一个参数。的输出。parsim的数组金宝app仿真软件。SimulationOutput对象,该对象存储在变量中.将“ShowProgress”选项设置为“on”,在MATLAB命令窗口中打印模拟的进度。如前所述,SetupFcn作为参数传递给parsim命令,以便在需要时在worker上构建快速加速器目标。

Out = parsim(in,“ShowProgress”“上”...“SetupFcn”, @() sldemo_parsim_paramsweep_susn_raccel_setup (mdl));
[29- jun2021 11:44:35]检查并行池的可用性…使用“本地”配置文件启动并行池(parpool)…连接到并行池(worker数量:6).[29-6-2021 11:45:42]在并行worker上启动Simulink…金宝app分析文件并将文件传输给工作人员…完成。[29- june2021 11:46:45]在并行工作者上配置模拟缓存文件夹…[29- june2021 11:46:47]在并行工作上运行SetupFcn…[29- jun2021 11:48:04]加载模型的并行工人…[29- june 2021 11:48:12]运行模拟…[29- june -2021 11:48:26]完成10次模拟运行中的1次[29- june -2021 11:48:26]完成10次模拟运行中的3次[29- june -2021 11:48:26]完成10次模拟运行中的5次[29- june -2021 11:48:26]完成10次模拟运行中的6次[29- june -2021 11:48:32]完成10次模拟运行中的8次[29- june -2021 11:48:32]完成10次模拟运行中的8次[29- june -2021 11:48:32]完成10次模拟运行中的9次完成10次模拟运行中的10次[29- jun2021 11:48:32]清理并行工人…

每个SimulationOutput对象都包含日志信号和SimulationMetadata。运行多个模拟时使用parsim,错误被捕获,以便后续的模拟可以继续运行。任何错误都会显示在ErrorMessage属性的SimulationOutput对象。

阴谋的结果

从不同的模拟中绘制垂直车辆位移图,以了解车辆质量的变化如何影响车辆动力学。使用得到方法,以获取simout的每个元素所包含的时间和信号数据。

legend_labels = cell(1,numSims);i = 1:numSims simOut = out(i);ts = simOut.logsout.get(“vertical_disp”) . values;ts.plot;Legend_labels {i} = [“运行”num2str (i)];持有所有结束标题(“三自由度悬架模型的响应”)包含(“时间(s)”);ylabel (车辆垂直位移(m));传奇(legend_labels“位置”“NorthEastOutside”);

关闭MATLAB Workers

最后,关闭并行池和模型(如果它们之前没有打开)。

如果close_system(mdl, 0);结束删除(gcp (“nocreate”));
使用“本地”配置文件的并行池正在关闭。

另请参阅

||

相关的话题