主要内容

多重模拟工作流程提示

本例的目的是提供使用并行模拟工具运行多个模拟的有用提示。即使并行计算工具箱™不可用,此示例也可以工作,但模拟将以串行方式运行。我们将使用这个模型sldemo_suspn_3dof

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

初始化一个Simulink数组。SimulationInput对象

通常你会构造一个Simulink数组。SimulationInputobjects 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) = Simulink.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) =仿真软件。SimulationInput (“sldemo_suspn_3dof”);在(idx) = (idx) .setVariable (Cf的Cf_sweep (idx));结束

设置模型和块参数

setModelParameter而且setBlockParameter方法使用与方法相同的参数-值对语法set_paramAPI使用。这意味着传递给这些方法的大多数值都应该是字符数组,而不是它们的文字值。

idx = numSims:-1:1 in(idx) = Simulink。SimulationInput (“sldemo_suspn_3dof”);%不正确在(idx) = (idx) .setModelParameter (“开始时间”5);%正确在(idx) = (idx) .setModelParameter (“开始时间”“3”);结束

设置变量

setVariable方法期望您将传递要赋值给变量的文字值。这个想法很好地反映了assignin语法。

idx = numSims:-1:1 in(idx) = Simulink。SimulationInput (“sldemo_suspn_3dof”);错误,Cf应该是双精度数组,而不是字符数组在(idx) = (idx) .setVariable (Cf的“2500”);%正确,Cf是标量双精度在(idx) = (idx) .setVariable (Cf的, 2500);结束

诊断运行时错误

假设您不小心设置了一个Simulink数组。具有错误值的SimulationInput对象。

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

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

= sim(中);
[09-12-2021 11:45:05]运行模拟…[09-12-2021 11:45:26]完成5个模拟运行中的1个运行1有错误。[09-12-2021 11:45:36]完成5个模拟运行中的2个[09-12-2021 11:45:37]完成5个模拟运行中的4个[09-12-2021 11:45:46]完成5个模拟运行中的5个警告:下列索引的模拟已完成错误。请检查相应的SimulationOutput以获得关于错误的更多详细信息:[1]

幸运的是,您可以检查Simulink。模拟Output object to see any error messages that come from a simulation.

(1)。ErrorMessage
ans = ' state '1' in block ' sldemo_ssnap_3dof /Body Dynamics/Vertical (Z) Dynamics/ Zdot'在时间0.0时不是有限的。模拟将会停止。解中可能有一个奇点。如果不是,尝试减少步长(通过减少固定步长或通过收紧错误容错)'

这也适用于调试并行工作程序上的问题。

idx = numSims:-1:1 in(idx) = Simulink。SimulationInput (“sldemo_suspn_3dof”);%在第一次迭代时不小心将质量设置为0在(idx) = (idx) .setVariable (“m”Mb_sweep (idx));缩短停止时间在(idx) = (idx) .setModelParameter (“StopTime”' 1 ');结束= parsim(的);
[09-12-2021 11:45:47]检查并行池的可用性…使用“本地”配置文件启动并行池(parpool)…[09-12-2021 11:47:08]在并行工作者上启动Simulink…[09-12-2021 11:47:45]在并行工作者上配置模拟缓存文件夹…[09-12-2021 11:47:45]并行工作负载模型…[09-12-2021 11:48:06]运行模拟…[09-12-2021 11:48:18]完成5次模拟运行中的1次运行1有错误。[09-12-2021 11:48:18]完成5个模拟运行中的3个[09-12-2021 11:48:18]完成5个模拟运行中的4个[09-12-2021 11:48:18]完成5个模拟运行中的5个警告:下列索引的模拟已完成错误。[1] [09-12-2021 11:48:18] cleanup up parallel workers…

检查模型。模拟Output reveals a non-finite derivative error.

(1)。ErrorMessage
ans = ' state '1' in block ' sldemo_ssnap_3dof /Body Dynamics/Vertical (Z) Dynamics/ Zdot'在时间0.0时不是有限的。模拟将会停止。解中可能有一个奇点。如果不是,尝试减少步长(通过减少固定步长或通过收紧错误容错)'

applyToModel方法将使用SimulationInput上的设置配置您的模型,以便您可以在本地调试问题。

(1) .applyToModel;

注意变量的值Mb中的第一个SimulationInput对象对应的模拟中使用的值更改为0

关闭MATLAB工人

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

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

另请参阅

|

相关的话题

Baidu
map