Main Content

LPV System

对线性参数变化 (LPV) 系统进行仿真

  • LPV System block

库:
Control System Toolbox / Linear Parameter Varying

描述

线性参数变化 (LPV) 系统是一种线性状态空间模型,其动态特性作为某些称为调度参数的时变参数的函数而变化。在 MATLAB® 中,LPV 模型表示为使用参数相关系数的状态空间形式。

在数学上,您可以将 LPV 系统表示如下。

dx(t)=dx0(p)+A(p)(x(t)x0(p))+B(p)(u(t)u0(p))y(t)=y0(p)+C(p)(x(t)x0(p))+D(p)(u(t)u0(p))x(0)=xinit

其中:

  • u(t) 是输入

  • y(t) 是输出

  • x(t) 是具有初始值 xinit 的模型状态

  • dx(t) 是连续时间系统的状态导数向量 x˙,是离散时间系统的状态更新向量 x[k+1]。此处,k 是对采样周期数 Ts 进行计数的整数索引。

  • A(p)、B(p)、C(p) 和 D(p) 是由调度参数向量 p 参数化的状态空间矩阵。

  • 参数 p = p(t) 是模型的输入和状态的可测量函数。它们可以是标量,也可以是由几个参数组成的向量。这组调度参数定义调度空间,在该空间上定义 LPV 模型。

  • dx0(p)、x0(p)、u0(p) 和 y0(p) 是在给定参数值 p = p(t) 或 p[k] 处的 dx(t)、x(t)、u(t) 和 y(t) 值中的偏移量。

    当调用 linearize (Simulink Control Design)getIOTransfer (Simulink Control Design) 等函数时,您可以通过返回额外的线性化信息来获得偏移量。有关示例,请参阅LPV Approximation of Boost Converter Model (Simulink Control Design)

小心

避免使 C(p) 和 D(p) 依赖系统输出 y。否则,得到的状态空间方程 y = C(y)x + D(y)u 会创建一个代数环,因为计算输出值 y 需要知道输出值。这种代数环容易带来不稳定性和发散性。在这种情况下,请尝试用时间 t、模块输入 u 和状态输出 x 来表示 C 和 D。

出于类似的原因,请避免根据 dx 输出来调度 A(p) 和 B(p)。请注意,当 y 是状态和输入的固定组合时(即当 y = Cx + Du 时,其中 C 和 D 是常量矩阵),A 和 B 依赖于 y 是安全的。

该模块实现 LPV 系统的基于网格的表示。您需要为调度参数选择网格值。在每个值 p = p* 处,将对应的线性系统指定为状态空间(ssidss (System Identification Toolbox))模型对象。使用生成的状态空间模型数组来配置 LPV System 模块。

该模块接受具有工作点信息的状态空间模型数组。该模块从 LTI 数组的 SamplingGrid 属性中提取有关调度变量的信息。调度变量定义 LPV 模型的网格。它们是标量值,可以是时间、输入和状态的函数,也可以是常量。它们用于捕获操作空间中的局部动态特性。软件对这些变量的值进行插值。该模块对此数组采用数据内插和外插方法来进行仿真。

示例

全部展开

假设有一个包含 2 个输入、3 个输出、4 个状态的 LPV 模型。使用输入 u(2) 和状态 x(1) 作为调度参数。如下图所示配置 Simulink® 模型。

假设有一个线性质量-弹簧-阻尼系统,其质量随外部加载命令函数而变化。控制方程如下。

m(u)y¨+cy˙+ky=F(t)

此处,m(u) 是取决于外部命令 u 的质量,c 是阻尼比,k 是弹簧的刚度,F(t) 是强制输入。y(t) 是质量在给定时间 t 的位置。如果 u 是固定值,则系统是线性系统,表示为:

A=[01-km-cm],

B=[01m],

C=[10]

x˙=Ax+Buy=Cx

其中,x=[yy˙] 是状态向量,m 是给定 u 值的质量的值。

在此示例中,您要在 1 到 10 伏的输入值范围内研究模型行为。对于 u 的每个值,测量质量并计算系统的线性表示。假设质量与输入的关系是 m(u)=10u+0.1u2。如果 u 值的范围是从 1 到 10,将产生以下线性系统数组。

