目录
优化、估计和扫描模块参数值
扫描参数值并检查仿真结果
将扫描值存储在 Simulink.SimulationInput 对象中
优化、估计和扫描模块参数值
当扫描一个或多个参数时,可以在各次仿真运行之间更改参数值,并比较和分析每次运行的输出信号数据。通过参数扫描并将真实系统中的不确定性纳入考虑范围来调整控制参数,估计未知模型参数并测试控制算法的稳定性。可以扫描模块参数值或用于设置参数值的工作区变量的值。使用 Model Data Editor(在 Modeling 选项卡上,点击 Model Data Editor)上的 Parameters 选项卡、Property Inspector(在Modeling选项卡上的Design下,点击 Property Inspector)、命令提示符或脚本在各次仿真运行之间更改参数值。
如果要反复更改某模块参数的值,请考虑在工作区中创建一个变量。可以使用 Model Explorer 或编程命令来更改该变量的值,而不是在模型中定位或标识相应模块。此外,有助于参数优化、估计和扫描的一些功能和产品要求通过创建工作区变量来设置模块参数值。
扫描参数值并检查仿真结果
此示例说明如何在多次编程仿真运行之间更改模块参数值。可以使用此方法比较每次运行的输出信号数据来确定最佳参数值。示例模型sldemo_absbrake
使用 Constant 模块为防抱死制动系统指定滑动设定值。用两个不同的滑动设定值(0.24 和 0.25)仿真模型,并比较每次仿真运行的输出车轮速度。要存储设定值,请在基础工作区中创建变量。此方法允许您为该值指定有意义的名称。
打开示例模型。
open_system('sldemo_absbrake');
在Modeling选项卡上,点击 Model Data Editor。在 Model Data Editor 中,选择 Signals 选项卡。将 Change View 下拉列表设置为 Instrumentation。Log Data 列显示信号yout(它是虚拟总线)和slp配置为记录。在仿真模型时,可以收集这些信号的值并在稍后使用 Simulation Data Inspector 检查这些信号值。
在Model Data Editor中,选择 Parameters 选项卡。将 Change view 设置为 Design。在模型中,选择标记为Desired relative slip的Constant 模块。Model Data Editor突出显示与模块的Constant value参数对应的行。使用Value列将参数值设置为relSlip。编辑该值时,在relSlip旁边,点击操作按钮(含三个纵点),然后选择 Create。
在Create New Data 对话框中,将 Value 设置为0.2,然后点击 Create。值为0.2的变量会出现在基础工作区中。现在,该模型从此变量中获取相对滑动设定值。也可以在命令提示符下使用下列命令来创建变量并配置该模块:
relSlip = 0.2;
set_param('sldemo_absbrake/Desired relative slip','Value','relSlip')
在命令提示符下,创建一个数组来存储相对滑动设定值的两个实验值0.24和0.25。
relSlip_vals = [0.24 0.25];
为每个要运行的仿真(本例中为两个)创建一个Simulink.SimulationInput对象。将这些对象存储在单个数组变量simIn中。使用每个对象的setVariable方法来分别标识两个实验值。
for i = 1:length(relSlip_vals)
simIn(i) = Simulink.SimulationInput('sldemo_absbrake');
simIn(i) = setVariable(simIn(i),'relSlip',relSlip_vals(i));
end
使用sim函数来仿真模型。(可选)将输出存储在名为simOutputs的变量中。
simOutputs = sim(simIn);
[29-Jan-2020 22:38:06] Running simulations...
[29-Jan-2020 22:38:08] Completed 1 of 2 simulation runs
[29-Jan-2020 22:38:08] Completed 2 of 2 simulation runs
模型将记录的信号(yout 和 slp)流式传输到 Simulation Data Inspector。可以在 Simulation Data Inspector 中查看信号数据。比较最近两次仿真运行的输出数据。
runIDs = Simulink.sdi.getAllRunIDs();
runResult = Simulink.sdi.compareRuns(runIDs(end-1), runIDs(end));
通过指定结果索引 1 来绘制 Ww 信号(它是虚拟总线信号 yout 的元素)的各值之间的差异图。
signalResult = getResultByIndex(runResult,1);
plot(signalResult.Diff);
将扫描值存储在 Simulink.SimulationInput
对象中
当编写脚本来运行多次仿真时,请创建Simulink.SimulationInput对象的数组(为每个要运行的仿真创建一个对象)。使用每个对象的setVariable 和 setBlockParameter方法来标识用于对应仿真运行的参数值。使用这种方法,可以避免在仿真运行之间使用 set_param函数修改模块参数值以及使用赋值命令修改工作区变量值。有关使用Simulink.SimulationInput对象运行多次仿真的详细信息,参考sim。
扫描非标量、结构体和参数对象
如果使用非标量变量、结构体变量或Simulink.Parameter对象设置模块参数值,请使用每个Simulink.SimulationInput对象的setVariable方法。请参阅下表中的示例。
情况 | 示例 |
---|---|
MATLAB® 变量 myArray,其值是一个数组。您要设置数组中的第三个元素(假设从 1 开始索引)。 | |
MATLAB 变量 myStruct,它包含一个名为 field1 的字段。 | |
参数对象 myParam,其 Value 属性是一个标量。 | |
参数对象 myParam,其 Value 属性是一个标量。 | |
参数对象 myStructParam,其 Value 属性是一个结构体。该结构体包含一个名为 field1 的字段。 | |
扫描模型工作区中变量的值
如果使用模型工作区来存储变量,则当使用Simulink.SimulationInput对象的setVariable方法修改变量值时,请使用Workspace对组参数来识别包含模型:
setVariable(simIn,'myVar',15.23,'Workspace','myModel')