Use ucover to retrieve multiplicative uncertainty

This commit is contained in:
Enrico Lumetti 2021-08-13 14:32:26 +02:00
parent bc6fc0d63c
commit 3f0461070f
1 changed files with 10 additions and 9 deletions

View File

@ -30,17 +30,18 @@ I_m_analytic = tf(fitmagfrd(data, 2));
% For MIMO systems, the division in the expression for I_m doesn't make % For MIMO systems, the division in the expression for I_m doesn't make
% sense % sense
% This is another way to compute it: % This is another way to compute it:
opt = wcOptions('MussvOptions','m3'); % for better lower bound
[wcg, wcu, info_num] = wcgain(G-G_nom, w);
[wcg, wcu, info_den] = wcgain(G_nom, w, opt);
resp_im = info_num.Bounds(:, 2) ./ info_den.Bounds(:, 1); % generate some instances of the uss
systems = usample(G, 20);
data = frd(systems, w);
data_2 = frd(resp_im, w); % cover the frequency response data using an order 2 multiplicative
% constrain the uncertainty to stay above the magnitude data % uncertainty
Constraint.LowerBound = data_2; % ucover returns [G, Info] where G is the uncertain system given by
Constraint.UpperBound = []; % G(s) = [I+W1(s) Delta(s)] G_nom(s)
I_m_analytic_2 = tf(fitmagfrd(data_2, 2, [], [], Constraint)); % W1(s) can be recovered from Info.W1
[G2, Info] = ucover(data, G_nom, 2);
I_m_analytic_2 = tf(Info.W1);
sigma(I_m, w); hold; sigma(I_m, w); hold;
semilogx(w, 20*log10(info.Bounds(:, 2)), 'green'); semilogx(w, 20*log10(info.Bounds(:, 2)), 'green');