主要内容

trim

找到动态系统的平衡点

trim 函数仅提供基本的配平功能。要获得完整的配平功能,请使用 Simulink® Control Design™ 软件。有关详细信息,请参阅Compute Steady-State Operating Points (Simulink Control Design)

说明

trim 函数采用序列二次规划算法从初始点开始搜索,直到找到最接近的平衡点为止。您必须隐式或显式提供初始点。如果 trim 函数找不到平衡点,它将返回搜索过程中遇到的状态导数在极小化极大意义上最接近零的点。换句话说,该函数返回与导数的零点之间的最大偏差最小时的点。trim 函数可以查找满足特定输入、输出或状态条件的平衡点,还可以查找系统按指定方式变化时的点,即,系统的状态导数等于特定非零值时的点。

小心

当您使用 trim 函数在指定的初始工作点附近查找平衡点,则 trim 函数仅返回一个局部值。但可能存在其他更合适的平衡点。要找到某个特定应用情况下最适合的平衡点,最好多尝试几个初始状态、输入和输出值的初始估计值。

[x,u,y,dx] = trim(sys) 查找由 sys 指定的模型的最接近初始状态 x0 的均衡点。具体而言,trim 函数查找 [x-x0,u,y] 的最大绝对值最小时的均衡点。如果 trim 找不到接近系统初始状态的均衡点,将返回系统最邻近均衡时的点。具体来讲,就是返回 abs(dx) 最小时的点,其中 dx 表示系统的导数。您可以使用以下命令获取 x0[sizes,x0,xstr] = sys([],[],[],0)

示例

[x,u,y,dx] = trim(sys,x0,u0,y0) 查找最邻近 x0u0y0 的平衡点,即 abs([x-x0; u-u0; y-y0]) 的最大值最小时的点。

[x,u,y,dx] = trim(sys,x0,u0,y0,ix,iu,iy) 查找最接近 x0u0y0 的平衡点,该点满足指定的一组状态、输入和/或输出条件。整数向量 ixiuiy 选择必须满足的 x0u0y0 值。如果 trim 函数找不到完全满足一组指定条件的均衡点,将返回满足这些条件的最邻近的点,即 abs([x(ix)-x0(ix); u(iu)-u0(iu); y(iy)-y0(iy)])

示例

[x,u,y,dx] = trim(sys,x0,u0,y0,ix,iu,iy,dx0,idx) 查找特定的非均衡点,即,系统的状态导数为一些指定的非零值的点。这里,dx0 指定搜索起点处的状态导数值,idx 选择 dx0 中搜索必须完全满足的值。

示例

[x,u,y,dx,options] = trim(sys,x0,u0,y0,ix,iu,iy,dx0,idx,options) 指定 trim 函数传递给优化函数(用来查找平衡点)的优化参数数组。优化函数然后使用此数组控制优化过程,并返回优化过程的有关信息。trim 函数在搜索过程结束时返回 options 数组。通过以这种方式呈现底层的优化过程,trim 函数允许您监视和微调平衡点搜索。

[x,u,y,dx,options] = trim(sys,x0,u0,y0,ix,iu,iy,dx0,idx,options,t) 将时间设置为 t(如果系统依赖于时间)。

如果您固定了任何状态、输入或输出值,trim 函数将使用未指定的自由变量推导出满足指定约束的解。

示例

全部折叠

打开名为 EquilibriumPoints 的示例模型,该模型使用 State-Space 模块对线性状态空间系统进行建模。

sys = "EquilibriumPoints";
open_system(sys)

Block diagram of example model

State-Space 模块指定以下矩阵:

  • A = [-0.09 -0.01;1 0]

  • B = [0 -7;0 -2]

  • C = [0 2;1 -5]

  • D = [-3 0; 1 0]

要在模型中找到一个均衡点,请调用 trim 函数并只指定模型名称作为输入参量。

[x,u,y,dx,options] = trim(sys)
x = 2×1

     0
     0

u = 2×1

     0
     0

y = 2×1

     0
     0

dx = 2×1

     0
     0

options = 1×18

         0    0.0001    0.0001    0.0000         0         0    1.0000         0         0    7.0000    2.0000         0    2.0000  500.0000         0    0.0000    0.1000    1.0000

Simulink® trim 函数使用模型来确定动态系统中满足指定的输入、输出和状态条件的稳定状态点。

打开名为 SteadyStatePoints 的示例模型。

sys = "SteadyStatePoints";
open_system(sys)

Block diagram of example model

要求出导致两个输出值都为 1 的输入值和状态值,请使用 trim 函数。

创建名为 x 和 u 的变量,分别存储表示状态变量值和输入值的初始估计值。然后,创建一个名为 y 的变量来存储所需的输出值。

x = [0; 0; 0];
u = 0;
y = [1; 1];

创建索引变量来指定哪些变量固定,哪些变量可变。要指定状态值和输入值可变,请将空矩阵 ([]) 赋给索引变量 ixiu。要指定输出值固定,请将索引变量 iy 的值指定为 [1;2]

ix = [];      % Don't fix any of the states
iu = [];      % Don't fix the input
iy = [1;2];   % Fix both output 1 and output 2

要求出得到所需输出值的状态值和输入值,请调用 trim 函数。由于存在舍入误差,trim 函数返回的值可能不同。

[x,u,y,dx] = trim(sys,x,u,y,ix,iu,iy)
x = 3×1

    0.0000
    1.0000
    1.0000

u = 
2.0000
y = 2×1

    1.0000
    1.0000

dx = 3×1
10-15 ×

    0.2220
    0.1020
   -0.3331

