Stability Margins for MIMO Feedback Loop

9 views (last 30 days)
Florian
Florian on 13 Mar 2025
Commented: Paul on 16 Mar 2025
Hello,
I have this NDI-Controller for the lateral motion of an aircraft modelled in Simuink and want to determine its stabiity margins. I am strugging in how to linearize the open feedback loop. I placed an 'looptransfer' analysis point after my Control Allocation, hence the control input. When I now linearize the open-loop with the Model Linearizer, and determine the margins in MATLAB with 'allmargin(-linsys)', it says, that my open-loop is not stable.
For me it seems, like I am using the Matlab Linearizer not correctly, as my outputs of the feedback loop seem stable. The same to all the poles.
Does anyone have an idea, how I should linearize the feedback loop to receive the correct gain & phase margins? Would be so helpful.
Thanks a lot.
Cheers,
Flo
  2 Comments
Paul
Paul on 13 Mar 2025
allmargin doesn't tell anything about open-loop stability, only closed loop stability via the Stable field of the output.
I think your plant has 2 inputs, so the result from allmargin should be a two-element structure. The Stable field is zero for both elements of the allmargin output?
You might get more help if you upload linsys in a .mat file using the Paperclip icon on the Insert menu.
Florian
Florian on 13 Mar 2025
Yes, the result of allmargin is a two-element structure, where the stable field is zero for both elements. Attached is the resulting linsys.mat, which I receive if I perform a linearization with the depcited signal marked as 'looptransfer'.

Sign in to comment.

Answers (2)

Sam Chak
Sam Chak on 13 Mar 2025
If you wish to determine the stability margin of a linearized system, you may consider using the Bode Plot block directly. Please refer to the example provided. The water tank system is nonlinear, and the Bode Plot block can perform linearization at the specified input-output points. However, your aircraft model is somewhat unconventional, as the Plant's output state vector x is fed back to the Reference Model. Should the Linearizer interpret this as an external feedback loop?
  11 Comments
Sam Chak
Sam Chak on 16 Mar 2025
Thank you for your detailed analysis and demonstration. I agree that the functions nyquist() and nyquistplot() should be improved to provide warnings when poles are detected on the imaginary axis.
Of course, it may be beneficial to strategically modify the Nyquist path by adding semicircular indentations around these poles, shifting to the left side of the imaginary axis to ensure that the contour does not pass through them.
Paul
Paul on 16 Mar 2025
Here is the full scale plot from nyquist
s = zpk('s');
G3 = 1/((s^2 + 1)*(s^2 + 2*s + 1));
figure
nyquist(G3)
Now zoom in really tight in the x-axis
figure
nyquist(G3)
xlim(0.25+[-1,1]/1e6)
We see that the plot isn't closed, which is at least a clue that something peculiar might be happening at infinity. But that pecularity would be pretty easy to overlook (as I did originally)
To be fair to the developers, it might be tricky to determine what actually constitutes a pole on the imaginary axis and the implications of that on how to select the contour, how to display the results, how the results are returned to the user if output arguments are requested, etc. I'm sure it's not a trivial issue.

Sign in to comment.


Paul
Paul on 13 Mar 2025
Load in the data
load linsys
format short e
The open loop system has a pole just to the right of the real axis. Maybe this is really supposed to be an open loop integrator?
max(real(pole(linsys1)))
ans =
2.1349e-09
If we close the loop
H = feedback(-linsys1,eye(2));
the closed-loop system still has (probably) that same pole, which is unstable.
max(real(pole(H)))
ans =
2.8572e-08
But linsys1 is non-minimal
linsys1 = minreal(linsys1);
7 states removed.
max(real(pole(linsys1)))
ans =
-7.3799e-13
allmargin claims the closed-loop is stable
S = allmargin(-linsys1);
S.Stable
ans = logical
1
ans = logical
1
Which is verified by the closed-loop poles.
H = feedback(-linsys1,eye(2));
max(real(pole(H)))
ans =
-2.4630e-02
For your design, is a closed-loop pole so close to the origin expected?
  2 Comments
Florian
Florian on 14 Mar 2025

Thanks a lot Paul, that makes sense. Yeah, there can be a pole close to the origin. So if I understand it correctly, minreal() removes all uncontrollable poles which don’t influence my I/O behavior

Paul
Paul on 15 Mar 2025
Each pole removed by minreal is one of: uncontrollable and observable, controllable and unobservable, or unobservable and uncontrollable.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!