Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

使用模块参数值进行调优和实验

构建模型时,您可以使用模块参数(例如,Transfer Fcn 模块的系数)进行试验,以帮助您确定使用哪些模块。您可以使用不同的参数值对模型进行仿真,并捕获和观察仿真输出。

在仿真过程中,您可以更改大多数数值模块参数的值。要观察更改参数值之后的影响,您可以对仿真输出进行实时可视化。这种方法可让您在开发算法时快速测试参数值。您可以直观地:

  • 调整和优化控制参数。

  • 标定模型参数。

  • 测试控制项在不同条件下的稳定性。

当您开始仿真时,Simulink® 首先会更新模型图。对于大型模型,此操作可能需要很长时间。要测试参数值而不重复更新模型图,您可以在一个仿真运行过程中调整参数值。

或者,要避免更新模型图,可以使用 Fast Restart。有关 Fast Restart 的详细信息,请参阅开始使用快速重启

如果您不能实时直观地分析仿真输出或者必须运行多个仿真,可以考虑通过编程方法扫描参数值。您可以捕获仿真输出数据,以后再进行分析。有关详细信息,请参阅 优化、估计和扫描模块参数值

有关访问和设置模块参数值的基本信息,请参阅设置模块参数值

在仿真运行之间以迭代方式调整模块参数值

此示例说明如何在仿真运行之间,通过更改模块参数值建立模型原型。您可以使用参数值进行实验并观察仿真结果,以帮助您确定要使用哪些模块以及如何构建模型。

示例模型 sldemo_fuelsys 代表一台汽油发动机的供油系统。该模型中的子系统 feedforward_fuel_rate 使用常量数字 14.6 来计算发动机的燃油需求,此数字代表发动机消耗的理想的(化学当量)空燃比。该子系统中有两个模块使用此数字来设置参数的值。

假设您要将理想的空燃比的设计值从 14.6 更改为 17.5,以观察对燃油需求量的影响。要将该设计值存储在模型中,您可以修改模块对话框中的值。也可以将该值存储在一个变量中并为变量指定有意义的名称,以便于在两个模块中重用该值。

要观察更改模块对话框中的值对仿真输出产生的影响,请执行以下操作:

  1. 打开示例模型。

    sldemo_fuelsys

  2. 将模型仿真时间从 2000 更改为 50,以便更快地进行仿真。

  3. 在模型中,打开 Scope 模块对话框。

  4. 对模型进行仿真。在 Scope 对话框中调整窗口的大小,以查看所有仿真结果。

    波形视图显示,在整个仿真过程中,fuel 信号大致在 0.91.6 之间震荡。air_fuel_ratio 信号快速上升到 15 而没有出现过冲。

  5. 在模型中,打开模型数据编辑器。在 Modeling 选项卡上,点击 Model Data Editor。在模型数据编辑器中,检查 Parameters 选项卡。

  6. 在模型中或在命令提示符下,导航到目标子系统。

    open_system(...
        'sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate')

  7. 在模型数据编辑器中,使用 Value 列将具有 rich 标记的 Constant 模块的 Constant value (Value) 参数从 1/(14.6*0.8) 更改为 1/(17.5*0.8)

  8. 类似地,将标有 normal 的模块的 Constant value 参数从 1/14.6 更改为 1/17.5

  9. 对模型进行仿真。

    波形视图显示,现在信号以不同的方式响应。

要将模块对话框中的字面值替换为数值变量,请执行以下操作:

  1. 使用模型数据编辑器将 normalConstant 模块的值设置为 1/mixture

  2. rich 模块的值设置为 1/(mixture*0.8)

  3. 在编辑 rich 值时,在 1/(mixture*0.8) 的旁边,点击操作按钮 并选择 Create

  4. Create New Data 对话框中,将 Value 设置为 17.5,然后点击 Create

    数值变量 mixture 将出现在基础工作区中,其值为 17.5。在仿真运行之间,您可以在基础工作区中更改 mixture 的值,而不是在模块对话框中更改参数值。

在仿真过程中调整模块参数值

此示例说明如何观察在仿真过程中更改模块参数值所产生的影响。这种方法可避免在仿真运行之间更新模型图,并以交互方式测试和调试您的模型。

