%% Worst-Case Norm and Condition Number of an Uncertain Matrix
% Construct an uncertain matrix and compute the worst-case norm of the matrix and of its inverse. These computations let you accurately estimate the worst-case, or the largest, value of the condition number of the matrix.

a = ureal('a',5,'Range',[4 6]); 
b = ureal('b',3,'Range',[2 10]); 
c = ureal('c',9,'Range',[8 11]); 
d = ureal('d',1,'Range',[0 2]); 

M = [a b;c d];
Mi = inv(M);

maxnormM = wcnorm(M)

%

maxnormMi = wcnorm(Mi)

%
% The condition number of M must be less than the product of the two upper bounds for all values of the uncertain elements of M. Conversely, the condition number of the largest value of M must be at least equal to the condition number of the nominal value of M. Compute these bounds on the worst-case value of the condition number.

condUpperBound = maxnormM.UpperBound*maxnormMi.UpperBound; 
condLowerBound = cond(M.NominalValue); 
[condLowerBound condUpperBound]

% The range between these lower and upper bounds is fairly large. You can get a more accurate estimate. Recall that the condition number of an n-by-m matrix M can be expressed as an optimization, where a free norm-bounded matrix \Delta tries to align the gains of M and inv(M):
% \begin{array}{c}
% \kappa \left( M \right) = {\max _{\Delta  \in {C^{m \times m}}}}\left( {{\sigma _{\max }}\left( {M\Delta {M^{ - 1}}} \right)} \right)\\
% {\sigma _{\max }}\left( \Delta  \right) \le 1
% \end{array}
%
% If M is uncertain, then the worst-case condition number involves further maximization over the possible values of M. Therefore, you can compute the worst-case condition number of an uncertain matrix by using a ucomplexm uncertain element and using wcnorm to carry out the maximization.
% Create a 2-by-2 ucomplexm element with nominal value 0.

Delta = ucomplexm('Delta',zeros(2,2));

%
% The range of values represented by Delta includes 2-by-2 matrices with the maximum singular value less than or equal to 1.
% Create the expression involving M, Delta, and inv(M).

H = M*Delta*Mi;

%

opt = wcOptions('MussvOptions','m5');
[maxKappa,wcu,info] = wcnorm(H,opt);
maxKappa

%
% Verify that the values in wcu make the condition number as large as maxKappa.LowerBound.

cond(usubs(M,wcu))

% Copyright 2012 The MathWorks, Inc.