这个示例展示了在需要对一系列输入和参数值运行并行模拟的应用程序中使用快速加速器。
这个例子使用了一个模型来模拟发动机的怠速。模型输入为旁路气阀电压。输出为怠速。
用parsim
以两组阀电压运行并行模拟。在两个值的范围内独立地改变三个传输函数增益参数。下表列出了八个模拟以及参数值。在步骤2中,创建外部输入,inpSets
.的变量gain2
和gain3
对应两个增益参数。
运行1 inpSets(1) gain2 = 25 gain3 = 20
运行2不同行(1)GAIN2 = 25 GAIN3 = 30
运行3 inpSets(1) gain2 = 35 gain3 = 20
运行4 inpSets(1) gain2 = 35 gain3 = 30
运行5 inpSets(2) gain2 = 25 gain3 = 20
执行6 inpSets(2) gain2 = 25 gain3 = 30
运行7 inpSets(2) gain2 = 35 gain3 = 20
执行8 inpSets(2) gain2 = 35 gain3 = 30
首先,打开模型。模拟模式设置为“快速加速器”。默认的输入数据和所需的参数被预加载到基本工作空间中。
打开模型:
mdl =“sldemo_raccel_engine_idle_speed”;open_system (mdl);
扰乱默认输入值向量以获取新的输入值向量。
不适应(1)= TimeSeries(Inpdata,时间);rndpertb = 0.5 + rand(长度(时间),1);不适应(2)= TimeSeries(Inpdata。* Rndpertb,时间);numinpsets =长度(不适应);
接下来,检查空闲速度如何改变不同的参数值gain2
和gain3
.创建一个数组金宝app仿真软件。SimulationInput
对象指定每个模拟的不同参数值和外部输入。仿真量阵列对象是预分配的,以获得更好的性能。请注意,您可以直接指定外部输入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 * num.psets;在(1:numsims)= si金宝appmulink.simulationInput(MDL);Idx = 1;为iG2 = 1: num_gain2_vals为iG3 = 1: num_gain3_vals为inpsetsidx = 1:numinpsets(idx)= in(idx).setmodelparameter(“SimulationMode”,“快速”,...“RapidAcceleratorUpToDateCheck”,'离开',...'省时间',“上”,...“SaveOutput”,“上”);%使用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)暂时将workers上的当前文件夹更改为空%文件夹,以便客户端上任何现有的SLPRJ文件夹都不存在%干涉构建过程。CurrentFolder = PWD;tempdir = tempname;Mkdir(Tempdir);CD(Tempdir);oc = oncleanup(@()cd(currentfolder));金宝appsimulink.blockdiagram.buildRapidaccelEratortarget(MDL);结束
使用parsim
函数并行执行模拟。阵列SimulationInput
对象,在
,在最后一步中创建的被传递到parsim
函数作为第一个参数。将模拟输出数据存储在一个变量中,出
,其值为数组金宝app仿真软件。SimulationOutput
对象。每一个SimulationOutput
对象包含记录信号以及SimulationMetadata
.当运行多个模拟使用parsim
,捕获错误,以便后续模拟可以继续运行。任何错误都会在错误信息
财产的财产SimulationOutput
目的。
= parsim (,“ShowProgress”,“上”,...'setupfcn'@ () sldemo_parallel_rapid_accel_sims_script_setup (mdl));
[21-May-2021 17:46:47]检查并行池的可用性...使用“本地”配置文件...启动并行池(Parpool)...连接到并行池(工人数量:6)。[21 - 5月2021年17:47:51]在并行工人上启动金宝appSimulink ...分析和将文件转移到工人......完成。[21 - 5月21日-2021 17:48:54]配置并行工人的模拟缓存文件夹...... [21-may-2021 17:48:55]并行工作人员运行setupfcn ... [21-may-2021 17:50:14]在平行工人上加载模型... [21-May-2021 17:50:22]运行模拟...... [21 5月 - 5月2021 17:50:29]完成了8个模拟运行中的1个[21-5月2021年17:50:29]完成了8个模拟运行中的2个[21-may-2021 17:50:29]完成了8个模拟运行中的3个[21-may-2021 17:50:29]的8个模拟跑步[21-51-51-2021 17:50:29]完成了8个模拟运行中的5个[21-may-2021 17:50:29]完成了6个模拟运行中的6个[21-may-2021 17:50:36]完成8个仿真运行中的7个[21-may-2021 17:50:36]完成了8个模拟运行中的8个[21-may-2021 17:50:36]清理平行工人......
绘制发动机怠速与时间的不同参数值和输入。输出以数组格式记录,可以从SimulationOutput对象访问。
为i = 1:numSims simOut = out(i);t = simOut.tout;y = simOut.yout;情节(t, y)全部结束
删除(gcp (“nocreate”))