48 lines
1.3 KiB
Matlab
48 lines
1.3 KiB
Matlab
clear;
|
|
|
|
s = tf('s');
|
|
|
|
k = ureal('k', 2.5, 'Range', [2, 3]);
|
|
tau = ureal('tau', 2.5, 'Range', [2, 3]);
|
|
theta = ureal('theta', 2.5, 'Range', [2, 3]);
|
|
|
|
% delay is approximated using pade:
|
|
% e^(-theta*s) = e^(-theta*s)/2 1 - theta*s/2
|
|
% ------------- = --------------
|
|
% e^(theta*s)/2 1 + theta*s/2
|
|
|
|
G = k/(tau*s+1) * (1-theta*s)/2 / ((1+theta*s)/2);
|
|
G_nom = k.NominalValue/(tau.NominalValue*s+1);
|
|
|
|
% G = (1+I_m)G_nom => I_m = (G-G_nom)/G_nom
|
|
I_m = (G-G_nom)/G_nom;
|
|
|
|
% get wcgain
|
|
w = logspace(-3, 3, 40);
|
|
[wcg, wcu, info] = wcgain(I_m, w);
|
|
|
|
% fit worst-case magnitude to obtain a closed form of the multiplicative
|
|
% uncertainty
|
|
data = frd(info.Bounds(:, 2), w);
|
|
% use a second-order model
|
|
I_m_analytic = tf(fitmagfrd(data, 2));
|
|
|
|
% For MIMO systems, the division in the expression for I_m doesn't make
|
|
% sense
|
|
% 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);
|
|
|
|
data_2 = frd(resp_im, w);
|
|
I_m_analytic_2 = tf(fitmagfrd(data_2, 2));
|
|
|
|
sigma(I_m, w); hold;
|
|
semilogx(w, 20*log10(info.Bounds(:, 2)), 'green');
|
|
sigma(I_m_analytic, 'red');
|
|
sigma(I_m_analytic_2, 'yellow');
|
|
|
|
I_m_analytic
|