-1

I have a SISO system (in tf form) with 48 eigenvalues and I want to find the dominant poles (let's say to reduce it to a 1st or 2nd order). I need to know them to approximately calculate damping and bandwidth of my system. I would like not to rely on identification from time responses and I don't want to watch the pzmap (since I have to do it many times). Does anyone have an idea to solve it? Thanks in advance for help.

Benedetto Roda
  • 45
  • 2
  • 10
  • You can find the most dominant poles by looking at the pole-zero map... or just the poles... and finding those that are closest to the imaginary axis. I can't really tell you any more unless I see some code you wrote. – rayryeng Nov 13 '15 at 21:31
  • This is what I'm doing for now... But since I have to do it many times (let's say more than 30 times), I was searching for a programmatic solution... – Benedetto Roda Nov 13 '15 at 21:38
  • I gave it a shot. Have a look. – rayryeng Nov 13 '15 at 22:05
  • So did this answer ever help you? Please consider accepting my answer if it did. – rayryeng May 05 '16 at 19:12

1 Answers1

0

If you are already given the transfer function, what you can do is analyze the poles and sort based on their real values. The pole or complex pole pair that is stable (i.e. on the left side of the complex plane) and the closest to the imaginary axis would be the most dominant poles you would choose.

Something like this comes to mind, given that your transfer function is stored in a TF object, which we'll call T:

%// Get numerator and denominator data
[num,den] = tfdata(T, 'v');

%// Get the poles
pl = roots(den);

%// Get the stable poles only
pl_stable = pl(real(pl) < 0);

%// Determine the closest real location to the imaginary axis
[~,ind] = min(abs(real(pl_stable)));

%// Find all poles that share this same real location
tol = 1e-10;
ind_final = find(abs(real(pl_stable - pl_stable(ind))) <= tol);
final_poles = pl_stable(ind_final);

The first part of this code finds the numerator and denominator coefficients of your transfer function and stores them in num and den respectively. After, we get the poles of the transfer function by finding the roots of the denominator. After, we isolate out only the stable poles by searching for all poles whose real component is negative.

Once we isolate out those poles, we determine the closest pole to the imaginary access by using min and using the second output to determine the location of this minimum.

After, we want to find all poles who share this same smallest real component by searching for all poles that are within a small tolerance of this smallest real value. I set this tolerance to 1e-10. Once we find these locations, we index into the stable poles array and pull out what we need.


Here's a small example:

>> T = tf([1 1], [1 3 2 1])

T =

          s + 1
  ---------------------
  s^3 + 3 s^2 + 2 s + 1

Continuous-time transfer function.

Checking out the poles, we get:

>> pl

pl =

  -2.3247 + 0.0000i
  -0.3376 + 0.5623i
  -0.3376 - 0.5623i

As you can see, there are a pair of dominant poles whose real component is -0.3376 while there's another real pole that is farther away located at -2.3247. The pair of poles at s = -0.3376 +/- 0.5623i is what we need to extract out.

Running through the code above, we get:

>> final_poles

final_poles =

  -0.3376 + 0.5623i
  -0.3376 - 0.5623i
rayryeng
  • 102,964
  • 22
  • 184
  • 193