Repeated uncertanity Blocks in robust control

28 views (last 30 days)
AMIT
AMIT on 24 Feb 2026 at 11:27
Commented: AMIT ungefär 13 timmar ago
for calculating the SSV using the mussv command, I am required to define the BlocKStructure. How to define the Blockstructure as defined in the above image?

Answers (1)

Paul
Paul on 25 Feb 2026 at 1:29
Edited: Paul ungefär 8 timmar ago
Hi Amit,
As far as I can see, mussv does not support repeated, full, complex blocks. Out of curiosity, in what sort of problem does one encounter such an uncertainty structure?
However, the block structure can be rearranged to solve a different problem that might (or might not) be of interest.
I'll show an example with Ny = 2 and only two repeated blocks to keep things simpler (and less typing).
Define the full block
delta = sym('delta',[6,2]);
And the full uncertainty block
Delta = blkdiag(delta,delta);
The input to Delta, i.e., the output from M, are two, 2 x 1 vectors.
z1 = sym('z1',[2,1]);
z2 = sym('z2',[2,1]);
z = [z1;z2];
The output of Delta is then
w = Delta*z
w = 
Rearrange the elements of Delta so that instead having two, repeated 6 x 2 blocks we have 6 blocks, where each block is a repeated scalar of one of the elements of delta.
bDelta = [delta(:),delta(:)].';
bDelta = diag(bDelta(:))
bDelta = 
Now we define a right-side pre-multiplication and left-side post-multiplication on bdelta such that:
L*bdelta*R*z = Delta*z.
R and L are (there's probably a smart way to automate this)
R = zeros(24,4);
R(1:2:12,1) = 1; % z11
R(2:2:12,3) = 1; % z21
R(13:2:end,2) = 1; % z12
R(14:2:end,4) = 1; % z22
L = zeros(12,24);
L(1,[1,13]) = 1;
L(2,[3,15]) = 1;
L(3,[5,17]) = 1;
L(4,[7,19]) = 1;
L(5,[9,21]) = 1;
L(6,[11,23]) = 1;
L(7,[2,14]) = 1;
L(8,[4,16]) = 1;
L(9,[6,18]) = 1;
L(10,[8,20]) = 1;
L(11,[10,22]) = 1;
L(12,[12,24]) = 1;
Show the equivalence
sympref('AbbreviateOutput',false)
ans = logical
1
[L*bDelta*R*z , Delta*z]
ans = 
all(isAlways(L*bDelta*R*z == Delta*z))
ans = logical
1
Now we can analyze how large bdelta can be to maintain loop stability of R*M*L*bdelta instead of how large Delta can be to maintain loop stability of M*Delta.
For example
rng(100);
M = rand(4,12) + 1j*rand(4,12);
Run mussv on R*M*L
[bounds,muinfo] = mussv(R*M*L,repmat([2,0],12,1));
bounds
bounds = 1×2
16.4127 16.3555
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Extract the peturbation with the structure of bdelta that corresponds to the lower bound
bdelta = mussvextract(muinfo);
Verify that bdelta makes the loop unstable (eigenvalue at 1)
eig(R*M*L*bdelta)
ans =
1.0000 + 0.0000i 0.0088 + 0.1163i 0.0006 + 0.0011i 0.0004 + 0.0004i 0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i -0.0000 - 0.0000i -0.0000 + 0.0000i 0.0000 - 0.0000i -0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i
Compute Delta from bdelta and verify that Delta makes the loop unstable
Delta = L*bdelta*R;
eig(M*Delta)
ans =
1.0000 + 0.0000i 0.0088 + 0.1163i 0.0006 + 0.0011i 0.0004 + 0.0004i
However, the norm of bdelta is quite a bit smaller than the norm of Delta and, I believe, it's possible that there might exist a different Delta with smaller norm that also makes the M*Delta loop unstable.
[max(svd(bdelta)), 1/bounds(2)]
ans = 1×2
0.0611 0.0611
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
max(svd(Delta))
ans = 0.2118
Like I said, we're solving a different problem than posed, but maybe it can still provide useful information for the problem of interest. Maybe.
  1 Comment
AMIT
AMIT ungefär 6 timmar ago
This uncertainity structure is related to fluid flow problem

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!