并行模拟使用Parsim:参数扫描快速加速模式
这个例子展示了如何运行多个并行的蒙特卡罗模拟研究通过使用并行计算工具箱™。的多核并行执行利用主机运行许多模拟更快。这些模拟也可以并行运行,使用MATLAB计算机集群并行服务器™。这个例子将即使并行计算工具箱™或MATLAB并行服务器™不可用,但在串行模拟运行。
探索模型示例
该模型sldemo_suspn_3dof
模拟车辆动力学基于道路之间的交互和概要文件悬挂不同的道路。捕捉三自由度车辆动力学模型:垂直位移,滚,音高。信号编辑存储测量公路剖面数据块左右轮胎的不同的测试组。Road-Suspension交互子系统计算悬浮力的四个轮胎的车辆位置基于道路数据和当前车辆的状态。人体动力学子系统使用这些力量和滚转力矩产生的音高和计算车辆在每个三个自由度的运动。
在这个研究蒙特卡罗,车辆质量是各种研究车辆动力学性能的影响进行了研究。并行计算工具箱用于加快这些多个模拟,如下图所示。
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);
使用一个为
循环:
创建
金宝appSimulink.SimulationInput
对象模型。创建一个对象/模拟。将对象作为一个数组存储在一个变量,在
。指定SimulationInput对象模型参数。
为我= numSims: 1:1 (i) = Sim金宝appulink.SimulationInput (mdl);在(我)=(我).setModelParameter (“SimulationMode”,“快速”,…“RapidAcceleratorUpToDateCheck”,“关闭”);(我)。PreSimFcn = @ (x) sldemo_parsim_paramsweep_suspn_raccel_presim (x, Mb_sweep(我));结束
SimulationInput对象用于修改模型参数。“SimulationMode”设置为使用快速加速和“RapidAcceleratorUpToDateCheck”模型参数设置为“关闭”跳过以来最新的检查没有结构性变化之间的模型模拟和可以使用相同的构建文件。注意,指定SimulationInput对象模型参数不立即应用到模型。指定的值将被应用在模拟和恢复回原来的值,如果可能的话,在仿真完成之后。检查PreSimFcn中的代码,sldemo_parsim_paramsweep_suspn_raccel_presim。它使用modifyTunableParameters
从仿真软件。金宝app立体图包来改变参数对应车辆质量。的第一个参数PreSimFcn
总是SimulationInput对象,传递到函数的仿真软件®。金宝appPreSimFunction添加SimulationInput对象并返回它的另一个模型参数用于模拟。
使用Parsim并行运行模拟
使用parsim
函数执行并行模拟。SimulationInput对象的数组,在
,传递到最后一个步骤中创建的parsim
函数的第一个参数。的输出parsim
命令是一个数组金宝appSimulink.SimulationOutput
对象存储在变量中出
。将“ShowProgress”选项设置为“在”打印一个进度模拟的MATLAB命令窗口。如前所述,SetupFcn是作为一个参数传递给parsim命令构建快速加速器目标如果需要的工人。
= parsim (,“ShowProgress”,“上”,…“SetupFcn”@ ()sldemo_parsim_paramsweep_suspn_raccel_setup (mdl));
(截止2021年6月29日11:44:35]检查可用性平行池……开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。[29 - jun - 2021 11:45:42]开始仿真软件并行工人……金宝app工人们…做分析和传输文件。(截止2021年6月29日11:46:45]配置模拟缓存文件夹在平行的工人……(截止2021年6月29日11:46:47]在并行运行SetupFcn工人……(截止2021年6月29日11:48:04)加载模型并行的工作……(截止2021年6月29日11:48:12]运行模拟……(截止2021年6月29日11:48:26]完成1 10模拟运行[29 - jun - 2021 11:48:26]完成2 10模拟运行(截止2021年6月29日11:48:26]完成10 3模拟运行(截止2021年6月29日11:48:26)完成4 10模拟运行(截止2021年6月29日11:48:26]完成10 5模拟运行(截止2021年6月29日11:48:26)完成6 10模拟运行(截止2021年6月29日11:48:32]完成7 10个模拟运行(截止2021年6月29日11:48:32]完成8 10模拟运行(截止2021年6月29日11:48:32]完成9 10模拟运行(截止2021年6月29日11:48:32]完成10的模拟运行(截止2021年6月29日11:48:32]清理平行工人……
每个SimulationOutput连同SimulationMetadata对象包含记录的信号。当运行多个模拟使用parsim
,捕获错误,以便后续模拟可以继续运行。任何错误都会出现在ErrorMessage
SimulationOutput对象的属性。
阴谋的结果
情节从不同的模拟车辆垂直位移,看看不同的车辆质量影响车辆动力学。使用得到
SimulationOutput对象的方法获得的时间和信号数据中包含的每个元素simout。
legend_labels =细胞(1、numSims);为i = 1: numSims simOut = (i);ts = simOut.logsout.get (“vertical_disp”). values;ts.plot;legend_labels{我}= [“运行”num2str (i)];持有所有结束标题(一个三自由度悬架模型的响应)包含(“时间(s)”);ylabel (“车辆垂直位移(m)”);传奇(legend_labels“位置”,“NorthEastOutside”);
关闭MATLAB工人
最后,关闭并行池和模型如果他们尚未打开。
如果(~ isModelOpen) close_system (mdl 0);结束删除(gcp (“nocreate”));
平行池使用当地的概要文件被关闭。
另请参阅
parsim
|金宝appSimulink.SimulationInput
|金宝appSimulink.Simulation.Variable