均衡点问题可能没有解。在这种情况下,trim 函数首先尝试将导数设置为 0,然后返回使得与所需结果的最大偏差最小的解。

打开名为 EquilibriumPoints 的示例模型,该模型使用 State-Space 模块对线性状态空间系统进行建模。

sys = "EquilibriumPoints";
open_system(sys)

Block diagram of example model

State-Space 模块指定以下矩阵:

  • A = [-0.09 -0.01;1 0]

  • B = [0 -7;0 -2]

  • C = [0 2;1 -5]

  • D = [-3 0; 1 0]

要在由状态值和输入值定义的工作点附近找到一个均衡点,请调用 trim 函数,并指定包含状态值和输入值的附加输入参量来定义该工作点。

x0 = [1;1];
u0 = [1;1];
[x,u,y,dx,options] = trim(sys,x0,u0)
x = 2×1
10-13 ×

   -0.2343
   -0.2353

u = 2×1

    0.3333
   -0.0000

y = 2×1

   -1.0000
    0.3333

dx = 2×1
10-13 ×

    0.8232
   -0.0058

options = 1×18

         0    0.0001    0.0001    0.0000         0         0    1.0000    1.0000         0   31.0000    6.0000         0    2.0000  500.0000         0    0.0000    0.1000    1.0000

检查 options 返回参量,查看确定指定工作点附近的均衡点所需的迭代次数。

options(10)
ans = 
31

要找到一个两个输出值都是固定值的均衡点,请指定附加输入参量以指示目标输出值并指定输出值是固定的。

y = [1;1];
iy = [1;2];
[x,u,y,dx] = trim(sys,[],[],y,[],[],iy)
x = 2×1

    0.0009
   -0.3075

u = 2×1

   -0.5383
    0.0004

y = 2×1

    1.0000
    1.0000

dx = 2×1
10-16 ×

    0.0043
    0.4196

要找到一个具有指定导数值且两个输出都固定的均衡点,请为导数值、目标输出值指定附加输入参量,且指定输出值是固定的。

y = [1;1];
iy = [1;2];
dx = [0;1];
idx = [1;2];
[x,u,y,dx,options] = trim(sys,[],[],y,[],[],iy,dx,idx)
x = 2×1

    0.9752
   -0.0827

u = 2×1

   -0.3884
   -0.0124

y = 2×1

    1.0000
    1.0000

dx = 2×1

   -0.0000
    1.0000

options = 1×18

         0    0.0001    0.0001    0.0000         0         0    1.0000    0.0000         0   13.0000    3.0000         0    2.0000  500.0000         0    0.0000    0.1000    1.0000

检查 options 返回参量,查看确定指定工作点附近的均衡点所需的迭代次数。

options(10)
ans = 
13

输入参数

全部折叠

Simulink 模型,指定为字符串或字符向量。

数据类型: char | string

状态变量值的初始估计值,指定为向量。

输入值的初始估计值,指定为标量或向量。

所需输出值,指定为向量。

指定固定状态的索引变量,指定为整数向量。

要指定值可以变化,请指定空矩阵 ([])。

指定固定输入的索引变量,指定为整数向量。

要指定值可以变化,请指定空矩阵 ([])。

指定固定输出的索引变量,指定为整数向量。

要指定值可以变化,请指定空矩阵 ([])。

在搜索开始时的状态导数值,指定为向量。

搜索必须完全满足的状态导数值,指定为向量。

优化参数,指定为数组。

数组元素 1、2、3、4 和 10 对于查找平衡点特别有用。

下表介绍了每个元素对平衡点搜索的影响。

不支持。默认值描述
10显示选项。0 指定不显示,1 指定表格式输出,-1 禁止显示警告消息。
210-4计算出的平衡点必须达到此精度才能终止搜索。
310-4平衡搜索目标函数必须达到此精度才能终止搜索。
410-6状态导数必须达到此精度才能终止搜索。
5不适用未使用。
6不适用未使用。
7不适用内部使用。
8不适用平衡搜索目标函数的值(目标达到中的 λ)。
9不适用未使用。
10不适用用来查找平衡点的迭代次数。
11不适用函数梯度计算的次数。
120未使用。
130等式约束的数量。
14100*(变量的数量)用来查找平衡点的最大函数计算次数。
15不适用未使用。
1610-8内部使用。
170.1内部使用。
18不适用步长。

时变系统的时间,指定为标量。

输出参量

全部折叠

平衡点,以向量形式返回。

平衡点,以向量形式返回。

平衡点,以向量形式返回。

系统的导数,以向量形式返回。

优化参数,以数组形式返回。

下表介绍了每个元素对平衡点搜索的影响。

不支持。默认值描述
10显示选项。0 指定不显示,1 指定表格式输出,-1 禁止显示警告消息。
210-4计算出的平衡点必须达到此精度才能终止搜索。
310-4平衡搜索目标函数必须达到此精度才能终止搜索。
410-6状态导数必须达到此精度才能终止搜索。
5不适用未使用。
6不适用未使用。
7不适用内部使用。
8不适用平衡搜索目标函数的值(目标达到中的 λ)。
9不适用未使用。
10不适用用来查找平衡点的迭代次数。
11不适用函数梯度计算的次数。
120未使用。
130等式约束的数量。
14100*(变量的数量)用来查找平衡点的最大函数计算次数。
15不适用未使用。
1610-8内部使用。
170.1内部使用。
18不适用步长。

详细信息

全部折叠

算法

trim 函数采用序列二次规划算法来查找平衡点。有关此算法的描述,请参阅序列二次规划 (SQP) (Optimization Toolbox)

版本历史记录

在 R2006a 之前推出

另请参阅

(Simulink Control Design)

主题