Main Content

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

提高性能的建模方法

加速初始化阶段

使用这些方法,可通过加速初始化阶段来加快仿真速度。

使用封装编辑器简化图形

复杂的图形和大图像需要很长时间来加载和渲染。包含此类图像的封装模块会降低模型的响应速度。尽可能从封装模块中移除复杂的绘图和图像。

如果您要保留图像,请用较小的低分辨率版本替换它。使用封装编辑器并编辑图标绘制命令,以保留通过调用 image() 加载的图像。

有关封装编辑器的详细信息,请参阅 Mask Editor 概述

合并函数调用

当您打开或更新模型时,Simulink® 运行封装初始化代码。如果您的模型包含复杂的封装初始化命令,而且这些命令包含对 set_param 的多次调用,请将连续调用合并为一个具有多个参数对组的调用。合并调用可以减少与这些函数调用相关的开销。

要了解详细信息,请参阅封装回调代码

使用 MAT 文件加载数据

如果您使用 MATLAB® 脚本来加载和初始化数据,可以通过加载 MAT 文件来提高性能。MAT 文件中的数据是二进制数据,比脚本更难处理。但是,加载操作通常可比对应的 MATLAB 脚本更快地初始化数据。

有关详细信息,请参阅用 MAT 文件提供信号数据

降低模型交互性

一般情况下,模型的交互性越强,仿真时间就越长。使用这些方法可降低模型的交互性。

禁用调试诊断

一些启用的诊断功能会大幅降低仿真速度。可以考虑在模型配置参数的 Diagnostics 窗格中禁用它们。

注意

运行 Array bounds exceededSolver data inconsistency 会降低模型运行时性能。有关详细信息,请参阅Array bounds exceededSolver data inconsistency

禁用 MATLAB 调试

在验证您的 MATLAB 代码工作正常后,请在模型配置参数的 Simulation Target 窗格中禁用这些检查。

  • Enable debugging/animation

  • Detect wrap on overflow (with debugging)

  • Echo expressions without semicolons

有关详细信息,请参阅模型配置参数:Simulation Target

使用 BLAS 库支持

如果您的仿真涉及低级 MATLAB 矩阵运算,可以使用基本线性代数子程序 (BLAS) 库,以利用其中高度优化的外部线性代数例程。

禁用 Stateflow 动画

默认情况下,Stateflow® 图突出显示模型中的当前激活状态,并为模型仿真时发生的状态转移生成动画。此特性对于调试很有用,但它会减慢仿真速度。

要加快仿真速度,请关闭所有 Stateflow 图或禁用动画。同样,在使用以下各项时,请考虑禁用动画或降低场景保真度:

  • Simulink 3D Animation™

  • Simscape™ Multibody™ 可视化

  • FlightGear

  • 任何其他三维动画包

要了解详细信息,请参阅Speed Up Simulation (Stateflow)

调整波形查看器属性

如果您的模型包含的波形查看器显示了高速记录的波形,而您不能移除该波形,您可以调整查看器属性,通过降低保真度来提高渲染速度。

但是,当您使用抽取来减少所绘制数据点的数量时,您可能会错过使用更多数据点时才会出现的短暂瞬变和其他现象。要更精确地控制可视化的实现,请将查看器放在使能子系统中。

有关详细信息,请参阅 Scope Viewer

降低模型的复杂度

可以使用以下方法在不牺牲保真度的情况下通过简化模型来提高仿真性能。

使用较低保真度的替代系统替换子系统

使用以下一种替代系统替换复杂的子系统:

  • 使用 System Identification Toolbox™ 根据测量的输入输出数据创建的线性或非线性动态模型。

  • 使用 Model-Based Calibration Toolbox™ 创建的高保真度非线性统计模型。

  • 使用 Simulink Control Design™ 创建的线性模型。

  • 查找表。有关详细信息,请参阅查找表

您可以在库中维护子系统的两种表示形式,并使用可变子系统来管理它们。您可以根据模型在不影响整体结果的情况下进行此类替换。有关详细信息,请参阅Optimize Generated Code for Lookup Table Blocks

减少模块数

当您减少模型中的模块数量时,在仿真过程中需要更新的模块会更少,仿真速度会更快。

  • 向量化是减少模块数量的一种方法。例如,如果有几个并行信号经历一组相似的计算,请尝试使用 Mux 模块将它们组合成一个向量,并执行一次计算。

  • 您还可以在 Configuration Parameters 对话框中启用 Block Reduction 参数。

