rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
rb_residual_norm.m
1 function [res,nres] = rb_residual_norm(model, rd, rbsim)
2 % RB_RESIDUAL_NORM Calculate the residual norm of the rb solution rbsim
3 %
4 % Dominik Wittwar, 2016
5 %
6 
7 A_coeff = model.A_coeff();
8 B_coeff = model.B_coeff();
9 C_coeff = model.C_coeff();
10 E_coeff = model.E_coeff();
11 Q_coeff = model.Q_coeff();
12 R_coeff = model.R_coeff();
13 
14 % load reduced solution and estim
15 
16 PN = rbsim.PN;
17 estim = rd.estim;
18 
19 % Directly assemble the small R and Q matrices:
20 Q = lincomb_sequence(rd.Q_comp, Q_coeff);
21 R = lincomb_sequence(rd.R_comp, R_coeff);
22 BN = lincomb_sequence(rd.B_comp,B_coeff);
23 R_P = R + BN'*PN*BN;
24 
25 % Assemble matrices
26 
27 CCT = 0;
28 for i=1:length(C_coeff)
29  for j = 1:length(C_coeff)
30  CCT = CCT + estim.CCT{i,j}*C_coeff(i)*C_coeff(j);
31  end
32 end
33 
34 WTEATW = 0;
35 for i = 1:length(E_coeff)
36  for j = 1:length(A_coeff)
37  WTEATW = WTEATW + estim.WTEATW{i,j}*E_coeff(i)*A_coeff(j);
38  end
39 end
40 
41 WTEETW = 0;
42 for i = 1:length(E_coeff)
43  for j = 1:length(E_coeff)
44  WTEETW = WTEETW + estim.WTEETW{i,j}*E_coeff(i)*E_coeff(j);
45  end
46 end
47 
48 CATW = 0;
49 for i = 1:length(C_coeff)
50  for j = 1:length(A_coeff)
51  CATW = CATW + estim.CATW{i,j}*C_coeff(i)*A_coeff(j);
52  end
53 end
54 
55 WTAATW = 0;
56 for i = 1:length(A_coeff)
57  for j = 1:length(A_coeff)
58  WTAATW = WTAATW + estim.WTAATW{i,j}*A_coeff(i)*A_coeff(j);
59  end
60 end
61 
62 WTECT = 0;
63 for i = 1:length(E_coeff)
64  for j = 1:length(C_coeff)
65  WTECT = WTECT + estim.WTECT{i,j}*E_coeff(i)*C_coeff(j);
66  end
67 end
68 
69 temp = trace((Q*CCT)^2);
70 res = temp + trace((PN*WTEETW)*(PN*WTEETW)) -2*trace(Q*WTECT'*PN*WTECT) + ...
71  -2*trace(PN*WTEATW*PN*WTEATW') + 2*trace(BN*(R_P\BN')*PN*WTEATW'*PN*WTEATW*PN) + ...
72  +2*trace(Q*CATW*PN*CATW') + trace(PN*WTAATW*PN*WTAATW) + ...
73  -2*trace(Q*CATW*PN*BN*(R_P\BN')*PN*CATW') + ...
74  -2*trace(PN*WTAATW*PN*BN*(R_P\BN')*PN*WTAATW) + ...
75  +trace(BN*(R_P\BN')*PN*WTAATW*PN*BN*(R_P\BN')*PN*WTAATW*PN);
76 
77 res = sqrt(abs(res));
78 nres = res/sqrt(temp);
79 
80 end