0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 clear all
0012 close all
0013
0014
0015
0016
0017
0018
0019
0020 B = 0.5*[0 1 0.5];
0021 A = [1 -1.5 0.7];
0022
0023
0024 C = 0.1*[1 -1 0.9];
0025 D = [1 -0.2 0.5];
0026
0027 N = 8000;
0028 Ts = 1;
0029 fs = 1/Ts;
0030
0031
0032
0033
0034
0035
0036 na = length(A)-1;
0037 nb = length(B)-1;
0038 nu = 1;
0039 ny = 1;
0040 PlantPlane = 'z';
0041 [Sel, Theta0, ModelVar, IterVar] = MIMO_ML_DefaultValues(na, nb, nu, ny, PlantPlane);
0042 Theta0.A = A;
0043 Theta0.B(1,1,:) = B;
0044
0045
0046
0047
0048
0049
0050
0051
0052 r = rand(1, N);
0053
0054
0055 u0 = filter(A, A+B, r);
0056 y0 = filter(B, A+B, r);
0057
0058
0059 stde = 4;
0060 e = stde*randn(1, N);
0061 v = filter(conv(C, A), conv(D, A+B), e);
0062
0063
0064 u = u0 - v;
0065 y = y0 + v;
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075 data1.u = u;
0076 data1.y = y;
0077 data1.r = r;
0078 data1.Ts = 1/fs;
0079
0080
0081 method.dof = 6;
0082 method.order = 2;
0083
0084
0085 [CZ1, Z1, freq, G1, CvecG1, dof1, CL1] = ArbLocalPolyAnal(data1, method);
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 data2.u = u;
0096 data2.y = y;
0097 data2.Ts = 1/fs;
0098
0099
0100 method.dof = 6;
0101 method.order = 2;
0102
0103
0104 [CZ2, Z2, freq, G2, CvecG2, dof2, CL2] = ArbLocalPolyAnal(data2, method);
0105
0106
0107
0108
0109
0110
0111
0112
0113 data_fit1.Y = Z1.m_nt(1:ny,:);
0114 data_fit1.U = Z1.m_nt(ny+1:end,:);
0115 data_fit1.freq = freq;
0116 data_fit1.Ts = 1/fs;
0117 data_fit1.CY = CZ1.m_nt(1:ny,1:ny,:);
0118 data_fit1.CU = CZ1.m_nt(ny+1:end,ny+1:end,:);
0119 data_fit1.CYU = CZ1.m_nt(1:ny,ny+1:end,:);
0120
0121
0122
0123
0124
0125
0126
0127
0128 data_fit2.Y = Z2.m_nt(1:ny,:);
0129 data_fit2.U = Z2.m_nt(ny+1:end,:);
0130 data_fit2.freq = freq;
0131 data_fit2.Ts = 1/fs;
0132 data_fit2.CY = CZ2.m_nt(1:ny,1:ny,:);
0133 data_fit2.CU = CZ2.m_nt(ny+1:end,ny+1:end,:);
0134 data_fit2.CYU = CZ2.m_nt(1:ny,ny+1:end,:);
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 data_fit1.W = data_fit1.CY;
0145 [ThetaWTLS1, smax, smin, wscale] = MIMO_WTLS(data_fit1, Sel, ModelVar);
0146 [ThetaIQML1, CostIQML1, smax, smin, wscale] = MIMO_IQML(data_fit1, Sel, ThetaWTLS1, ModelVar, IterVar);
0147
0148
0149 [ThetaML1, CostML1, smax, smin, wscale] = MIMO_ML(data_fit1, Sel, ThetaIQML1, ModelVar, IterVar);
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159 data_fit2.W = data_fit2.CY;
0160 [ThetaWTLS2, smax, smin, wscale] = MIMO_WTLS(data_fit2, Sel, ModelVar);
0161 [ThetaIQML2, CostIQML2, smax, smin, wscale] = MIMO_IQML(data_fit2, Sel, ThetaWTLS2, ModelVar, IterVar);
0162
0163
0164 [ThetaML2, CostML2, smax, smin, wscale] = MIMO_ML(data_fit2, Sel, ThetaIQML2, ModelVar, IterVar);
0165
0166
0167
0168
0169
0170
0171
0172 data_fit1.dof = dof1;
0173 data_fit1.CY = CZ1.n(1:ny,1:ny,:);
0174 data_fit1.CU = CZ1.n(ny+1:end,ny+1:end,:);
0175 data_fit1.CYU = CZ1.n(1:ny,ny+1:end,:);
0176
0177
0178
0179 [CRbound1, GML1, ThetaML1] = MIMO_ML_CRbound(data_fit1, Sel, ThetaML1, ModelVar);
0180
0181 GML1 = squeeze(GML1);
0182 varGML1 = squeeze(CRbound1.vecG);
0183
0184
0185
0186
0187
0188
0189
0190 data_fit2.dof = dof1;
0191 data_fit2.CY = CZ2.n(1:ny,1:ny,:);
0192 data_fit2.CU = CZ2.n(ny+1:end,ny+1:end,:);
0193 data_fit2.CYU = CZ2.n(1:ny,ny+1:end,:);
0194
0195
0196
0197 [CRbound2, GML2, ThetaML2] = MIMO_ML_CRbound(data_fit2, Sel, ThetaML2, ModelVar);
0198
0199 GML2 = squeeze(GML2);
0200 varGML2 = squeeze(CRbound2.vecG);
0201
0202
0203
0204
0205
0206
0207
0208 q = exp(-sqrt(-1)*2*pi*freq/fs);
0209 G0 = polyval(fliplr(B), q) ./ polyval(fliplr(A), q);
0210 G0 = G0.';
0211
0212
0213 H0 = stde*polyval(fliplr(C), q) ./ polyval(fliplr(D), q);
0214 H0 = H0.';
0215
0216
0217 varVu_0 = abs((H0./(1+G0)).^2).';
0218 varVy_0 = abs((H0./(1+G0)).^2).';
0219
0220
0221 varY0 = abs(H0.^2).';
0222
0223
0224
0225
0226
0227
0228
0229
0230 [CovPoles0, Poles0] = CovRoots(Theta0.A, eye(na+1), Sel.A, PlantPlane, Ts);
0231
0232
0233
0234
0235
0236
0237
0238 varVy = squeeze(CZ1.n(1,1,:));
0239 varVu = squeeze(CZ1.n(2,2,:));
0240
0241
0242 varY = squeeze(CZ2.n(1,1,:));
0243
0244
0245 figure(1)
0246 subplot(211)
0247 plot(freq, db(varVu)/2, 'r', freq, db(varVu_0)/2, 'k');
0248 xlabel('Frequency (Hz)')
0249 ylabel('Input variance (dB)')
0250 title('Reference signal available: EIV solution');
0251 legend('variance estimate', 'true variance', 'Location', 'EastOutside');
0252 subplot(212)
0253 plot(freq, db(varVy)/2, 'r', freq, db(varVy_0)/2, 'k');
0254 xlabel('Frequency (Hz)')
0255 ylabel('Output variance (dB)')
0256 legend('variance estimate', 'true variance', 'Location', 'EastOutside');
0257 zoom on;
0258 shg
0259
0260
0261 figure(2)
0262 plot(freq, db(GML1), 'r', freq, db(G0), 'k', freq, db(GML1-G0), 'k--', ...
0263 freq, db(varGML1)/2, 'r--')
0264 xlabel('Frequency (Hz)')
0265 ylabel('Amplitude (dB)')
0266 legend('G-estimate', 'G_0', '|G-G_0|', 'var(G)', 'Location', 'EastOutside');
0267 title('Reference signal available: EIV solution');
0268 zoom on;
0269 shg
0270
0271
0272 figure(3)
0273 plot(freq, db(varY)/2, 'r', freq, db(varY0)/2, 'k');
0274 xlabel('Frequency (Hz)')
0275 ylabel('Output variance (dB)')
0276 title('No reference available: generalized OE solution');
0277 legend('variance estimate', 'true variance', 'Location', 'EastOutside');
0278 zoom on;
0279 shg
0280
0281
0282 figure(4)
0283 plot(freq, db(GML2), 'r', freq, db(G0), 'k', freq, db(GML2-G0), 'k--', ...
0284 freq, db(varGML2)/2, 'r--')
0285 xlabel('Frequency (Hz)')
0286 ylabel('Amplitude (dB)')
0287 legend('G-estimate', 'G_0', '|G-G_0|', 'var(G)', 'Location', 'EastOutside');
0288 title('No reference signal available: generalized OE solution');
0289 zoom on;
0290 shg
0291
0292 F = length(freq);
0293 ntheta = sum(Sel.A)+sum(sum(sum(Sel.B))+sum(sum(Sel.Ig))) - 1;
0294 Cost0 = dof1/(dof1-ny)*ny*(F-ntheta/2);
0295 stdCost0 = sqrt(3*(dof1)^3*ny/(dof1-ny)^2/(dof1-ny-1)*(F-ntheta/2));
0296 disp(['Expected value true cost, std true cost, and actual value cost: ',num2str(Cost0),', ',num2str(stdCost0),', and ',num2str(CostML1)]);
0297
0298
0299 disp('Estimates with reference signal')
0300 disp('Estim. f0 [Hz], std(f0) [Hz], estim. - true [Hz]')
0301 [ThetaML1.poles.freq, CRbound1.poles.freq.^0.5, ThetaML1.poles.freq-Poles0.freq]
0302
0303
0304 disp('Estim. damping, std(damping), estim. - true')
0305 [ThetaML1.poles.damp, CRbound1.poles.damp.^0.5, ThetaML1.poles.damp-Poles0.damp]
0306