c = 5;   
k = 300; 
u = 1:10;
m = 10*u + 0.1*u.^2;
for i = 1:length(u)
   A = [0 1; -k/m(i), -c/m(i)];
   B = [0; 1/m(i)];
   C = [1 0];
   sys(:,:,i) = ss(A,B,C,0); 
end

变量 u 是调度输入。将以下信息添加到模型中。

sys.SamplingGrid = struct('LoadCommand',u);

配置 LPV System 模块:

  • 状态空间数组字段中键入 sys

  • 将输入端口 par 连接到一维源信号,该信号生成加载命令的值。如果源提供 1 到 10 之间的值,模块使用插值来计算给定时间实例的线性模型。否则,该模块使用外插。

对 LPV 模型进行仿真,将恒定强制输入设置为 100 N 且加载命令调度变量设置为随机值。

model = "simMSDLPV";
open_system(model);

此示例说明如何使用 LPV System 模块仿真发动机转速的线性参数变化 (LPV) 模型。LPV System 模块对一个状态空间数组进行插值以进行 LPV 响应建模。通常,您可以通过在一系列工作条件下批量线性化非线性模型来获得这样一个数组。此示例提供 scdspeedlpvData 中发动机转速模型的线性化结果。有关线性化此模型的详细信息,请参阅Linearize Engine Speed Model (Simulink Control Design)

打开模型。

model = "scdspeedLPVCompare";
open_system(model);

加载用于实现 LPV 模型的线性化结果。

load scdspeedlpvData.mat

LPV 模型是在 LPV 模型子系统下实现的。

Implementation of LPV Model subsystem

LPV System 模块将节气门角度作为输入,并将转速输出作为调度变量。模块参数的配置如下图所示。此处,状态空间数组 sys 和偏移量是通过批量线性化非线性模型获得的。

仿真模型并绘制响应比较图。

sim(model);
plot(logsOut{1}.Values.Time,logsOut{1}.Values.Data)
grid on
legend("Nonlinear sim","LPV sim","LTI sim",Location="best")

LPV 模型提供非线性响应的良好逼近。

限制

  • 内部延迟无法外插为小于它在状态空间模型数组中的最小值。

  • 当使用线性模型的散点网格来定义 LPV 系统时,仅使用最近邻点插值方案。这可能会降低仿真结果的准确度。推荐使用通过 ndgrid 创建的矩形网格。

端口

输入

全部展开

指定输入信号 u(t)。在多输入情况下,此端口接受输入维度的信号。

为定义调度空间的变量(采样网格变量)提供信号。调度变量可以是时间、输入和状态的函数,也可以是常量。根据需要,您可以通过使用 LPV 模块的时钟输入(用于时间)、输入信号 (u)、输出状态信号 (x) 或任何外因信号来准备调度信号,从而实现所需的依存关系。

小心

避免使 C(p) 和 D(p) 依赖系统输出 y。否则,得到的状态空间方程 y = C(y)x + D(y)u 会创建一个代数环,因为计算输出值 y 需要知道输出值。这种代数环容易带来不稳定性和发散性。在这种情况下,请尝试用时间 t、模块输入 u 和状态输出 x 来表示 C 和 D。

出于类似的原因,请避免根据 dx 输出来调度 A(p) 和 B(p)。请注意,当 y 是状态和输入的固定组合时(即当 y = Cx + Du 时,其中 C 和 D 是常量矩阵),A 和 B 依赖于 y 是安全的。

输出

全部展开

线性参数变化模型的响应。

模型状态的值

依存关系

要启用此端口,请在模块参数的输出选项卡上选择输出状态

状态导数的值。状态导数有时用于定义调度参数。但请避免根据 dx 输出来调度 A 和 B。

依存关系

要启用此端口,请在模块参数的输出选项卡上选择输出状态导数(连续时间)或更新(离散时间)

主要仿真时间步的局部状态空间模型数据,以包含以下元素的总线信号形式返回。

  • A - 状态矩阵

  • B - 输入矩阵

  • C - 输出矩阵

  • D - 馈通矩阵

  • InputDelay - 输入延迟

  • OutputDelay - 输出延迟

  • InternalDelay - 模型中的内部延迟

依存关系

要启用此端口,请在模块参数的输出选项卡上选择输出插值后的状态空间数据

仿真主时间步的 LPV 模型偏移量数据,以包含以下元素的总线信号形式返回。

  • InputOffset

  • OutputOffset

  • StateOffset

  • StateDerivativeOffset

