本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

优化、估计和扫描模块参数值

扫描一个或多个参数时,您可以在各次仿真运行之间更改参数值,并比较和分析每次运行的输出信号数据。通过参数扫描并将真实系统中的不确定性纳入考虑范围来调整控制参数,估计未知模型参数并测试控制算法的稳定性。

您可以扫描模块参数值或用于设置参数值的工作区变量的值。使用 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 下拉列表设置为 InstrumentationLog 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.240.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

模型将记录的信号(youtslp)流式传输到 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 对象的数组(为每个要运行的仿真创建一个对象)。使用每个对象的 setVariablesetBlockParameter 方法来标识用于对应仿真运行的参数值。使用这种方法,您可以避免在仿真运行之间使用 set_param 函数修改模块参数值以及使用赋值命令修改工作区变量值。

有关使用 Simulink.SimulationInput 对象运行多次仿真的详细信息,请参阅 sim

扫描非标量、结构体和参数对象

如果使用非标量变量、结构体变量或 Simulink.Parameter 对象设置模块参数值,请使用每个 Simulink.SimulationInput 对象的 setVariable 方法。请参阅下表中的示例。

情况示例
MATLAB® 变量 myArray,其值是一个数组。您要设置数组中的第三个元素(假设从 1 开始索引)。
setVariable(simIn,'myArray(3)',15.23)
MATLAB 变量 myStruct,它包含一个名为 field1 的字段。
setVariable(simIn,'myStruct.field1',15.23)
参数对象 myParam,其 Value 属性是一个标量。
setVariable(simIn,'myParam.Value',15.23)
参数对象 myArrayParam,其 Value 属性是一个数组。您要设置数组中的第三个元素。
setVariable(simIn,'myArrayParam.Value(3)',15.23)
参数对象 myStructParam,其 Value 属性是一个结构体。该结构体包含一个名为 field1 的字段。
setVariable(simIn,'myStructParam.Value.field1',15.23)

扫描模型工作区中变量的值

如果使用模型工作区来存储变量,则当使用 Simulink.SimulationInput 对象的 setVariable 方法修改变量值时,请使用 Workspace 对组参数来识别包含模型:

setVariable(simIn,'myVar',15.23,'Workspace','myModel')

捕获和可视化仿真结果

在参数扫描期间的每次仿真运行都会产生输出,例如来自 Outport 模块和来自所记录信号的信号值。

您可以在变量和对象中捕获这些输出以供日后分析。有关详细信息,请参阅导出仿真数据

要可视化仿真输出数据以便比较每个参数值的效果,请参阅决定如何可视化仿真数据

提高仿真速度

要多次执行仿真并且每次仿真都使用不同的参数值,您可以使用加速仿真模式。对于较大的模型,执行加速仿真所需的时间比正常仿真所需的时间要少。如果您还有 Parallel Computing Toolbox™,则可以使用处理器的多个内核同时执行仿真。使用 simparsim 函数的参数。

要通过使用加速仿真和其他方法来提高模型仿真速度,请参阅优化性能。有关示例和详细信息,请参阅运行多个仿真

扫描参数值以测试和验证系统

如果您拥有 Simulink® Test™,您可以确认模型在使用不同参数值时是否仍符合要求。通过参数覆盖和测试迭代,您可以为每个测试用例设置不同参数值。有关详细信息,请参阅Parameter Overrides (Simulink Test)Test Iterations (Simulink Test)

估计和标定模型参数

如果您有 Simulink Design Optimization™,您可以估计模型参数值,以使仿真输出尽量接近您在实际场景中测得的数据。如果您无法直接测量被控对象模型(该模型表示真实系统的动态特性)中参数的实际值时,可使用这种方法来估计这些值。这种估计可提高被控对象模型的精确度。有关详细信息,请参阅Estimate Parameters from Measured Data (Simulink Design Optimization)

调整并优化 PID 和控制器参数

如果您有 Simulink Control Design™,则可以使用 PID 调节器来调整 PID Controller 模块的参数。有关详细信息,请参阅PID Controller Tuning in Simulink (Simulink Control Design)

如果您有 Simulink Design Optimization,则可以优化控制参数值,以便仿真输出满足您指定的响应要求。有关详细信息,请参阅Design Optimization to Meet Step Response Requirements (GUI) (Simulink Design Optimization)

相关主题