why margin() give positive phase & gain margin for unstable plant

Hello,
I m trying to write a piece of code that traces a pre-defined complex plane as a disturbance for given plant. Then I tried to check stability of each point in space by using margin() function.
However, I noticed that margin() is giving positive gain&phase margins for even unstable plants. I could not understand the reason behind it. Here is my test case;
s = tf('s');
G = 1/((s+3)*(s-2));
margin(G);
step(G);
G_cl = feedback(G,1);
step(G_cl);
I also checked closed loop tf, but it was also unstable.

1 Comment

In addition to this, I will be very appreciated for your advices for stability tests available with complex numbers. ( To define generic disturbance case, I am using f = a+b*1i as disturbance.)

Sign in to comment.

 Accepted Answer

I don't think margin() first verifies that the closed loop system is stable. It just applies the gain and phase criteria to the input its given. As always, one needs to (or at least should) verify that the closed loop system is stable before computing stability margins. The allmargin() function can do this, but it doesn't make a bode plot.
s = tf('s');
G = 1/((s+3)*(s-2));
allmargin(G)
ans = struct with fields:
GainMargin: [6 Inf] GMFrequency: [0 Inf] PhaseMargin: [1×0 double] PMFrequency: [1×0 double] DelayMargin: [1×0 double] DMFrequency: [1×0 double] Stable: 0
Note that the last field, 'Stable', indicates that the closed loop system is unstable, which means the GainMargin and PhaseMargin don't take on their usual meaning. Also, the GainMargin is given in absolute gain, not dB.

4 Comments

I see the point, then how can we test stability of complex valued open loop tfs? Thank you.
Do you mean testing the stability of a closed loop system where the open loop transfer function has complex coefficients? Can a simple example be provided?
Exactly like that. Assume that we have plant G = 1/(s^2+4s+4) and we have f = a+b*1i; where a & b are traced in cartesian space like a =[-5:5] & b =[-2:2].
In this case we have open loop TF as "G*f" but it has complex coefficients. Most of the matlab function don't support complex numbers in stability check? ( I see that bode(G*f) can work, but I want to traced whole space, not one by one with eye check)
Still would like some more clarifiication.
We have a plant G(s) with real coefficients.
We have a feedback gain, f, that is a complex, with open loop transfer function f*G(s).
Is the goal to find all of the values of f that make the closed loop transfer function H(s) = f*G(s)/(1 + f*G(s)) unstable?
Or is the goal to find the smallest (in some sense) f that makes the closed loop unstable?

Sign in to comment.

More Answers (0)

Products

Release

R2015b

Asked:

on 24 Jan 2022

Commented:

on 25 Jan 2022

Community Treasure Hunt

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

Start Hunting!