Stability Margins for MIMO Feedback Loop

5 ビュー (過去 30 日間)
Florian
Florian 2025 年 3 月 13 日
コメント済み: Paul 2025 年 3 月 16 日
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 件のコメント
Paul
Paul 2025 年 3 月 13 日
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 2025 年 3 月 13 日
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'.

サインインしてコメントする。

回答 (2 件)

Sam Chak
Sam Chak 2025 年 3 月 13 日
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 件のコメント
Sam Chak
Sam Chak 2025 年 3 月 16 日
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 2025 年 3 月 16 日
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
Paul 2025 年 3 月 13 日
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 件のコメント
Florian
Florian 2025 年 3 月 14 日

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 2025 年 3 月 15 日
Each pole removed by minreal is one of: uncontrollable and observable, controllable and unobservable, or unobservable and uncontrollable.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangePlot Customization についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by