主要内容

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

此示例显示如何通过使用并行计算工具箱™并行运行Monte Carlo研究的多个模拟。并行执行利用主机的多个核心更快地运行许多模拟。这些模拟也可以使用MATLAB并行服务器™在计算机集群上并行运行。即使不可用并行计算工具箱™或MATLABPRILDALLER SERVER™,此示例也将工作,但模拟将在串行中运行。

探索示例模型

该模型sldemo_suspn_3dof基于路面与悬架的相互作用,对不同路面情况下的车辆动力学进行了仿真。该模型可以在三个自由度(垂直位移、横摇和俯仰)中捕捉车辆的动态。信号编辑器块存储测量的道路轮廓数据的左和右轮胎作为不同的测试组。道路-悬架相互作用子系统根据道路数据和车辆当前状态计算车辆在四个轮胎位置上的悬架力。身体动力学子系统使用这些力和由此产生的俯仰和横摇力矩来计算车辆在三个自由度中的每个自由度的运动。

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

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 = m * (0.5:5:45.5);

确定要运行的模拟数量,其等于扫描值的数量。将数字存储在变量中,numsims.

numsims =长度(mb_sweep);

用一个循环到:

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

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

i = numSims:-1:1 in(i) = 金宝appSimulink.SimulationInput(mdl);在(我)=(我).setModelParameter (“SimulationMode”“快速”...“RapidAcceleratorUpToDateCheck”'离开');在(i).presimfcn = @(x)sldemo_parsim_paramsweev_suspn_raccel_preesim(x,mb_sweep(i));结束

SimulationInput对象用于修改模型参数。“SimulationMode”被设置为使用快速加速器,“RapidAcceleratorUpToDateCheck”模型参数被设置为“off”,以跳过最新的检查,因为在模拟和相同的构建文件之间没有对模型做出结构更改,可以使用。注意,在SimulationInput对象上指定模型参数并不会立即将其应用到模型中。在仿真过程中应用指定的值,如果可能,在仿真完成后恢复到初始值。检查PreSimFcn中的代码,SLDEMO_PARSIM_PARAMSWEEP_SUSPN_RACCEL_PRESIM..它用ModifyTunableParameters.从Simulink金宝app.BlockDiagram包更改与车辆质量对应的参数。第一个论点Presimfcn.始终是SimulationInput对象,并通过Simulink®传递到函数中。金宝appPreSimFunction将另一个模型参数添加到SimulationInput对象中,并返回用于仿真的参数。

使用Parsim并行运行模拟

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

= parsim (,“ShowProgress”“上”...'setupfcn'@ () sldemo_parsim_paramsweep_suspn_raccel_setup (mdl));
[29-jun-2021 11:44:35]检查并行池的可用性......使用“本地”配置文件启动并行池(Parpool)...连接到并行池(工人数量:6)。[29-jun-2021 11:45:42]在并行工人上启动Si金宝appmulink ...分析和将文件转移到工人......完成。[29-jun-2021 11:46:45]配置并行工人的模拟缓存文件夹... [29-jun-2021 11:46:47]并行工作人员运行setupfcn ... [29-jun-2021 11:48:04]加载平行工人的模型... [29-jun-2021 11:48:12]运行模拟... [29-jun-2021 11:48:26]完成了10个仿真运行中的1个[29-1月2021 11:48:26]完成了10个模拟运行中的2个[29-jun-2021 11:48:26]完成了10个仿真运行中的3个[29-jun-2021 11:48:26]完成10个模拟跑步[29-jun-2021 11:48:26]完成了10个仿真运行中的5个[29-jun-2021 11:48:26]完成了6个仿真运行中的6个[29-jun-2021 11:48:32]完成10个仿真运行中的7个[29-jun-2021 11:48:32]完成了10个仿真运行中的8个[29-jun-2021 11:48:32]的10个模拟运行中的9个[29-jun-2021 11:48:32]完成了10个仿真运行中的10个[29-jun-2021 11:48:32]清理平行工人......

每个SimulationOutput对象包含记录的信号和SimulationMetadata。当运行多个模拟使用parsim,捕获错误,以便后续模拟可以继续运行。任何错误都会在错误信息属性的模拟输出对象。

阴谋的结果

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

legend_labels =细胞(1、numSims);i = 1:numSims simOut = out(i);ts = simOut.logsout.get (“vertical_disp”) . values;ts.plot;legend_labels{我}= [“运行”num2str(i)];抓住全部结束标题(3自由度悬架模型的响应)Xlabel('时间(s)');ylabel (“车辆垂直位移(m)”);传奇(Legend_Labels,'地点''东北斗');

关闭MATLAB工人

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

如果(〜是iSmodElopen)Close_System(MDL,0);结束删除(GCP('noicreate'));
使用“本地”配置文件的并行池正在关闭。

另请参阅

||

相关的话题