示例模型 sldemo_fuelsys 包含一个 Constant 模块 Throttle Command,它代表节气门命令。要观察在仿真过程中增加该命令的幅值所产生的影响,请执行以下操作:

  1. 打开示例模型。

    sldemo_fuelsys

  2. 在模型中,打开 Scope 模块对话框。

  3. 开始仿真。

    模型配置为仿真 2000 秒。在仿真过程中,fuelair_fuel_ratio 信号的值实时显示在波形图中。

  4. 在模型中,当状态条大致指向 1000(1000 秒)时,点击 Pause 按钮 暂停仿真。

  5. 在波形视图中,fuel 图绘制暂停之前的仿真输出。

  6. 在模型中,在 Modeling 选项卡上,点击 Model Data Editor

  7. 在模型数据编辑器中,选择 Parameters 选项卡。

  8. 在模型中,选择 Throttle Command 模块。

  9. 在模型数据编辑器中,选择 rep_seq_y 行。还要确保不选择 rep_seq_t 行。

  10. 对于 rep_seq_y 行,将 Value 列中的值从 [10 20 10] 更改为 [10 30 10]

  11. 点击 Step Forward 按钮 逐步执行仿真。点击此按钮大约 15 下,或者直到您在波形视图中看到 fuel 图发生变化为止。

    fuel 信号图显示,随着节气门命令幅值的增加,燃油需求量急剧增加。

  12. 在模型中,点击 Continue 按钮 继续仿真。

    波形视图显示,在剩下的仿真过程中,燃油需求量明显周期性增加,而空燃比周期性降低。

在仿真过程中,更改工作区变量的值后,必须更新模型图。有关更新模型图的详细信息,请参阅更新图和运行仿真

为进行参数调优和试验做准备

  • 使用工作区变量来设置模块参数值。

    要访问模块参数的值,例如 Constant 模块的 Constant value 参数的值,您必须在模型中导航到该模块并打开模块对话框,或使用模型资源管理器搜索该模块,或者在命令提示符下使用函数 set_param

    或者,如果您通过创建工作区变量来设置模块参数值,则可以使用命令提示符、MATLAB® 工作区浏览器或模型资源管理器来更改该变量的值。您也可以创建一个变量,为多个模块参数设置相同的值。当您更改变量值时,所有目标模块参数都将使用新值。有关访问和设置模块参数值的详细信息,请参阅设置模块参数值

  • 可视化仿真输出。

    要在您调整模块参数值时实时观察仿真输出,您可以使用模型中的模块,例如 Scope 模块。您还可以在仿真运行结束时捕获仿真输出,然后在仿真数据检查器中查看仿真数据。有关详细信息,请参阅 决定如何可视化仿真数据

  • 为您要在仿真过程中调整的模块参数指定值范围。

    如果您希望其他人使用您的模型并调整参数,您可以通过指定一个范围来控制允许调整的值。此外,最好的做法是为您要调整的所有定点模块参数都指定值范围。要指定模块参数的值范围,请参阅指定模块参数的最小值和最大值

  • 控制仿真持续时间和速度。

    仿真运行可能执行得很快,让您无法调整模块参数值。而且,如果您要在特定的仿真时间更改参数值,则必须学会如何控制仿真进度。您可以将仿真配置为在特定期间运行或一直运行,还可以在您需要的时候暂停和继续仿真。有关详细信息,请参阅以交互方式对模型进行仿真以编程方式运行仿真

使用 Dashboard 模块进行交互式调整

您可以通过将 Dashboard 库中的模块添加到您的模型中来调整模块参数值。采用 Dashboard 模块,您可以通过与模仿工业控制器外观的旋钮、开关和读表器进行交互,以调整其他模块的参数值并实时观察仿真输出。您可以与 Dashboard 模块进行交互,而无需找到模型中的目标模块参数。有关详细信息,请参阅 使用 Dashboard 模块对模型进行调优和可视化

仿真过程中有哪些模块参数可调?

不可调模块参数是指不能在仿真过程中更改值的参数。例如,您不能调整 Sample time 模块参数。如果一个参数不可调,则您不能在仿真过程中通过在模块对话框中更改值或通过更改工作区变量的值来更改该参数的值。