依存关系

要启用此端口,请在模块参数的输出选项卡上选择输出插值后的偏移量

参数

全部展开

要以交互方式编辑模块参数,请使用属性检查器。在 Simulink 工具条中,在仿真选项卡的准备库中,选择属性检查器

LPV 模型选项卡

状态空间(ssidss (System Identification Toolbox))模型数组。数组中的所有模型必须使用相同的状态定义。

状态空间数组必须为 SamplingGrid 属性中的模型指定调度参数和插值网格。当您将工作点偏移量参数设置为在状态空间数组中使用偏移量时,您也可以在数组的 Offsets 属性中指定模型偏移量。有关这些属性的详细信息,请参阅 ss 模型参考页。

当模块位于具有同步状态控制(请参阅 State Control (HDL Coder) 模块)的模型中时,必须指定由离散时间模型组成的数组。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: sys
值: ss or idss model array name in quotes

示例: set_param(gcb,"sys","sysArrayName")

与本地模型结合使用以开始仿真的初始条件,指定为长度等于模型状态数的向量。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: x0
值: "0" (默认) | initial state values in quotes

示例: set_param(gcb,"x0","[0 0.1]")

自 R2024a 起

指定工作点偏移量的格式。

  • 将偏移量指定为双精度数组 - 使用输入偏移量输出偏移量状态偏移量状态导数/更新偏移量参数指定偏移量。

  • 将偏移量指定为结构体数组 - 将偏移量指定为结构体数组,其中字段 uyxdx 分别指定输入、输出、状态和状态导数偏移量。

  • 在状态空间数组中使用偏移量 - 使用在状态空间数组的 Offsets 属性中指定的偏移量。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: opSpecOption
值: "Specify Offsets as double arrays" (默认) | "Specify offsets as struct array" | "Use offsets in state-space array"

示例: set_param(gcb,"opSpecOption","Specify offsets as struct array")

输入 u(t) 中的偏移量,指定为以下值之一:

  • 0 - 在没有输入偏移量 (u¯(p)=0  p) 时使用。

  • 长度等于输入数目的双精度向量 - 当输入偏移量在调度空间中相同时使用。

  • 大小为 nu×1×N1×...×Nm 的双精度数组 - 当偏移量存在并且它们在调度空间中变化时使用。此处,nu 是输入数目,N1×...×Nm 是调度网格的大小。例如,如果您的模型有三个输入、两个输出和四个状态,并且在 5×6 工作点网格上进行调度,则输入数组大小必须为 3×1×5×6。使用 size(sys) 来确定状态空间数组 sys 的大小。

依存关系

要启用此参数,请将工作点偏移量格式化为将偏移量指定为双精度数组

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: uOffset
值: "0" (默认) | array name in quotes

示例: set_param(gcb,"uOffset","uOffArray")

输出 y(t) 中的偏移量,指定为以下项之一:

  • 0 - 在没有输出偏移量 y¯(p)=0  p 时使用。

  • 长度等于输出数目的双精度向量。当输出偏移量在调度空间中相同时使用。

  • 大小为 ny×1×N1×...×Nm 的双精度数组 - 当偏移量存在并且它们在调度空间中变化时使用。此处,ny 是输出数目,N1×...×Nm 是调度网格的大小。例如,如果您的模型有三个输入、两个输出和四个状态,并且在 5×6 工作点网格上进行调度,则输入数组大小必须为 2×1×5×6。使用 size(sys) 来确定状态空间数组 sys 的大小。

依存关系

要启用此参数,请将工作点偏移量格式化为将偏移量指定为双精度数组

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: yOffset
值: "0" (默认) | array name in quotes

示例: set_param(gcb,"yOffset","yOffArray")

状态 x(t) 中的偏移量,指定为以下项之一:

  • 0 - 在没有状态偏移量 x¯(p)=0  p 时使用。

  • 长度等于状态数目的双精度向量。当状态偏移量在调度空间中相同时使用。

  • 大小为 nx×1×N1×...×Nm 的双精度数组 - 当偏移量存在并且它们在调度空间中变化时使用。此处,nx 是状态的数目,N1×...×Nm 是调度网格的大小。例如,如果您的模型有三个输入、两个输出和四个状态,并且在 5×6 工作点网格上进行调度,则输入数组大小必须为 4×1×5×6。使用 size(sys) 来确定状态空间数组 sys 的大小。

