主要内容

多个模拟工作流程建议

这个演示的目的是提供有用的建议使用并行运行多个模拟仿真工具。这个例子将即使并行计算工具箱™不可用,但在串行模拟运行。我们将使用模型sldemo_suspn_3dof对于这个示例。

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

仿真软件的初始化一个数组。万博1manbetxSimulationInput对象

通常你会构造一组仿真软件。万博1manbetx模拟Input objects in order to run multiple simulations. There are several ways to initialize the array before populating it with data.

numSims = 5;Cf_sweep = Cf * linspace (0。,。95年,numSims);

方法1:初始化数组循环之前

(numSims) = Si万博1manbetxmulink.SimulationInput;idx = 1: numSims%需要填充模型名称,因为我们得到任何默认空数组在(idx)。ModelName =“sldemo_suspn_3dof”;在(idx) = (idx) .setVariable (Cf的Cf_sweep (idx));结束

方法2:初始化数组中循环

注意,循环变量idx从最大的价值,这样整个数组预先分配。

idx = numSims: 1:1%因为我们索引从5比1,第一次迭代%初始化数组。(idx) = Si万博1manbetxmulink.SimulationInput (“sldemo_suspn_3dof”);在(idx) = (idx) .setVariable (Cf的Cf_sweep (idx));结束

设置参数模型和块

setModelParametersetBlockParameter方法使用相同的参数值对语法的set_paramAPI使用。这意味着最值通过这些方法应该是字符数组,而不是文字值。

idx = numSims: 1:1 (idx) = Si万博1manbetxmulink.SimulationInput (“sldemo_suspn_3dof”);%不正确在(idx) = (idx) .setModelParameter (“开始时间”5);%正确在(idx) = (idx) .setModelParameter (“开始时间”,“3”);结束

设置变量

setVariable方法预计你将你想要的文字值分配给一个变量。我们的想法是,这反映了assignin语法。

idx = numSims: 1:1 (idx) = Si万博1manbetxmulink.SimulationInput (“sldemo_suspn_3dof”);%不正确,Cf预计将翻倍,而不是字符数组在(idx) = (idx) .setVariable (Cf的,“2500”);%正确,Cf是一个标量翻倍在(idx) = (idx) .setVariable (Cf的,2500);结束

诊断运行时错误

假设你不小心设置数组的仿真软件。万博1manbetxSimulationInput对象不正确的值。

Mb_sweep = linspace (0 1500 numSims);idx = numSims: 1:1 (idx) = Si万博1manbetxmulink.SimulationInput (“sldemo_suspn_3dof”);%不小心在第一次迭代质量设置为0在(idx) = (idx) .setVariable (“m”Mb_sweep (idx));%缩短停止时间在(idx) = (idx) .setModelParameter (“StopTime”,' 1 ');结束

模拟这些会导致运行时错误

= sim(中);
[05 - 2020年5月——13:22:50]运行模拟……[05 - 2020年5月——13:22:51]完成了1 5模拟运行。1运行错误。[05 - 2020年5月——13:22:52]完成2 5模拟运行[05 - 2020年5月——13:22:53]完成3 5模拟运行[05 - 2020年5月——13:22:54]完成了4 5模拟运行[05 - 2020年5月——13:22:55]完成5的5模拟运行时警告:模拟(s)与下面列出的指标完成与错误。请检查相应的SimulationOutput得到更详细的错误:[1]

幸运的是,您可以检查仿真软件。万博1manbetx模拟Output object to see any error messages that come from a simulation.

(1).ErrorMessage
ans = ' '国家' 1 '块的< a href = " matlab: open_and_hilite_hyperlink (“sldemo_suspn_3dof /身体动力学/垂直(Z)动力学/ Zdot ', '错误')”> sldemo_suspn_3dof /身体动力学/垂直(Z)动力学/ Zdot < / > 0.0时间不是有限的。仿真将停止。可能有一个奇点的解决方案。如果没有,试着减少步长(通过减少固定步长或通过紧缩误差公差)”

这是调试问题并行的工作。

idx = numSims: 1:1 (idx) = Si万博1manbetxmulink.SimulationInput (“sldemo_suspn_3dof”);%不小心在第一次迭代质量设置为0在(idx) = (idx) .setVariable (“m”Mb_sweep (idx));%缩短停止时间在(idx) = (idx) .setModelParameter (“StopTime”,' 1 ');结束= parsim(的);
[05 - 2020年5月——13:22:55]检查可用性平行池……开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。[05 - 2020年5月——13:23:24]开始仿真软件并行工人……万博1manbetx[05 - 2020年5月——13:23:47]配置模拟缓存文件夹在平行的工人……[05 - 2020年5月——13:23:48]加载模型并行的工作……[05 - 2020年5月——13:24:04]运行模拟……[05 - 2020年5月——13:24:10]完成了1 5模拟运行。1运行错误。[05 - 2020年5月——13:24:12]完成2 5模拟运行[05 - 2020年5月——13:24:12]完成3 5模拟运行[05 - 2020年5月——13:24:12]完成了4 5模拟运行[05 - 2020年5月——13:24:12]完成5的5模拟运行时警告:模拟(s)与下面列出的指标完成与错误。请检查相应的SimulationOutput得到更详细的错误:[1][05 - 2020年5月——13:24:12]清理平行工人……

检查模型。万博1manbetx模拟Output reveals a non-finite derivative error.

(1).ErrorMessage
ans = ' '国家' 1 '块的sldemo_suspn_3dof /身体动力学/垂直(Z)动力学/ Zdot 0.0时间不是有限的。仿真将停止。可能有一个奇点的解决方案。如果没有,试着减少步长(通过减少固定步长或通过紧缩误差公差)”

applyToModel方法将配置模型与SimulationInput上的设置,这样你就可以在本地调试问题。

(1).applyToModel;

注意变量的值Mb在基本工作空间更改为0,以反映仿真中使用的值对应于第一个SimulationInput对象

关闭MATLAB工人

最后,关闭并行池和模型如果他们尚未打开。

如果(~ isModelOpen) close_system (mdl 0);结束删除(gcp (“nocreate”));