这个例子展示了如何通过使用并行计算工具箱™运行蒙特卡洛研究的多次模拟并联。并行执行利用您的主机的多内核更快地运行多个仿真。这些模拟也可以在使用MATLAB并行服务器™计算机集群并行运行。这个例子将工作,即使在并行计算工具箱™或MATLAB并行服务器™不可用,但模拟将在连续运行。
该模型sldemo_suspn_3dof
基于路面与悬架的相互作用,对不同路面情况下的车辆动力学进行了仿真。该模型可以在三个自由度(垂直位移、横摇和俯仰)中捕捉车辆的动态。信号编辑器块存储测量的道路轮廓数据的左和右轮胎作为不同的测试组。道路-悬架相互作用子系统根据道路数据和车辆当前状态计算车辆在四个轮胎位置上的悬架力。身体动力学子系统使用这些力和由此产生的俯仰和横摇力矩来计算车辆在三个自由度中的每个自由度的运动。
在蒙特卡罗研究中,通过改变车辆质量来研究其对车辆动力学的影响。并行计算工具箱用于加速这些多重模拟,如下所示。
mdl =“sldemo_suspn_3dof”;isModelOpen = bdIsLoaded(MDL);Open_System(MDL);
快速加速器可执行的模型是建立在SetupFcn通话使用万博1manbetxSimulink.BlockDiagram.buildRapidAcceleratorTarget
功能。这buildRapidAcceleratorTarget
函数返回指定给全局变量的默认运行时参数集,RTP
,在SetupFcn中,并在下一步中用于修改参数值。开放sldemo_parsim_paramsweep_suspn_raccel_setup编辑器中检查代码。请注意,构建过程是经过优化的,因此如果构建文件已经存在并与模型和机器体系结构兼容,那么它就会提前返回。
将扫描值存储在一个变量中,Mb_sweep
中,在基本工作区。
Mb_sweep = m * (0.5:5:45.5);
确定模拟到运行的数量,其等于扫描值的数量。存储在一个变量的数量,numSims
.
numSims =长度(Mb_sweep);
用一个为
环路:
创建万博1manbetx仿真软件。SimulationInput
对象。为每个模拟创建一个对象。将对象作为数组存储在变量中,在
.
指定SimulationInput对象的模型参数。
为i = numSims:-1:1 in(i) = 万博1manbetxSimulink.SimulationInput(mdl);在(我)=(我).setModelParameter (“SimulationMode”,“快速”,...“RapidAcceleratorUpToDateCheck”,'离开');(i)中.PreSimFcn = @(X)sldemo_parsim_paramsweep_suspn_raccel_presim(X,Mb_sweep(I));结束
SimulationInput对象用于修改模型参数。“SimulationMode”被设置为使用快速加速器,“RapidAcceleratorUpToDateCheck”模型参数被设置为“off”,以跳过最新的检查,因为在模拟和相同的构建文件之间没有对模型做出结构更改,可以使用。注意,在SimulationInput对象上指定模型参数并不会立即将其应用到模型中。在仿真过程中应用指定的值,如果可能,在仿真完成后恢复到初始值。检查PreSimFcn中的代码,sldemo_parsim_paramsweep_suspn_raccel_presim.它用modifyTunableParameters
从Simulink万博1manbetx.BlockDiagram包来改变对应于车辆质量的参数。第一个参数的PreSimFcn
始终是SimulationInput对象,并通过Simulink®传递到函数中。万博1manbetxPreSimFunction将另一个模型参数添加到SimulationInput对象中,并返回用于仿真的参数。
使用parsim
函数并行地执行模拟。SimulationInput对象数组,在
,在最后一步中创建的parsim
函数作为第一个参数。的输出parsim
的数组万博1manbetx仿真软件。SimulationOutput
其被存储在变量对象出去
.设置“ShowProgress”选项“上”到打印MATLAB命令窗口中模拟的进展。正如前面提到的,在SetupFcn作为参数传递给parsim命令,如果需要建立快速加速器目标上的工人通过。
= parsim (,“ShowProgress”,“上”,...'SetupFcn'@ () sldemo_parsim_paramsweep_suspn_raccel_setup (mdl));
[29君2021 11时44分35秒]使用“本地”的个人资料...连接到并行池(:6名工人的数量)检查并行池的可用性...开始并行池(parpool)。[29君2021十一时45分42秒]并行的工人......分析开万博1manbetx始Simulink和传输文件给工人...完成。[29君2021 11点46分45秒]配置模拟高速并行的工人文件夹... [6月29日2021 11点46分47秒]上并行运行工... SetupFcn [29君2021 11:48:04]在平行工人加载模型... [29君2021十一点48分12秒]运行模拟... [29君2021 11时48分26秒]已完成模拟运行10 1的[29-君-2021 11时48分26秒]已完成2 10的模拟运行[29君-2021模拟运行11时48分26秒]已完成3 10的[29君2021 11时48分26秒]已完成4 10模拟的运行[29君2021 11时48分26秒]已完成5 10的模拟运行[29君2021 11时48分26秒]的模拟运行完成6 10 [29君2021十一时48分32秒]已完成10 7的模拟运行[29君2021 11时48分32秒]已完成8 10的模拟运行[29君2021 11时48分32秒]已完成10 9的模拟运行[29君2021 11时48:32]已完成10 10的模拟运行[29君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,'地点',“东北朝”);
最后,如果之前没有打开并行池和模型,请关闭它们。
如果(〜isModelOpen)close_system(MDL,0);结束删除(GCP('nocreate的'));
使用“本地”轮廓平行池正在关闭。
parsim
|万博1manbetx仿真软件。SimulationInput
|万博1manbetxSimulink.Simulation.Variable