文档

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

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

探索范例模型

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

在蒙特卡洛研究中,通过改变车辆质量来研究其对车辆动力学的影响。并行计算工具箱用于加速这些多重模拟,如下所示。

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

建立快速加速器目标

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

使用SimulationInput对象设置多个模拟

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

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

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

numSims =长度(Mb_sweep);

使用一个循环:

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

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

i = numSims:-1:1 in(i) = 金宝appSimulink.SimulationInput(mdl);in(i) = in(i).setModelParameter(“SimulationMode”“快速”...“RapidAcceleratorUpToDateCheck”“关闭”);(我)。PreSimFcn = @(x) sldemo_parsim_paramsweep_supn_raccel_presim (x, Mb_sweep(i));结束

SimulationInput对象用于修改模型参数。'SimulationMode'被设置为使用快速加速器,'RapidAcceleratorUpToDateCheck'模型参数被设置为'off',以跳过最新的检查,因为在模拟之间没有对模型进行结构更改,并且可以使用相同的构建文件。注意,在SimulationInput对象上指定模型参数并不会立即将其应用到模型。指定的值将在模拟过程中应用,如果可能,在模拟结束后将恢复到其原始值。检查PreSimFcn中的代码,sldemo_parsim_paramsweep_suspn_raccel_presim.它使用modifyTunableParameters从Simulink金宝app中。立体图package to change the parameter corresponding to vehicle mass. The first argument to the PreSimFcn is always the SimulationInput object, and is passed into the function by Simulink®. The PreSimFunction adds another model parameter to the SimulationInput object and returns it to be used for simulation.

使用Parsim并行运行模拟

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

Out = parsim(in,“ShowProgress”“上”...“SetupFcn”, @() sldemo_parsim_paramsweep_susn_raccel_setup (mdl));
检查并行池的可用性…使用“本地”配置文件启动并行池(parpool)…[13- 12 -2018 12:28:03]在并行工作者上启动Simulink…金宝app分析和传送文件给工人…完成。[13- 12 -2018 12:28:03]在并行工作者上配置模拟缓存文件夹…[13- 12 -2018 12:28:04]在并行工作上运行SetupFcn…[12:29:02]并行工作负载模型…[12:29:06]运行模拟…[13- 12 -2018 12:29:14]完成10个模拟运行中的2个[13- 12 -2018 12:29:14]完成10个模拟运行中的4个[13- 12 -2018 12:29:15]完成10个模拟运行中的5个[13- 12 -2018 12:29:15]完成10个模拟运行中的6个[13- 12 -2018 12:29:17]完成10个模拟运行中的7个[13- 12 -2018 12:29:17]完成10个模拟运行中的8个[13- 12 -2018 12:29:17]完成9个完成10个模拟运行中的10个[13- 12 -2018 12:29:17]清理并行工人…

每个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工作程序

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

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