依存关系

要启用此参数,请将工作点偏移量格式化为将偏移量指定为双精度数组

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: xOffset
值: "0" (默认) | array name in quotes

示例: set_param(gcb,"xOffset","xOffArray")

状态导数或更新变量 dx(t) 中的偏移量,指定为以下项之一:

  • 如果您在均衡条件下通过线性化获得了线性系统数组,请选择假设均衡工况选项。对于连续时间系统,此选项对应于偏移量 dx¯(p)=0;对于离散时间系统,此选项对应于偏移量 dx¯(p)=x¯(p)。默认情况下,此选项处于选中状态。

  • 如果线性系统包含至少一个在非均衡条件下获得的系统,请清除假设均衡工况选项。在偏移量值字段中指定以下值之一:

    • 如果 dx 偏移量值在调度空间中相同,请将其指定为长度等于状态数的双精度向量。

    • 如果 dx 偏移量存在并且它们在调度空间中变化,请将其指定为一个大小为 nx×1×N1×...×Nm 的双精度数组 - 在偏移量存在并且它们在调度空间中变化时使用。此处,nx 是状态的数目,N1×...×Nm 是调度网格的大小。例如,如果您的模型有三个输入、两个输出和四个状态,并且在 5×6 工作点网格上进行调度,则输入数组大小必须为 4×1×5×6。使用 size(sys) 来确定状态空间数组 sys 的大小。

依存关系

要启用此参数,请将工作点偏移量格式设置为将偏移量指定为双精度数组并禁用假设均衡工况

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: dxOffset
值: "0" (默认) | array name in quotes

示例: set_param(gcb,"dxOffset","dxOffArray")

自 R2024a 起

模型偏移量,指定为具有以下字段的结构体。

字段描述
u输入偏移量
y输出偏移量
x状态偏移量
dx状态导数偏移量
  • 如果偏移值在调度空间中相同,则指定长度等于对应字段的输入、输出或状态数的双精度向量。

  • 如果调度空间中的偏移量会变化,请指定结构体数组。例如,假设您的模型有三个输入、两个输出和四个状态。如果使用一个由工作点组成的 5×6 数组来线性化您的模型,则结构体数组大小必须为 5×6,并且每个条目必须包含一个长度等于对应字段的输入、输出或状态数目的向量。

如果您在 StoreOffsets 选项设置为 true 时进行线性化,linearize (Simulink Control Design) 函数会在 info.Offsets 输出中以此格式返回偏移量。

依存关系

要启用此参数,请将工作点偏移量格式设置为将偏移量指定为结构体数组 (自 R2024a 起)

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: Offset
值: "struct" (默认) | structure array name in quotes

示例: set_param(gcb,"Offset","OffsetStructName")

“固定条目数”选项卡

提供固定系数值的状态空间模型,指定为以下项之一:

  • 使用状态空间数组中的第一个模型默认值)- 状态空间数组中的第一个模型用于表示 LPV 模型。在以下示例中,状态空间数组由对象 sys 指定,固定系数取自模型 sys(:,:,1)

    % Specify a 4-by-5 array of state-space models.
    sys = rss(4,2,3,4,5);
    a = 1:4; 
    b = 10:10:50;
    [av,bv] = ndgrid(a,b);
    % Use "alpha" and "beta" variables as scheduling parameters.
    sys.SamplingGrid = struct('alpha',av,'beta',bv);  

    固定系数取自模型 sysFixed = sys(:,:,1),该模型对应于 [alpha=1, beta=10]。如果 A 矩阵的 (2,1) 条目强制设为固定,则它在仿真期间使用的值为 sysFixed.A(2,1)

  • 自定义值 - 为固定条目指定不同的状态空间模型。在状态空间模型字段中为固定模型指定变量。固定模型必须使用与 LPV 模型中的状态空间数组相同的状态基。

指定状态空间矩阵和延迟向量的哪些系数是固定的。

