文档

使用Parsim的并行模拟:正常模式下的参数扫描

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

探索范例模型

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

在这个蒙特卡洛研究中,你检查了前悬架系数对车辆动力学的影响。您可以运行多个模拟,每个模拟都有不同的系数值。

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

在模型中,双击道路-悬挂交互块。打开掩码对话框。mask参数susp前面。阻尼设置阻尼系数的值,150

对于Body Dynamics块,找到退出的信号垂直disp输出港港口。该信号表示垂直车辆随时间的位移,悬架阻尼系数的影响。

右键单击信号并选择属性

在“信号属性”对话框中日志记录和可访问性选项卡已测井信号数据选中,表示该信号已配置为日志记录。模拟完成后,您可以使用指定的日志名称,vertical_disp,以识别信号并从SimulationOutput对象获取仿真输出数据。

准备参数输入

计算系数的扫描值作为设计值的百分比,范围从5%到95%,以10%为增量。将值存储在一个变量中,Cf_sweep,在基本工作区中。

Cf_sweep = Cf*(0.05:0.1:0.95);

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

numSims =长度(Cf_sweep);

使用一个循环:

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

  2. 为每个模拟指定扫描值。根据目标掩码参数的基础名称识别它,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的数组金宝app仿真软件。SimulationOutput对象,该对象存储在变量中.设置'ShowProgress'选项为'on',在MATLAB命令窗口中打印模拟的进度。

Out = parsim(in,“ShowProgress”“上”);
[2013-12-18 12:01:49]检查并行池的可用性…使用“本地”配置文件启动并行池(parpool)…[13- 12 -2018 12:04:34]在并行工作者上启动Simulink…金宝app在并行工作器上配置模拟缓存文件夹…[12:04:36]并行工作负载模型…[12:05:00]运行模拟…[13- 12 -2018 12:06:38]完成10个模拟跑中的3个[13- 12 -2018 12:06:39]完成10个模拟跑中的4个[13- 12 -2018 12:06:40]完成10个模拟跑中的6个[13- 12 -2018 12:07:18]完成10个模拟跑中的7个[13- 12 -2018 12:07:19]完成10个模拟跑中的8个[13- 12 -2018 12:07:19]完成9个完成10个模拟运行中的10个[13- 12 -2018 12:07:30]清理并行工人…

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

阴谋的结果

绘制垂直车辆位移从不同的模拟,看看如何变化的阻尼系数影响车辆动力学。信号以Dataset格式记录在SimulationOutput对象中。使用得到的每个元素中包含时间和信号数据的时间序列对象

legend_labels = cell(1,numSims);i = numSims:-1:1 simOut = out(i);ts = simOut.logsout.get(“vertical_disp”) . values;'ts'是一个MATLAB '时间序列'对象,它存储时间和%的数据值为记录的'vertical_disp'信号。使用对象的“plot”方法将数据绘制到%的时间。情节(ts);Legend_labels {i} = [“运行”num2str (i)];持有所有结束标题(“三自由度悬架模型的响应”)包含(“时间(s)”);ylabel (“车辆垂直位移(m)”);传奇(legend_labels“位置”“NorthEastOutside”);

关闭MATLAB工作程序

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

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