I am learning about control theory by going through Oagata's Modern Control Engineering.

As part of a practice exercise I am trying to design a full-state feedback controller that satisfies my design requirements using the pole placement technique.

MathWorks provides high quality documentation about pole placement.

Design Requirements:

  1. Less than 5% overshoot
  2. Less than 2s settling time
  3. Steady State Error Minimised

My 4th order system:

                 - 0.00198 s + 2
   s^4 + 0.1201 s^3 + 12.22 s^2 + 0.4201 s + 2

Step Response:

enter image description here

What I have done so far:

I first started by understanding the pole placement technique. Since closed-loop pole locations have a direct impact on overshoot, settling time and steady state error, these can be adjusted accordingly to get the desired response. Pole placement may be done using state-space techniques, and thus require a state space model of the system. Therefore:

NUM4 = [-0.00198 2];
DEN4 = [1 0.1201 12.22 0.4201 2];
sys = tf(NUM4,DEN4)
[A, B, C, D] = tf2ss(NUM4,DEN4)

A = -0.1201  -12.2200   -0.4201   -2.0000
     1.0000        0         0         0
         0    1.0000         0         0
         0         0    1.0000         0

B = [1; 0; 0; 0]

C = [0 0 -0.0020 2.0000]

D = 0

Next, the closed-loop poles are the eigenvalues of A-BK, where K can be computed using the place function.

K = place(A,B,p); where p contains the desired locations of the closed loop poles. I proceeded with:

p = [-0.424+1i*1.263, -0.424-1i*1.263, -0.626+1i*0.4141, 
K = place(A,B,p)

And the result I got was:

K =

1.9799   -8.8200    2.2799   -1.0001

This means that I have to poles on the right hand side of the plane, resulting in an unstable system. Since I need to design a full-state feedback controller that satisfies the design requirements, this is clearly wrong.

  • \$\begingroup\$ I'm not sure exactly what you're doing wrong, but I suspect that you're taking the values of K to be the eigenvalues of the system with feedback. I calculated the eigenvalues of \$A - BK\$ with the numbers you gave, and they're not only stable, but they're plenty close enough to your target values that the deviation can be written off to rounding errors. \$\endgroup\$
    – TimWescott
    Nov 23 '18 at 19:35
  • \$\begingroup\$ Note that pole placement has to be the second-most dangerous control design method invented by man, behind just randomly choosing gains. Pole placement, in general, only works if you have an exact model of the plant (which you simply don't, unless the "plant" is a computer simulation), or if you have an intuitive grasp of what target pole locations you can choose that will result in a safe system (which you don't, until you've chosen a lot of pole placements and seen them fail). \$\endgroup\$
    – TimWescott
    Nov 23 '18 at 19:38
  • \$\begingroup\$ I will re-check my working regarding your first comment. Not sure if I fully understood your second comment. Since my model is a computer simulation does this mean that in this case, I have an exact model of the plant? \$\endgroup\$
    – rrz0
    Nov 23 '18 at 19:42
  • \$\begingroup\$ Well, it does, yes. But out there in the real world that will never happen. Don't let this stop you from learning pole placement -- you need to know it for further study. Just remember what I said if you want to use it in a real-world situation. \$\endgroup\$
    – TimWescott
    Nov 23 '18 at 19:46

As directed by @TimWescott's helpful comments, I am taking K to be the eigenvalues of the system with feedback.

The closed loop dynamics are dictated by \$A_cl = A -BK\$ and not \$K\$.

Therefore one should proceed further:

Acl = A - B*K;
e = eig(Acl)


e =

  -0.4240 + 1.2630i
  -0.4240 - 1.2630i
  -0.6260 + 0.4141i
  -0.6260 - 0.4141i

The closed loop system in ss form for this case(D=0) is:

\$ẋ = (A-BK)x + Bu\$

Plotting response to a step input:

[n,d] = ss2tf(Acl,B,C,D)

n =

         0         0         0   -0.0020    2.0000

d =

    1.0000    2.1000    3.4000    2.7000    0.9999

enter image description here

Even though I set the final value on Simulink to 1 the output settles at 2. Will need to investigate why this happens.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.