不可调模块参数包括:

  • 采样时间。

  • 控制模块外观或结构的参数,例如 Sum 模块的输入数目。

  • 优先级,允许您控制模块的执行顺序。

  • 控制模块算法的参数,例如 Discrete-Time Integrator 模块的 Integrator method 参数。

要确定模块参数在仿真过程中是否可调,请使用以下方式之一:

  • 开始仿真并打开模块对话框。如果目标模块参数的值在仿真过程中为灰色,则您不能调整该参数。

  • 在命令提示符下,确定是否使用了 read-writeread-only-if-compiled 标志描述该参数。

    1. 在模型中选择模块。

    2. 在命令提示符下,使用函数 get_param 以返回有关模块对话框参数的信息。此函数返回一个结构体,其中为模块对话框中的每个参数包含一个字段。

      paramInfo = get_param(gcb,'DialogParameters');

      也可以将 gcb 替换为模块路径(例如 'myModel/mySubsystem/myBlock'),而不是在模型中找到并选择模块。

    3. 查看有关目标模块参数的信息。例如,要查看有关某个模块的 Sample time 参数的信息,请查看字段 SampleTime 的值,它也是一个结构体。

      paramInfo.SampleTime
      ans = 
      
              Prompt: 'Sample time:'
                Type: 'string'
                Enum: {}
          Attributes: {'read-write'  'read-only-if-compiled'  'dont-eval'}

    4. 检查该结构体的 Attributes 字段,其值为字符向量元胞数组。如果元胞数组中出现标志 read-write,则您可以修改该参数值。但是,如果元胞数组中还出现标志 read-only-if-compiled,则您不能在仿真过程中修改该参数值。

如果您使用封装来为模块和子系统创建自定义接口,则您可以控制各个封装参数的可调性。如果您使用模型参数对引用模型进行参数化,则您可以调整每个 Model 模块中的每个模型参数的值。

为何仿真输出保持不变?

如果您更改参数值后仿真输出不变,请通过以下方式进行故障排除:

  • 找到工作区变量的定义。

    如果您使用工作区变量设置模块参数值,请确定变量定义的位置。例如,如果您在模型工作区中定义了一个变量 myVar,然后使用它在模型中设置模块参数值,则您不能通过更改基础工作区中名为 myVar 的变量的值来更改模块参数值。您必须访问模型工作区中的变量定义。

    要定位某变量的定义,请在编辑使用该变量的模块参数的值时,点击附近的操作按钮 ,然后选择 Explore。此时会打开一个对话框,如模型资源管理器,其中显示变量在相应工作区中的定义。有关模型如何使用变量的详细信息,请参阅符号解析

  • 为您要在仿真过程中调整的定点参数指定值范围。

    如果您要调整的模块参数使用定点数据类型且会进行最佳精度定标,请为该参数指定最小值和最大值,以便 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 仿真之间调整运行时参数。有关详细信息,请参阅 Tuning Runtime Parameters

有关加速仿真过程中参数可调性的详细信息,请参阅Tuning Runtime Parameterssim in parfor with Rapid Accelerator Mode。有关 SIL 和 PIL 仿真过程中参数可调性的详细信息,请参阅Tunable Parameters and SIL/PIL (Embedded Coder)

快速重启

有关使用快速重启时参数可调性的详细信息,请参阅开始使用快速重启

外部程序的代码生成和仿真

仿真过程中的可调参数在生成的代码中可能显示为不可调的内联参数。如果您使用 SIL、PIL 或 External 模式仿真对外部程序进行仿真,则仿真过程中以及仿真运行之间的参数可调性取决于您的代码生成设置。

要控制生成的代码中的参数可调性,您可以使用配置参数 Default parameter behavior 调整模型的代码生成设置。也可以调整单个 MATLAB 变量、Simulink.Parameter 对象和其他参数对象的设置。有关详细信息,请参阅Preserve Variables in Generated Code (Simulink Coder)

Stateflow 图

要在仿真过程中通过更改数据来调试 Stateflow 图,请参阅Debugging Stateflow Charts (Stateflow)

另请参阅

相关主题