Error in pole placement

19 ビュー (過去 30 日間)
Ho Pui Sum
Ho Pui Sum 2023 年 12 月 14 日
回答済み: Sam Chak 2023 年 12 月 14 日
I am working on a feedback sytem and I am finding the k:
A=[0 0 0 217.28; 0 0 127.33 0; 0 -1 -3.73 0.97; -1 0 0.97 -3.73]; %4*4
B=[0 0 -.38 -1.39; 0 0 -1.18 0.29].'; %4*2
C=[1 0 0 0]; %1st row of C
D=zeros(1, 2);
% Desired pole locations
desired_poles = -1 * ones(1, size(A, rank(B))); % All poles at -1
% Calculate the feedback gain matrix K using pole placement
k = place(A, B, desired_poles);
Error using place
The "place" command cannot place poles with multiplicity greater than rank(B).
% Create the closed-loop system
Aclosed = A - B * k;
Bclosed = B;
Cclosed = C;
Dclosed = D;
% Check the poles of the closed-loop system
closed_loop_poles = eig(Aclosed);
disp('Poles of the closed-loop system:');
disp(closed_loop_poles);
I'm shown this error
Error using place
The "place" command cannot place poles with multiplicity greater than rank(B).

回答 (1 件)

Sam Chak
Sam Chak 2023 年 12 月 14 日
That is the limitation of the place() command, and it is documentated here. In your case, the rank of the input matrix B is 2. Therefore, you are only allowed to place 2 repeated poles. See the workaround below.
A=[0 0 0 217.28; 0 0 127.33 0; 0 -1 -3.73 0.97; -1 0 0.97 -3.73]; %4*4
B=[0 0 -.38 -1.39; 0 0 -1.18 0.29].'; %4*2
rankB = rank(B) % number of repeated poles cannot be greater than this value
rankB = 2
C=[1 0 0 0]; %1st row of C
D=zeros(1, 2);
sys = ss(A, B, C, D)
sys = A = x1 x2 x3 x4 x1 0 0 0 217.3 x2 0 0 127.3 0 x3 0 -1 -3.73 0.97 x4 -1 0 0.97 -3.73 B = u1 u2 x1 0 0 x2 0 0 x3 -0.38 -1.18 x4 -1.39 0.29 C = x1 x2 x3 x4 y1 1 0 0 0 D = u1 u2 y1 0 0 Continuous-time state-space model.
% Desired pole locations
% desired_poles = -1 * ones(1, size(A, rank(B))) % All poles at -1
desired_poles = [-1.0001, -1, -1, -0.9999]
desired_poles = 1×4
-1.0001 -1.0000 -1.0000 -0.9999
% Calculate the feedback gain matrix K using pole placement
k = place(A, B, desired_poles)
k = 2×4
0.6710 0.1644 -0.3673 1.0056 -0.2161 0.7879 1.5843 -1.1458
% Create the closed-loop system
Aclosed = A - B * k;
Bclosed = B;
Cclosed = C;
Dclosed = D;
% Check the poles of the closed-loop system
closed_loop_poles = eig(Aclosed);
disp('Poles of the closed-loop system:');
Poles of the closed-loop system:
disp(closed_loop_poles);
-0.9999 -1.0001 -1.0000 -1.0000

カテゴリ

Help Center および File ExchangePower and Energy Systems についてさらに検索

製品


リリース

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by