目录
使用模块参数值进行调优和实验
构建模型时,可以使用模块参数(例如,Transfer Fcn 模块的系数)进行试验,以帮助确定使用哪些模块。可以使用不同的参数值对模型进行仿真,并捕获和观察仿真输出。在仿真过程中,可以更改大多数数值模块参数的值。要观察更改参数值之后的影响,可以对仿真输出进行实时可视化。这种方法可让在开发算法时快速测试参数值。您可以直观地:
-
调整和优化控制参数。
-
标定模型参数。
-
测试控制项在不同条件下的稳定性。
当开始仿真时,Simulink® 首先会更新模型图。对于大型模型,此操作可能需要很长时间。要测试参数值而不重复更新模型图,可以在一个仿真运行过程中调整参数值。或者,要避免更新模型图,可以使用 Fast Restart。有关 Fast Restart 的详细信息,参考开始使用快速重启。
如果不能实时直观地分析仿真输出或者必须运行多个仿真,可以考虑通过编程方法扫描参数值。可以捕获仿真输出数据,以后再进行分析。有关详细信息,参考优化、估计和扫描模块参数值。有关访问和设置模块参数值的基本信息,参考设置模块参数值。
在仿真运行之间以迭代方式调整模块参数值
此示例说明如何在仿真运行之间,通过更改模块参数值建立模型原型。可以使用参数值进行实验并观察仿真结果,以帮助确定要使用哪些模块以及如何构建模型。示例模型 sldemo_fuelsys
代表一台汽油发动机的供油系统。该模型中的子系统 feedforward_fuel_rate
使用常量数字14.6
来计算发动机的燃油需求,此数字代表发动机消耗的理想的(化学当量)空燃比。该子系统中有两个模块使用此数字来设置参数的值。假设要将理想的空燃比的设计值从 14.6
更改为 17.5
,以观察对燃油需求量的影响。要将该设计值存储在模型中,可以修改模块对话框中的值。也可以将该值存储在一个变量中并为变量指定有意义的名称,以便于在两个模块中重用该值。
要观察更改模块对话框中的值对仿真输出产生的影响,请执行以下操作:
-
打开示例模型。
sldemo_fuelsys
-
将模型仿真时间从
2000
更改为50
,以便更快地进行仿真。 -
在模型中,打开Scope模块对话框。
-
对模型进行仿真。在 Scope 对话框中调整窗口的大小,以查看所有仿真结果。
波形视图显示,在整个仿真过程中,
fuel
信号大致在0.9
和1.6
之间震荡。air_fuel_ratio
信号快速上升到15
而没有出现过冲。 -
在模型中,打开 Model Data Editor。在 Modeling 选项卡上,点击 Model Data Editor。在 Model Data Editor 中,检查 Parameters 选项卡。
-
在模型中或在命令提示符下,导航到目标子系统。
open_system(... 'sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate')
-
在 Model Data Editor 中,使用 Value 列将具有
rich
标记的 Constant 模块的 Constant value (Value
) 参数从1/(14.6*0.8)
更改为1/(17.5*0.8)
。 -
类似地,将标有
normal
的模块的 Constant value 参数从1/14.6
更改为1/17.5
。 -
对模型进行仿真。
波形视图显示,现在信号以不同的方式响应。
要将模块对话框中的字面值替换为数值变量,请执行以下操作:
-
使用 Model Data Editor 将
normal
Constant 模块的值设置为1/mixture
。 -
将
rich
模块的值设置为1/(mixture*0.8)
。 -
在编辑
rich
值时,在1/(mixture*0.8)
的旁边,点击操作按钮 并选择 Create。 -
在 Create New Data 对话框中,将 Value 设置为
17.5
,然后点击 Create。数值变量
mixture
将出现在基础工作区中,其值为17.5
。在仿真运行之间,您可以在基础工作区中更改mixture
的值,而不是在模块对话框中更改参数值。
在仿真过程中调整模块参数值
此示例说明如何观察在仿真过程中更改模块参数值所产生的影响。这种方法可避免在仿真运行之间更新模型图,并以交互方式测试和调试您的模型。
示例模型 sldemo_fuelsys
包含一个 Constant 模块 Throttle Command
,它代表节气门命令。要观察在仿真过程中增加该命令的幅值所产生的影响,请执行以下操作:
-
打开示例模型。
sldemo_fuelsys
-
在模型中,打开 Scope 模块对话框。
-
开始仿真。
模型配置为仿真 2000 秒。在仿真过程中,
fuel
和air_fuel_ratio
信号的值实时显示在波形图中。 -
在模型中,当状态条大致指向
1000
(1000 秒)时,点击 Pause 按钮 暂停仿真。 -
在波形视图中,fuel 图绘制暂停之前的仿真输出。
-
在模型中,在 Modeling 选项卡上,点击 Model Data Editor。
-
在 Model Data Editor 中,选择 Parameters 选项卡。
-
在模型中,选择
Throttle Command
模块。 -
在 Model Data Editor 中,选择
rep_seq_y
行。还要确保不选择rep_seq_t
行。 -
对于
rep_seq_y
行,将Value列中的值从[10 20 10]
更改为[10 30 10]
。 -
点击Step Forward按钮 逐步执行仿真。点击此按钮大约 15 下,或者直到在波形视图中看到fuel图发生变化为止。
fuel
信号图显示,随着节气门命令幅值的增加,燃油需求量急剧增加。 -
在模型中,点击 Continue 按钮 继续仿真。
波形视图显示,在剩下的仿真过程中,燃油需求量明显周期性增加,而空燃比周期性降低。
在仿真过程中,更改工作区变量的值后,必须更新模型图。有关更新模型图的详细信息,参考更新图和运行仿真。
为进行参数调优和试验做准备
-
使用工作区变量来设置模块参数值。
要访问模块参数的值,例如 Constant 模块的 Constant value 参数的值,必须在模型中导航到该模块并打开模块对话框,或使用 Model Explorer 搜索该模块,或者在命令提示符下使用函数
set_param
。或者,如果通过创建工作区变量来设置模块参数值,则可以使用命令提示符、MATLAB® 工作区浏览器或 Model Explorer 来更改该变量的值。也可以创建一个变量,为多个模块参数设置相同的值。当更改变量值时,所有目标模块参数都将使用新值。有关访问和设置模块参数值的详细信息,参考设置模块参数值。
-
可视化仿真输出。
要在调整模块参数值时实时观察仿真输出,可以使用模型中的模块,例如 Scope 模块。还可以在仿真运行结束时捕获仿真输出,然后在 Simulation Data Inspector 中查看仿真数据。参考决定如何可视化仿真数据。
-
为要在仿真过程中调整的模块参数指定值范围。
如果希望其他人使用您的模型并调整参数,可以通过指定一个范围来控制允许调整的值。此外,最好的做法是为要调整的所有定点模块参数都指定值范围。要指定模块参数的值范围,参考指定模块参数的最小值和最大值。
-
控制仿真持续时间和速度。
仿真运行可能执行得很快,让无法调整模块参数值。而且,如果要在特定的仿真时间更改参数值,则必须学会如何控制仿真进度。可以将仿真配置为在特定期间运行或一直运行,还可以在需要的时候暂停和继续仿真。参考以交互方式对象模型进行仿真和以编程方式运行仿真。
使用 Dashboard 模块进行交互式调整
可以通过将 Dashboard 库中的模块添加到您的模型中来调整模块参数值。采用 Dashboard 模块,可以通过与模仿工业控制器外观的旋钮、开关和读表器进行交互,以调整其他模块的参数值并实时观察仿真输出。可以与 Dashboard 模块进行交互,而无需找到模型中的目标模块参数。有关详细信息,参考使用Dashboard模块对模型进行调优和可视化。
仿真过程中有哪些模块参数可调?
不可调模块参数是指不能在仿真过程中更改值的参数。例如,不能调整 Sample time 模块参数。如果一个参数不可调,则不能在仿真过程中通过在模块对话框中更改值或通过更改工作区变量的值来更改该参数的值。
不可调模块参数包括:
-
采样时间。
-
控制模块外观或结构的参数,例如Sum模块的输入数目。
-
优先级,允许控制模块的执行顺序。
-
控制模块算法的参数,例如 Discrete-Time Integrator 模块的 Integrator method 参数。
要确定模块参数在仿真过程中是否可调,请使用以下方式之一:
-
开始仿真并打开模块对话框。如果目标模块参数的值在仿真过程中为灰色,则不能调整该参数。
-
在命令提示符下,确定是否使用了
read-write
和read-only-if-compiled
标志描述该参数。-
在模型中选择模块。
-
在命令提示符下,使用函数
get_param
以返回有关模块对话框参数的信息。此函数返回一个结构体,其中为模块对话框中的每个参数包含一个字段。paramInfo = get_param(gcb,'DialogParameters');
也可以将
gcb
替换为模块路径(例如'myModel/mySubsystem/myBlock'
),而不是在模型中找到并选择模块。 -
查看有关目标模块参数的信息。例如,要查看有关某个模块的 Sample time 参数的信息,请查看字段
SampleTime
的值,它也是一个结构体。paramInfo.SampleTime ans = Prompt: 'Sample time:' Type: 'string' Enum: {} Attributes: {'read-write' 'read-only-if-compiled' 'dont-eval'}
-
检查该结构体的
Attributes
字段,其值为字符向量元胞数组。如果元胞数组中出现标志read-write
,则可以修改该参数值。但是,如果元胞数组中还出现标志read-only-if-compiled
,则不能在仿真过程中修改该参数值。
-
如果使用封装来为模块和子系统创建自定义接口,则可以控制各个封装参数的可调性。如果使用模型参数对引用模型进行参数化,则可以调整每个 Model 模块中的每个模型参数的值。
为何仿真输出保持不变?
如果更改参数值后仿真输出不变,请通过以下方式进行故障排除:
-
找到工作区变量的定义。
如果使用工作区变量设置模块参数值,请确定变量定义的位置。例如,如果在模型工作区中定义了一个变量
myVar
,然后使用它在模型中设置模块参数值,则不能通过更改基础工作区中名为myVar
的变量的值来更改模块参数值。必须访问模型工作区中的变量定义。要定位某变量的定义,请在编辑使用该变量的模块参数的值时,点击附近的操作按钮 ,然后选择 Explore。此时会打开一个对话框,如 Model Explorer,其中显示变量在相应工作区中的定义。有关模型如何使用变量的详细信息,参考符号解析。
-
为您要在仿真过程中调整的定点参数指定值范围。
如果要调整的模块参数使用定点数据类型且会进行最佳精度定标,请为该参数指定最小值和最大值,以便 Simulink 计算并应用合适的定标。如果不指定值范围,Simulink 可能会应用不包含您要使用的调整值的定标。要指定值范围,参考阅读指定模块参数的最小值和最大值。
-
在仿真运行过程中更新模型图。如果使用工作区变量为一个或多个模块参数设置值,则在仿真过程中更改变量的值后,必须更新模型图。
-
特定建模情形下的可调整性注意事项和限制
引用模型
使用 Model 模块时,适用下列参数可调性限制:
-
如果将Model模块的仿真模式设置为加速模式,或者在加速模式下仿真父模型,则您在仿真期间不能对引用模型中的模块参数进行调优。但是,如果引用模型使用基础工作区中的变量或数据字典来设置参数值,则可以对变量的值进行调优。
-
假设使用模型工作区中的 MATLAB 变量或
Simulink.Parameter
对象来设置模型中模块参数的值。如果使用 Model 模块来引用此模型:作为一种解决方法,可以将该变量或对象移动到基础工作区或数据字典。
-
并且将 Model 模块的仿真模式设置为 Accelerated 模式或以 Accelerated 模式仿真父模型,则在仿真期间不能更改变量或对象的值。
-
当以 Accelerated 模式仿真父模型时,在仿真运行之间更改变量或对象的值会导致 Simulink 重新生成代码。
-
并且使用其他 Model 模块在父模型中多次引用该模型,则可以为每个 Model 模块选择不同仿真模式。如果至少有一个模块使用 Normal 仿真模式,而有其他模块使用不同仿真模式,则在仿真期间不能更改变量或对象的值。此外,当在启用快速重启的状态下仿真父模型时,不能在快速重启仿真运行之间更改变量或对象的值。
-
Accelerator 和 SIL/PIL 仿真
下列可调性限制适用于 Accelerator、Rapid Accelerator、SIL 和 PIL 仿真:
-
假设使用模型工作区中的 MATLAB 变量或
Simulink.Parameter
对象来设置模型中模块参数的值。如果使用sim
函数在Rapid Accelerator模式下仿真模型,并将RapidAcceleratorUpToDateCheck
对组参数设置为'off'
,则不能使用RapidAcceleratorParameterSets
对组参数为变量或对象指定不同值。Simulink.BlockDiagram.buildRapidAcceleratorTarget
返回的结构体不包含有关变量或对象的信息。 -
如果模块参数值引用工作区变量,则不能在Rapid Accelerator仿真过程中更改模块参数值,例如,通过使用函数
set_param
。相反,可以调整引用变量的值。也可以使用参数集在运行Rapid Accelerator仿真之间调整运行时参数。
Stateflow 图
要在仿真过程中通过更改数据来调试 Stateflow 图,参考Debugging Stateflow Charts(Stateflow)。