指定以下选项之一:

  • 标量布尔值(truefalse),如果矩阵的所有条目都以相同的方式处理。

    对于状态空间矩阵和延迟向量,默认值为 false,这意味着它们被视为自由的。

  • 大小与对应矩阵的大小兼容的逻辑矩阵:

    状态空间矩阵

    固定条目矩阵的大小

    矩阵

    nx×nx

    B 矩阵

    nx×nu

    C 矩阵

    ny×nx

    D 矩阵

    ny×nu

    输入延迟

    nu×1

    输出延迟

    ny×1

    内部延迟

    ni×1

    其中,nu 是输入的数目,ny 是输出的数目,nx 是状态的数目,ni 是内部延迟向量的长度。

  • 用于指定固定条目位置的数值索引。有关如何为矩阵元素生成对应于给定下标 (i,j) 的数值索引的详细信息,请参阅 sub2ind 参考页。

“调度”选项卡

内插方法。定义对于远离其网格位置的调度参数值,必须如何计算状态空间数据。

指定以下选项之一:

  • 均一 - 选择最接近但不大于当前点的网格点处的状态空间数据。当前点是在当前时间的调度参数值。

  • 最近邻点 - 选择调度空间中最近邻网格点处的状态空间数据。

  • 线性 - 通过对调度空间中最近邻的 2d 个邻点进行线性内插来获得状态空间数据,其中 d = 调度参数数目。

对于调度参数值的规则网格,默认内插方案为线性。对于不规则网格,无论您如何选择,都将始终使用最邻近值插值方案。要了解有关规则和不规则网格的更多信息,请参阅Regular vs. Irregular Grids

线性方法提供的准确度最高,但计算时间较长。均一最近邻点方法适用于具有模式切换动态特性的模型。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: IMethod
值: "Linear" (默认) | "Nearest" | "Flat"

示例: set_param(gcb,"IMethod","Flat")

外插方法。定义如何为所提供状态空间数组所处范围(在 SamplingGrid 属性指定)之外的调度参数值计算状态空间数据。

指定以下选项之一:

  • 裁剪(默认值)- 禁用外插并返回与最接近当前点的最后一个可用调度网格点对应的数据。

  • 线性 - 根据当前值是小于第一个网格点值还是大于最后一个网格点值,分别在每个调度参数的第一对值或最后一对值之间拟合一条线。此方法返回该线上对应于当前值的点。线性外插要求内插方案也是线性的。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: EMethod
值: "Clip" (默认) | "Linear"

示例: set_param(gcb,"EMethod","Linear")

模块使用预查找算法来确定当前调度参数值在调度空间中的位置。选择线性搜索二分搜索。每种搜索方法在不同情况下均有各自的速度优势。有关此参数的详细信息,请参阅 Prelookup (Simulink) 模块参考页。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

要以编程方式获取模块参数值,请使用 get_param (Simulink) 函数。

参数: IndexSearch
值: "Binary Search" (默认) | "Linear Search"

示例: set_param(gcb,"IndexSearch","Linear Search")

如果您希望模块使用在上一个时间步中找到的索引开始搜索,请选中此复选框。有关此参数的详细信息,请参阅 Prelookup (Simulink) 模块参考页。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: IndexBegin
值: "on" (默认) | "off"

示例: set_param(gcb,"IndexBegin","off")

代码生成选项卡

模块数据类型,指定为双精度单精度

依存关系

要启用此选项,请使用离散时间状态空间模型作为输入。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: DataType
值: "double" (默认) | "single"

示例: set_param(gcb,"DataType","single")

为针对包含延迟的模型而存储的输入点数所分配的初始内存。如果输入点的数量超出初始缓冲区大小,该模块将分配额外的内存。默认大小为 1024。

当您在加速模式下运行模型或编译模型时,请确保初始缓冲区大小足以处理模型中最大的预期延迟。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: InitBufferSize
值: "1024" (默认) | positive integer greater than 5 in quotes

示例: set_param(gcb,"InitBufferSize","512")

指定是否使用固定缓冲区大小来保存先前时间步的延迟输入和输出数据。对于包含输入或输出延迟的连续时间 LPV 系统,请使用此选项。如果缓冲区已满,新数据将替换缓冲区中已有的数据。软件使用线性外插来估计不在缓冲区中的输出值。

编程用法

要以编程方式设置模块参数值,请使用 set_param (Simulink) 函数。

参数: FixedBuffer
值: "off" (默认) | "on"

示例: set_param(gcb,"FixedBuffer","on")

扩展功能

C/C++ 代码生成
使用 Simulink® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2014b 中推出

全部展开