我正在尝试设计一个Luenberger观测器,以便在一个传感器可用的情况下,我可以估算所有状态。
我的系统是四阶的:
NUM4 = [-0.00198 2];
DEN4 = [1 0.1201 12.22 0.4201 2];
sys = tf(NUM4,DEN4);
[A, B, C, D] = tf2ss(NUM4,DEN4);
首先,我有两极的行向量来获得所需的响应:
p1 = [-2.6 + 1i*2.39, -2.6 - 1i*2.39, -100, -120];
K = acker(A,B,p1)
p_1 = eig(A-B*K) %This should be the same as p1, but it is not
然后我继续计算植物极点,因此我为观察者想要的极点应该快3倍左右。
rank(ctrb(A,B)) % =4
rank(obsv(A,C)) % =4
planteig=eig(A);
fastpoles = 3*planteig;
然后我继续使用Ackermann公式对新极点进行极点放置:
L=acker(A',C',p2)
L=L'
p_2 = eig(A-L*C) %This should be the same as p2
最后画图:
mysys=ss(A-B*K,B,C,0);
step(74826*mysys)
在此document之后,如何建立观察者,在第6页上写道,我们可以通过计算A-B*K
来验证极点位置,该eig(A-B*K)
应该与放置在Ackermann公式中的极点相同:< / p>
在我看来,这不成立,因此我怀疑得出的矩阵值不正确。
ans =
1.0e+02 *
-1.2000 + 0.0000i
-1.0000 + 0.0000i
-0.0260 + 0.0239i
-0.0260 - 0.0239i
的特征值是:
p1
不等于p1 = [-2.6 + 1i*2.39, -2.6 - 1i*2.39, -100, -120];
= eig(A-L*C)
和ans =
-0.0505 + 1.2211i
-0.0505 - 1.2211i
-0.1296 +10.4136i
-0.1296 -10.4136i
=
p2
等于 -0.1296 +10.4136i
-0.1296 -10.4136i
-0.0505 + 1.2211i
-0.0505 - 1.2211i
,但极点顺序不正确=
$id = $this->input->post('id');
为什么我的案例中的特征值与原始极点不匹配?我编码不正确吗?
答案 0 :(得分:1)
我看不到您的p1
问题。您会以不同的顺序获得本征值,但它对应于p1
直到排列为止。
总而言之,我在这里看不到任何代码错误;您的问题是eig
可能对特征值进行排序(幅度减小),但并非总是如此。如果需要确保特定的顺序,则必须为此进行额外的编码。