使用基于帧的处理

在基于帧的处理中,Simulink 成批处理样本,而不是一次处理一个样本。例如,如果模型包括模数转换器,您可以在一个缓冲器中收集输出样本。在单一运算中处理该缓冲区,如快速傅里叶变换。以这种方式分块处理数据会减少仿真需要调用模型中模块的次数。

通常,调度开销随着帧大小的增加而减少。然而,较大的帧会消耗更多内存,内存限制会对复杂模型的性能产生不利影响。请尝试不同帧大小,找到合适的帧大小,使其既能够最大限度地提高基于帧的处理的性能优势,同时又不会导致内存问题。

选择和配置求解器

Simulink 提供了完整的求解器库,包括固定步长和可变步长求解器,用于处理刚性和非刚性系统。每个求解器决定下一个仿真步的时间。求解器应用一种数值方法来解算表示模型的常微分方程。

您选择的求解器和求解器选项会影响仿真速度。使用以下标准选择并配置求解器有助于提高模型性能。有关详细信息,请参阅选择求解器

刚性系统

刚性系统有缓慢变化和快速变化两种连续动态。隐式求解器对于刚性问题特别有用。显式求解器更适合非刚性系统。使用显式求解器求解刚性系统可能导致不正确的结果。如果非刚性求解器使用非常小的步长来求解模型,这表明您的系统是刚性的。

模型步长和动态特性

在决定使用可变步长还是固定步长求解器时,需要考虑您的模型的步长和动态特性。请选取所用时间步只捕获重要的动态特性的求解器,以及只执行必要计算(以进行到下一步时间步)的求解器。

当步长小于或等于模型的基础采样时间时,可以使用固定步长求解器。使用可变步长求解器时,步长可以变化,因为可变步长求解器会动态调整步长。因此,某些时间步的步长大于基础采样时间,从而减少了完成仿真所需的步数。一般情况下,使用可变步长求解器的仿真比使用固定步长求解器的仿真运行速度更快。

当模型的基础采样时间等于采样率之一时,选择固定步长求解器。当模型的基础采样时间小于最快采样率时,选择可变步长求解器。您也可以使用可变步长求解器来捕获连续动态特性。

降低求解器阶数

当您降低求解器阶数时,将减少 Simulink 为确定状态输出而执行的计算次数,这将提高仿真速度。但是,随着求解器阶数的降低,结果的准确度会降低。选择能以可接受的准确度产生结果的最低求解器阶数。

增加求解器步长或误差容限

增加求解器步长或误差容限通常会以牺牲准确度为代价来提高仿真速度。在进行这些更改时务必小心,因为它们会导致 Simulink 在仿真过程中错过可能很重要的动态特性。

禁用过零检测

可变步长求解器会动态调整步长,当变量变化缓慢时增加步长,当变量变化迅速时减小步长。此行为导致求解器在不连续点附近采取许多小时间步,因为在此处变量会快速变化。准确度会得到提高,但通常以较长的仿真时间为代价。

为了避免在这些情况下出现的小时间步和长时间仿真,Simulink 使用过零检测来精确定位这些不连续点。对于在工作模式之间频繁波动的系统(这种现象称为抖动),过零检测可能会产生相反的效果,从而降低仿真速度。在这些情况下,您可以禁用过零检测来提高性能。

您可以对模型中的特定模块启用或禁用过零检测。为了提高性能,请考虑对不影响仿真准确度的模块禁用过零检测。

有关详细信息,请参阅过零检测

保存仿真状态

在经典工作流中,Simulink 模型针对不同输入、边界条件和工况重复进行仿真。在许多情况下,这些仿真使用共同的启动阶段,在该阶段中模型从初始状态转移到另一个状态。例如,您可以使电动机达到最高速度,然后测试各种控制序列。

使用 SimState,您可以在启动阶段结束时保存仿真状态,然后还原为该状态,以作为初始状态供将来的仿真使用。这种方法并没有提高仿真速度,但可以减少连续运行的总仿真时间,因为启动阶段只需要仿真一次。

有关详细信息,请参阅 保存和还原仿真工作点

相关示例

详细信息