Stability Margins for MIMO Feedback Loop
9 views (last 30 days)
Show older comments
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
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.
Answers (2)
Sam Chak
on 13 Mar 2025
Hi @Florian
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
on 16 Mar 2025
Hi @Paul
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
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.
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)))
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)))
But linsys1 is non-minimal
linsys1 = minreal(linsys1);
max(real(pole(linsys1)))
allmargin claims the closed-loop is stable
S = allmargin(-linsys1);
S.Stable
Which is verified by the closed-loop poles.
H = feedback(-linsys1,eye(2));
max(real(pole(H)))
For your design, is a closed-loop pole so close to the origin expected?
2 Comments
See Also
Categories
Find more on Plot Customization in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!







