2 % script comparing weak and strong POD-
Greedy on lin_evol
default
6 % * strong POD-
Greedy: longer runtime, better quality than
7 % weak-POD-
Greedy for same training set
8 % * weak-POD-
Greedy on larger train set:
9 % faster than coarser strong POD-
Greedy
10 % better tes quality than coarser strong POD-
Greedy
12 % B. Haasdonk 1.10.2012
20 strong_PODGreedy_fn =
'strong_PODGreedy_fn.mat';
21 weak_coarse_PODGreedy_fn =
'weak_coarse_PODGreedy_fn.mat';
22 weak_fine_PODGreedy_fn =
'weak_fine_PODGreedy_fn.mat';
23 weak_finer_PODGreedy_fn =
'weak_finer_PODGreedy_fn.mat';
30 case 1 % basis generation by strong POD-
Greedy
32 disp(
'--------------------------------------')
33 disp('performing strong POD-
Greedy procedure');
34 model.RB_numintervals = [2,2,2];
35 % compute 150 basis vectors
36 model.RB_stop_Nmax = coarse_Nmax;
37 model.RB_stop_epsilon = 0;
38 model.RB_error_indicator = 'projection-error';
39 model.RB_detailed_train_savepath = ...
40 fullfile('PODgreedy_exp_train');
42 if exist(fullfile(rbmatlabtemp,model.RB_detailed_train_savepath))
43 disp('deleting old training data for correct timing measurement');
44 delete(fullfile(rbmatlabtemp,model.RB_detailed_train_savepath,'*.*'));
45 rmdir(fullfile(rbmatlabtemp,model.RB_detailed_train_savepath));
48 model_data = gen_model_data(model);
51 % detailed_data.RB_info.computation_time
53 disp(['basis_generation time: ',num2str(t),' sec.']);
54 detailed_data.RB_info.basis_generation_time = t;
55 save(strong_PODGreedy_fn,'model','detailed_data');
57 case 2 % basis generation by weak coarse and weak fine POD-
Greedy
59 % using beta = const, gamma = const
61 disp('-------------------------------------------')
62 disp('performing weak coarse POD-
Greedy procedure');
63 % compute 125 trajectories
64 model.RB_numintervals = [2,2,2];
65 % compute 150 basis vectors
66 model.RB_stop_Nmax = fine_Nmax;
67 model.RB_stop_epsilon = 0;
68 model.RB_error_indicator = 'estimator';
69 model.error_norm = 'l2l2';
70 model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
71 disp('warning: inf-sup-constant set to 1, unrealistic! ');
73 model_data = gen_model_data(model);
76 % detailed_data.RB_info.computation_time
78 disp(['basis_generation time: ',num2str(t),' sec.']);
79 detailed_data.RB_info.basis_generation_time = t;
80 save(weak_coarse_PODGreedy_fn,'model','detailed_data');
83 disp('-------------------------------------------')
84 disp('performing weak fine POD-
Greedy procedure');
86 model.RB_numintervals = [4,4,4];
88 detailed_data = gen_detailed_data(model,model_data);
89 % detailed_data.RB_info.computation_time
91 disp(['basis_generation time: ',num2str(t),' sec.']);
92 detailed_data.RB_info.basis_generation_time = t;
93 save(weak_fine_PODGreedy_fn,'model','detailed_data');
97 % using beta = const, gamma = const
99 disp('-------------------------------------------')
100 disp('performing weak finer POD-
Greedy procedure');
101 % compute 9^3 trajectories
102 model.RB_numintervals = [6,6,6];
103 model.RB_stop_Nmax = finer_Nmax;
104 model.RB_stop_epsilon = 0;
105 model.RB_error_indicator = 'estimator';
106 model.error_norm = 'l2l2';
107 model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
108 disp('warning: inf-sup-constant set to 1, unrealistic! ');
110 model_data = gen_model_data(model);
112 detailed_data = gen_detailed_data(model,model_data);
113 % detailed_data.RB_info.computation_time
115 disp(['basis_generation time: ',num2str(t),' sec.']);
116 detailed_data.RB_info.basis_generation_time = t;
117 save(weak_finer_PODGreedy_fn,'model','detailed_data');
119 case 3 % compare offline runtimes
121 disp('--------------------------------------')
122 disp('comparing runtimes');
123 tmp = load(strong_PODGreedy_fn);
124 tstrong = tmp.detailed_data.RB_info.basis_generation_time
125 tmp = load(weak_coarse_PODGreedy_fn);
126 tweakcoarse = tmp.detailed_data.RB_info.basis_generation_time
127 tmp = load(weak_fine_PODGreedy_fn);
128 tweakfine = tmp.detailed_data.RB_info.basis_generation_time
129 tmp = load(weak_finer_PODGreedy_fn);
130 tweakfiner = tmp.detailed_data.RB_info.basis_generation_time
132 case 4 % determine relative RB-test-error decay: 50 random points
134 % 50 random trajectories
137 RandStream.setDefaultStream(RandStream('mt19937ar','seed',100000));
138 Mtest = rand_uniform(Ntest,model.mu_ranges);
139 test_savepath = 'PODGreedy_test';
141 fns = {strong_PODGreedy_fn,weak_coarse_PODGreedy_fn,...
142 weak_fine_PODGreedy_fn, weak_finer_PODGreedy_fn};
143 Nmax = [coarse_Nmax,coarse_Nmax,fine_Nmax,finer_Nmax];
145 model_data = gen_model_data(model);
147 test_errs = cell(1,length(fns));
148 Nss = cell(1,length(fns));
149 for s = 1:length(fns)
150 Nss{s} = 5:5:Nmax(s);
153 Nrb = size(tmp.detailed_data.RB,2);
155 Nss{s} = [Nss{s}, Nrb];
160 save(
'PODGreedy_test_step4');
164 linestyles = {
'b',
'r',
'r',
'r'};
165 load(
'PODGreedy_test_step4');
168 %
for s = 1:length(fns);
170 plot(Nss{s},test_errs{s},linestyles{s});
173 % legend({
'strong POD-Greedy, coarse',
'weak POD-Greedy, coarse',...
174 %
'weak POD-Greedy, fine',
'weak POD-Greedy, finer'});
175 legend({
'weak POD-Greedy'});
178 set(gca,
'Yscale',
'log');
179 disp(
'please adjust plot');
180 title(
'maximum relative test rb-error',
'Fontsize',15);
181 xlabel(
'dimension N',
'Fontsize',15);
182 ylabel(
'rb-error',
'Fontsize',15);
183 c =
get(gca,
'children');
184 set(c(:),
'Linewidth',2)
185 set(gca,'Fontsize',15)
186 save('PODGreedy_test')
187 saveas(gcf,'PODGreedy_relative_test_rb_error.png')
192 plot_detailed_data(model,detailed_data);
194 plot_params.no_lines = 1;
195 plot_params.show_colorbar = 0;
196 plot_params.axis_equal = 1;
198 model.plot(detailed_data.grid,detailed_data.RB(:,i),plot_params);
200 saveas(gcf,[
'basis_func',num2str(i),
'.png']);
205 case 5 % determine relative projection-test-error decay: 50 random points
208 model_data = gen_model_data(model);
210 RandStream.setDefaultStream(RandStream(
'mt19937ar',
'seed',100000));
211 Mtest = rand_uniform(Ntest,model.mu_ranges);
212 test_savepath =
'PODGreedy_test';
214 % fns = {strong_PODGreedy_fn,weak_coarse_PODGreedy_fn,...
215 % weak_fine_PODGreedy_fn, weak_finer_PODGreedy_fn};
216 % Nmax = [coarse_Nmax,coarse_Nmax,fine_Nmax,finer_Nmax];
217 fns = {weak_fine_PODGreedy_fn};
221 test_errs = cell(1,length(fns));
222 Nss = cell(1,length(fns));
223 for s = 1:length(fns)
224 Nss{s} = 5:5:Nmax(s);
227 Nrb = size(tmp.detailed_data.RB,2);
229 Nss{s} = [Nss{s}, Nrb];
233 model,model_data,fns{s},Nss{s},Mtest);
235 save(
'PODGreedy_test_step5');
239 load(
'PODGreedy_test_step5');
241 for s = 1:length(fns);
242 plot(Nss{s},test_errs{s},linestyles{s});
245 % legend({
'strong POD-Greedy, coarse',
'weak POD-Greedy, coarse',...
246 %
'weak POD-Greedy, fine',
'weak POD-Greedy, finer'});
247 legend({
'weak POD-Greedy'});
248 set(gca,
'Yscale',
'log');
249 c =
get(gca,
'children');
250 set(c(:),
'Linewidth',2)
251 set(gca,'Fontsize',15)
252 title('maximum relative test projection error ','Fontsize',15);
253 xlabel('dimension N','Fontsize',15);
254 ylabel('projection error','Fontsize',15);
255 disp('please adjust plot');
256 save('PODGreedy_projection_test')
257 saveas(gcf,'PODGreedy_relative_test_projection_error.png')
260 %case 6 % determine train-error decay: only reasonable if identical
267 error('step unknown')
270 function errs = compute_test_errs(fn,Ns,Mtest,test_savepath)
273 model.relative_error = 1;
274 model.error_norm = 'l2l2';
275 model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
276 detailed_data = tmp.detailed_data;
277 reduced_data = gen_reduced_data(model,detailed_data);
278 errs = zeros(1,length(Ns));
279 for Ni = 1:length(Ns)
281 tmp_model.N = Ns(Ni);
282 tmp_reduced_data = model.reduced_data_subset(tmp_model,reduced_data);
283 test_errs = rb_test_error(model,detailed_data,...
284 tmp_reduced_data,Mtest,test_savepath);
285 errs(Ni) = max(test_errs);
289 function errs = compute_test_projection_errs(model,model_data,fn,Ns,Mtest);
291 detailed_data = tmp.detailed_data;
293 %model.relative_error = 1;
294 %model.error_norm = 'l2l2';
295 %model.inf_sup_beta_lower_bound = @(model) 1; % note, this is wrong!
296 %detailed_data = tmp.detailed_data;
297 %reduced_data = gen_reduced_data(model,detailed_data);
298 errs = zeros(1,length(Ns));
299 for i = 1:length(Mtest);
300 model = set_mu(model,Mtest(:,i));
303 test_errs = zeros(length(Ns),length(Mtest));
304 for Ni = 1:length(Ns)
305 proj_sol = detailed_data.RB(:,1:Ns(Ni))*...
306 (detailed_data.RB(:,1:Ns(Ni))' * detailed_data.W) * sim_data.U;
307 er = fv_l2l2_error(sim_data.U,proj_sol, ...
308 detailed_data.W,model);
309 test_errs(Ni,i) = er(end);
312 errs = max(test_errs,[],2);
function varargout = filecache_function(funcptr, varargin)
function used for file-caching other function calls.
function model = convdiff_model(dummy)
function creating a simple model for a linear convection diffusion problem
function res = weak_strong_POD_Greedy_comp(step)
script comparing weak and strong POD-Greedy on lin_evol default example
Customizable implementation of an abstract greedy algorithm.