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
仅提供基本的配平功能。要获得完整的配平功能,请使用 Simulink® Control Design™ 软件。有关详细信息,请参阅Compute Steady-State Operating Points (Simulink Control Design)。
平衡点,也称为均衡点,是指当动态系统处于稳定状态时该系统的参数空间中的点。例如,飞机的平衡点就是使飞机保持水平直飞的一个控制设置。从数学上讲,平衡点是指系统的状态导数等于零时的点。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)x0
、u0
、y0
的平衡点,即以下系统的最大值最小时的点:
abs([x-x0; u-u0; y-y0])
[x,u,y,dx] = trim('
查找最接近 sys
',x0,u0,y0,ix,iu,iy)x0
、u0
、y0
的平衡点,该点满足指定的一组状态、输入和/或输出条件。整数向量 ix
、iu
和 iy
选择必须满足的 x0
、u0
和 y0
值。如果 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 对于查找平衡点特别有用。
编号 | 默认值 | 描述 |
---|---|---|
1 | 0 | 指定显示选项。0 指定不显示;1 指定表格式输出;-1 禁止显示警告消息。 |
2 | 10-4 | 计算出的平衡点必须达到此精度才能终止搜索。 |
3 | 10-4 | 平衡搜索目标函数必须达到此精度才能终止搜索。 |
4 | 10-6 | 状态导数必须达到此精度才能终止搜索。 |
5 | 不适用 | 未使用。 |
6 | 不适用 | 未使用。 |
7 | 不适用 | 内部使用。 |
8 | 不适用 | 返回平衡搜索目标函数的值(目标实现中的 λ)。 |
9 | 不适用 | 未使用。 |
10 | 不适用 | 返回用来查找平衡点的迭代次数。 |
11 | 不适用 | 返回函数梯度计算次数。 |
12 | 0 | 未使用。 |
13 | 0 | 等式约束的数量。 |
14 | 100*(变量的数量) | 用来查找平衡点的最大函数计算次数。 |
15 | 不适用 | 未使用。 |
16 | 10-8 | 内部使用。 |
17 | 0.1 | 内部使用。 |
18 | 不适用 | 返回步长的长度。 |
[x,u,y,dx,options] = trim('
将时间设置为 sys
',x0,u0,y0,ix,iu,iy,dx0,idx,options,t)t
(如果系统依赖于时间)。
注意
如果您固定了任何状态、输入或输出值,trim
将使用未指定的自由变量推导出满足这些约束的解。
示例
求稳定状态点
Simulink trim
函数使用模型来确定动态系统中满足您指定的输入、输出和状态条件的稳定状态点。以 ex_lmod
模型为例。
您可以使用 trim
函数求出将输出都设置为 1 的输入值和状态值。首先,对状态变量 (x
) 和输入值 (u
) 进行初始猜测,然后将输出 (y
) 设置为所需的值。
x = [0; 0; 0]; u = 0; y = [1; 1];
使用索引变量指示哪些变量固定,哪些变量可变。
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
以返回解。由于舍入误差的原因,您的结果可能有所不同。
[x,u,y,dx] = trim('lmod',x,u,y,ix,iu,iy) x = 0.0000 1.0000 1.0000 u = 2 y = 1.0000 1.0000 dx = 1.0e-015 * -0.2220 -0.0227 0.3331
请注意,均衡点问题可能无解。在这种情况下,trim
首先尝试将导数设置为零,然后返回使得与所需结果的最大偏差最小的解。有关 trim
语法的描述,请参阅 trim
。
寻找均衡点
假定有一个使用 State-Space 模块建模的线性状态空间系统
要在命令行或模块参数对话框中输入的 A、B、C 和 D 矩阵为:
A = [-0.09 -0.01; 1 0]; B = [ 0 -7; 0 -2]; C = [ 0 2; 1 -5]; D = [-3 0; 1 0];
要找到这个名为 sys
的模型中的均衡点,请使用:
[x,u,y,dx,options] = trim('sys') x = 0 0 u = 0 0 y = 0 0 dx = 0 0
执行的迭代数为:
options(10) ans = 7
要找到接近 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
要找到输出固定为 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
要找到输出固定为 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
从任何给定的初始点开始找到的平衡点只是一个局部值。可能存在其他更适合的平衡点。因此,如果您要找到某个特定应用情况下最适合的平衡点,最好多尝试几个 x
、u
和 y
的初始估计值。
算法
trim
采用逐次二次规划算法来查找平衡点。有关此算法的描述,请参阅序列二次规划 (SQP) (Optimization Toolbox)。
版本历史记录
在 R2006a 之前推出
另请参阅
findop
(Simulink Control Design)
主题
- Compute Steady-State Operating Points (Simulink Control Design)