并行模拟使用Parsim:参数扫描在正常模式
这个例子展示了如何使用并行计算工具箱™并行运行蒙特卡罗研究的多个模拟。并行执行利用主机的多个核心来更快地运行许多模拟。这些模拟也可以使用MATLAB并行服务器™在计算机集群上并行运行。即使没有Parallel Computing Toolbox™或MATLAB Parallel Server™,这个示例也可以工作,但是模拟将以串行方式运行。
探索示例模型
该模型sldemo_suspn_3dof
基于不同道路轮廓下道路与悬架相互作用的车辆动力学仿真。该模型以三个自由度捕捉车辆动力学:垂直位移、侧倾和俯仰。Signal Editor块将左右轮胎的测量路况数据存储为不同的测试组。道路-悬架交互子系统根据道路数据和当前车辆状态计算车辆在四个轮胎位置上的悬架力。车身动力学子系统使用这些力以及由此产生的俯仰和翻滚力矩来计算三个自由度中的每一个的车辆运动。
在蒙特卡罗研究中,您将检查前悬架系数对车辆动力学的影响。您运行多个模拟,每个模拟都有不同的系数值。
mdl =“sldemo_suspn_3dof”;isModelOpen = bdIsLoaded(mdl);open_system (mdl);
在模型中,双击道路-悬架交互模块。打开掩码对话框。掩码参数susp前面。阻尼设置阻尼系数的值,150
。
对于Body Dynamics块,找到退出垂直disp
输出港港口。该信号表示悬架阻尼系数影响的车辆垂直位移随时间的变化。
右键单击信号并选择属性。
在“信号属性”对话框中日志记录和可访问性选项卡已测井信号数据已选中,指示该信号已配置为日志记录。模拟完成后,您可以使用指定的日志记录名称,vertical_disp
,从SimulationOutput对象中识别信号并获取仿真输出数据。
准备参数输入
以设计值的百分比计算系数的扫描值,范围从5%到95%,增量为10%。将值存储在一个变量中,Cf_sweep
,在基本工作区中。
Cf_sweep = Cf*(0.05:0.1:0.95);
确定要运行的模拟数量,这等于扫描值的数量。将数字存储在一个变量中,numSims
。
numSims = length(Cf_sweep);
使用一个为
循环:
创建
金宝app仿真软件。SimulationInput
对象。每个模拟创建一个对象。将对象以数组的形式存储在变量中,在
。为每个模拟指定扫描值。通过其基础名称识别目标掩码参数,
Cf
。
为i = numSims:-1:1 in(i) = 金宝appSimulink.SimulationInput(mdl);in(i) = setBlockParameter(in(i), [mdl ./ Road-Suspension交互的],Cf的num2str (Cf_sweep(我)));结束
注意,在SimulationInput对象上指定块参数不会立即将其应用于模型。指定的值将在模拟期间应用,并在模拟结束后恢复到其原始值(如果可能)。
使用Parsim并行运行模拟
使用parsim
函数来并行执行模拟。SimulationInput对象的数组,在
在上一步中创建的parsim
函数作为第一个参数。的输出parsim
Command是一个数组金宝app仿真软件。SimulationOutput
对象,该对象存储在变量中出
。将“ShowProgress”选项设置为“on”,以在MATLAB命令窗口中打印模拟的进度。
Out = parsim(in,“ShowProgress”,“上”);
[20-Feb-2021 23:49:38]检查并行池的可用性…使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数量:6)。[20- 2 -2021 23:50:23]在并行工人上启动Simulink…金宝app[20-Feb-2021 23:51:11]在并行工作上配置模拟缓存文件夹…[20-Feb-2021 23:51:13]在并行工人上加载模型…[20-Feb-2021 23:51:18]运行模拟…[20-Feb-2021 23:51:31]完成10次模拟运行中的1次[20-Feb-2021 23:51:31]完成10次模拟运行中的3次[20-Feb-2021 23:51:31]完成10次模拟运行中的4次[20-Feb-2021 23:51:31]完成10次模拟运行中的6次[20-Feb-2021 23:51:33]完成10次模拟运行中的7次[20-Feb-2021 23:51:33]完成10次模拟运行中的8次[20-Feb-2021 23:51:33]完成10次模拟运行中的9次[20-Feb-2021 23:51:34]完成10个模拟运行中的10个
每个SimulationOutput对象都包含记录的信号以及SimulationMetadata。运行多个模拟时使用parsim
,错误被捕获,以便后续的模拟可以继续运行。任何错误都会显示在ErrorMessage
属性。
阴谋的结果
从不同的模拟中绘制出车辆的垂直位移,看看阻尼系数的变化是如何影响车辆动力学的。信号以数据集格式记录在SimulationOutput对象中。使用得到
的每个元素中包含时间和信号数据的时间序列对象出
。
legend_labels = cell(1,numSims);为i = numSims:-1:1 simOut = out(i);ts = simOut.logsout.get(“vertical_disp”) . values;% 'ts'是一个MATLAB 'timeseries'对象,用于存储时间和记录的'vertical_disp'信号的% data值。使用对象的'plot'方法将数据绘制到%的时间。情节(ts);Legend_labels {i} = [“运行”num2str (i)];持有所有结束标题(“三自由度悬架模型的响应”)包含(“时间(s)”);ylabel (车辆垂直位移(m));传奇(legend_labels“位置”,“NorthEastOutside”);
Close MATLAB Workers
最后,如果之前没有打开并行池和模型,则关闭它们。
如果(~isModelOpen) close_system(mdl, 0);结束删除(gcp (“nocreate”));
使用“本地”配置文件的并行池正在关闭。
另请参阅
parsim
|金宝app仿真软件。SimulationInput
|金宝appSimulink.Simulation.Variable