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).

Antworten (1)

Sam Chak
Sam Chak am 14 Dez. 2023

0 Stimmen

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

Kategorien

Produkte

Version

R2023a

Gefragt:

am 14 Dez. 2023

Beantwortet:

am 14 Dez. 2023

Community Treasure Hunt

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

Start Hunting!

Translated by