主要内容

使用Parsim的快速加速器模拟

此示例显示在需要运行并行模拟的应用程序中使用快速加速器进行一系列输入和参数值。

我们使用模拟发动机空闲速度的发动机空闲速度模型。该模型的输入是旁路空气阀的电压,输出是空闲速度。

我们使用并行模拟运行Parsim用两组阀门电压和在两个值范围内独立改变传递函数的三个增益参数中的两个。下表列出了将与参数值一起运行的8个模拟。外部输入,不平等,是在下面的第2步创建的,gain2gain3是对应于两个增益参数的变量。

跑步 外差 gain2 gain3
1 不适应(1) 25. 20.
2 不适应(1) 25. 30.
3. 不适应(1) 35. 20.
4. 不适应(1) 35. 30.
5. inpSets (2) 25. 20.
6. inpSets (2) 25. 30.
7. inpSets (2) 35. 20.
8. inpSets (2) 35. 30.

通过修改用于构建此示例的脚本文件,可以很容易地为您自己的应用程序定制此示例。点击页面左上角的链接编辑脚本文件。点击右上角的链接来运行MATLAB®中的这个例子。

第1步:准备

首先,我们打开模型,其中模拟模式已设置为快速加速器。默认输入数据和所需的参数在基础工作区中预加载。

打开模型:

mdl =“sldemo_raccel_engine_idle_speed”;Open_System(MDL);

第2步:创建输入集

这里我们扰乱了默认输入值向量以获得新的输入值向量。

inpSets(1) = timeseries(inpData, time);rndPertb = 0.5 + rand(length(time), 1);inpSets (2) = timeseries (inpData。* rndPertb、时间);numInpSets =长度(inpSets);

步骤3:创建参数集

我们想看看不同参数值下怠速是如何变化的gain2gain3.创建数组金宝appsimulink.simulationInpul.对象指定每个模拟的不同参数值和外部输入。仿真量阵列对象是预分配的,以获得更好的性能。另请注意,外部输入可以直接在SimulationInPut对象上指定,而不是使用型号参数。

gain2_vals = 25:10:35;gain3_vals = 20:10:30;num_gain2_vals =长度(gain2_vals);num_gain3_vals =长度(gain3_vals);numSims = num_gain2_vals * num_gain3_vals * numInpSets;(1: numSims) = S金宝appimulink.SimulationInput (mdl);idx = 1;为了IG2 = 1:num_gain2_vals为了IG3 = 1:num_gain3_vals为了inpSetsIdx = 1:numInpSets in(idx) = in(idx).setModelParameter()'simulationmode''迅速的'......'Rapidacceleratoruptodatecheck'“关闭”......“SaveTime”'上'......'saptoutput''上');期间使用setVariable指定变量的新值%的模拟在(idx) = (idx) .setVariable ('gain2'gain2_vals (iG2));在(idx) = (idx) .setVariable ('gain3',gain3_vals(Ig3));在(IDX).externalInput = Inpsets(Inpsetsidx);idx = idx + 1;结尾结尾结尾

注意我们也使用setmodelparameter.的方法SimulationInput对象设置模型参数以在快速加速器模式下运行模拟并启用日志记录。快速加速器目标是使用该的setupfcn..快速加速度目标是一次构建一次,并通过所有后续模拟使用,从而节省了模型编译所需的时间。这是setupfcn的代码

函数sldemo_parallel_rapid_accel_sims_script_setup (mdl)暂时将worker上的当前文件夹更改为空%文件夹,以便客户端上的任何现有的SLPRJ文件夹都没有%干扰构建过程。currentFolder = pwd;tempDir = tempname;mkdir (tempDir);cd (tempDir);oc = onCleanup(@() cd (currentFolder));金宝appSimulink.BlockDiagram.buildRapidAcceleratorTarget (mdl);结尾

第4步:执行模拟

使用Parsim函数以并行执行模拟。的数组SimulationInput对象,,将最后一步中创建的Parsim用作第一个参数。将仿真输出数据存储在变量中,,其值是一系列的金宝appsimulink.simulationOutput.对象。每个仿真output.对象包含记录的信号以及SimulationMetadata.运行多个模拟时Parsim,捕获错误,以便随后的模拟可以继续运行。任何错误都会显示出来ErrorMessage财产的仿真output.对象。

出局= Parsim(在,'showprogress''上'......“SetupFcn”,@()sldemo_parallel_rapid_accel_sims_script_setup(mdl));
[16-O10-2018 15:54:39]检查并行池的可用性...使用“本地”配置文件...启动并行池(Parpool)...连接到并行池(工人数:6)。[16-O10-2018 15:55:37]在并行工人上启动Si金宝appmulink ...分析和将文件转移到工人......完成。[16-O10-2018 15:55:38]配置并行工人的模拟缓存文件夹... [16-O10-2018 15:55:55:38]并行工作人员运行setupfcn ... [16-O10-2018 15:56:28]在平行工人上加载模型... [2018年10月15:56:29]运行模拟... [16-O10-2018 15:56:34]完成了8个模拟运行[16-2018年10月15:56:34]完成了8个模拟运行中的2个[16-O10-2018 15:56:34]完成了8个模拟运行中的3个[16-O10-2018 15:56:34]完成了4个模拟运行[16-O10-2018 15:56:34]完成了8个模拟运行中的5个[16-O10-2018 15:56:34]完成了8个模拟运行中的6个[16-O10-2018 15:56:38]完成8个仿真运行中的7个[16-oct-2018 15:56:38]完成了8个模拟运行中的8个[16-O10-2018 15:56:38]清理平行工人......

步骤5:情节结果

在不同参数值和输入的时间方面绘制发动机空闲速度。输出以阵列格式记录,可以从SimulationOutput对象访问。

为了i = 1:numSims simOut = out(i);t = simOut.tout;y = simOut.yout;情节(t, y)所有结尾

步骤6:关闭MATLAB工作者

删除(GCP('noicreate'))
使用“本地”配置文件的并行池正在关闭。