Main Content

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

trim

找到动态系统的平衡点

语法

[x,u,y,dx] = trim('sys')
[x,u,y,dx] = trim('sys',x0,u0,y0)
[x,u,y,dx] = trim('sys',x0,u0,y0,ix,iu,iy)
[x,u,y,dx] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx)
[x,u,y,dx,options] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx,options)
[x,u,y,dx,options] = trim('sys',x0,u0,y0,ix,iu,iy,dx0,idx,options,t)

说明

平衡点,也称为均衡点,是指当动态系统处于稳定状态时该系统的参数空间中的点。例如,飞机的平衡点就是使飞机保持水平直飞的一个控制设置。从数学上讲,平衡点是指系统的状态导数等于零时的点。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 允许您监视和优化平衡点搜索。

下表介绍了每个元素对平衡点搜索的影响。数组元素 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不适用返回步长的长度。

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

注意

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

示例

假定有一个使用 State-Space 模块建模的线性状态空间方程组

x˙=Ax+Buy=Cx+Du

要在命令行或模块参数对话框中输入的 ABCD 矩阵为:

A = [-0.09 -0.01;  1   0];
B = [ 0    -7;     0  -2];
C = [ 0     2;     1  -5];
D = [-3     0;     1   0];

示例 1

要找到这个名为 sys 的模型中的均衡点,请使用:

[x,u,y,dx,options] = trim('sys')
x =
   0
   0
u =
   0
   0
y =
   0
   0
dx =
   0
   0

执行的迭代数为:

options(10)
ans =
      7

示例 2

要找到接近 x = [1;1], u = [1;1] 的均衡点,请输入:

x0 = [1;1];
u0 = [1;1];
[x,u,y,dx,options] = trim('sys', x0, u0);
x =
    1.0e-13 *
   -0.5160
   -0.5169
u =
    0.3333
    0.0000
y =
   -1.0000
    0.3333
dx =
    1.0e-12 *
    0.1979
    0.0035

执行的迭代数为:

options(10)
ans = 
      25

示例 3

要找到输出固定为 1 时的均衡点,请使用:

y = [1;1];
iy = [1;2];
[x,u,y,dx] = trim('sys', [], [], y, [], [], iy)
x =
    0.0009
   -0.3075
u =
   -0.5383
    0.0004
y =
    1.0000
    1.0000
dx =
    1.0e-15 *
   -0.0170
    0.1483

示例 4

要找到输出固定为 1、导数设置为 0 和 1 时的均衡点,请使用:

y = [1;1];
iy = [1;2];
dx = [0;1];
idx = [1;2];
[x,u,y,dx,options] = trim('sys',[],[],y,[],[],iy,dx,idx)
x =
    0.9752
   -0.0827
u =
   -0.3884
   -0.0124
y =
    1.0000
    1.0000
dx =
    0.0000
    1.0000

执行的迭代数为:

options(10)
ans = 
      13

限制

trim 从任何给定的初始点开始找到的平衡点只是一个局部值。可能存在其他更适合的平衡点。因此,如果您要找到某个特定应用情况下最适合的平衡点,最好多尝试几个 xuy 的初始估计值。

算法

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

版本历史记录

在 R2006a 之前推出