1 function hp_model = hp_elliptic( hp_model,model_data )
2 %
function hp_model = hp_elliptic( hp_model,model_data )
4 % compute a h-refinment and rb generation
for elliptic problems
6 % Generierung des Trainingssets
7 rand(
'state',hp_model.base_model.RB_train_rand_seed);
8 %neue Eigenschaft model.training (benötigt für
9 %Basisgenerierungsprogramm)
10 hp_model.base_model.training = [];
11 hp_model.base_model.training = rand_uniform(hp_model.base_model.RB_train_size,...
12 hp_model.base_model.mu_ranges);
16 % Erstes eintrag im Baum manuell erstellen
17 hp_model.tree = leaf();
18 hp_model.tree.anchor = [1;1]; %!!! nicht immer gültig
19 hp_model.tree.model =hp_model.base_model;
20 hp_model.tree.training = hp_model.base_model.training;
23 littletree = hp_model.tree.anchor;
25 hp_model.tree = hRB(hp_model.tree);
27 % Rekursive funktion zum HP_Baum Aufbau
28 % struktur der Anker im Baum werden in littletree (global!)
29 % mitgeschrieben um die Funktion part_of_domain zu ermöglichen
30 % Diese ist Teil der Traingssetverfeinerung
32 function tree_out = hRB(tree_in)
34 % start with greedy und basisgenerierung
35 tree_in.model.training = [tree_in.anchor,tree_in.model.training];
36 tree_in.detailed_data = gen_detailed_data(tree_in.model, model_data);
39 % Wegen error < errtol
40 if tree_in.detailed_data.RB_info.stopped_on_Nmax == 0
41 % error<errtol dann Passt alles
43 % Basis und parameter speichern
44 tree_in.parameters = tree_in.detailed_data.RB_info.mu_sequence(:,2:end);
45 tree_in.reduced_data = gen_reduced_data(hp_model.base_model,tree_in.detailed_data);
47 % Basisgenerierung für Gebiet Abgeschlossen
51 % Falls error>errortol -> splitten!
54 % Erzeuge neue Blätter
57 % Vererbung von Eigeschaften
58 child_right.model = tree_in.model;
59 child_left.model = tree_in.model;
62 % Linker Zweig Erbt den Anker vom Elternzweig
63 child_left.anchor = tree_in.anchor;
64 % Rechte Zweig enthält den ersten neuen greedygefundenen Parameter
65 for i=3:child_left.model.RB_train_size
66 if ~isequal(child_left.anchor,tree_in.detailed_data.RB_info.mu_sequence(:,i))
67 child_right.anchor = tree_in.detailed_data.RB_info.mu_sequence(:,i);
72 % Anker als ersten (wichtig) Eintrag in das neue Trainingsset
74 child_right.model.training = child_right.anchor;
75 child_left.model.training = child_left.anchor;
80 % Aufteilen des Elterntrainigsset auf die Kinder
81 % hier kommt die d-Funktion zum einsatz
82 leng = length(tree_in.model.training(1,:));
85 if ~isequal(tree_in.model.training(:,i),child_right.anchor) && ~isequal(tree_in.model.training(:,i),child_left.anchor)
86 distance_l=hp_model.distance_function(child_left.model,child_left.anchor,tree_in.model.training(:,i));
87 distance_r=hp_model.distance_function(child_right.model,child_right.anchor,tree_in.model.training(:,i)) ;
89 if distance_l<distance_r
90 child_left.model.training = [child_left.model.training, tree_in.model.training(:,i)];
92 child_right.model.training = [child_right.model.training, tree_in.model.training(:,i)];
97 % Protrkolliert die Änderungen in dem kleinen Baum mit.
98 littletree=change_littletree(littletree,tree_in.anchor,child_right.anchor);
100 % Trainingsset verfeinern
101 % mittels accept-reject Monte Carlo
104 %boundarybox erstellen:
105 switch hp_model.trainingset_generation_mode
107 %boundarybox erstellen:
108 param_min = min(child_left.model.training');
109 param_max = max(child_left.model.training');
110 l = max(param_max-param_min);
111 t = size(child_left.model.training);
112 if isempty(l) || min(l) == 0 || t(2) <= 1
113 box_ranges = child_left.model.mu_ranges;
116 param_max=param_max+max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
117 param_min=param_min-max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
118 box_ranges = cell2mat(child_left.model.mu_ranges')';
121 param_min = max([param_min;box_ranges(1,:)]);
122 param_max = min([param_max;box_ranges(2,:)]);
124 box_ranges = mat2cell([param_min;param_max]',ones(1,length(param_min)));
129 box_ranges = child_left.model.mu_ranges;
131 box_ranges = child_left.model.mu_ranges;
136 while length(child_left.model.training) < child_left.model.RB_train_size
138 parameter = rand_uniform(1,box_ranges);
139 if part_of_domain(littletree,child_left.anchor,parameter,child_left.model)==1
140 child_left.model.training = [child_left.model.training,parameter ];
146 %boundarybox erstellen:
147 switch hp_model.trainingset_generation_mode
149 %boundarybox erstellen:
150 param_min = min(child_right.model.training');
151 param_max = max(child_right.model.training');
152 l = max(param_max-param_min);
153 t=size(child_right.model.training);
154 if isempty(l) || min(l) == 0 || t(2) <= 1
155 box_ranges = child_right.model.mu_ranges;
158 param_max=param_max+max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
159 param_min=param_min-max(l,hp_model.boundarybox_minimum)*hp_model.boundarybox_factor;
160 box_ranges = cell2mat(child_right.model.mu_ranges')';
163 param_min = max([param_min;box_ranges(1,:)]);
164 param_max = min([param_max;box_ranges(2,:)]);
166 box_ranges = mat2cell([param_min;param_max]',ones(1,length(param_min)));
173 box_ranges = child_left.model.mu_ranges;
175 box_ranges = child_left.model.mu_ranges;
181 while length(child_right.model.training) < child_right.model.RB_train_size
183 parameter = rand_uniform(1,box_ranges);
184 if part_of_domain(littletree,child_right.anchor,parameter,child_right.model)==1
185 child_right.model.training = [child_right.model.training,parameter ];
192 % Alter Algorithmus zur generierung des Traingssets
193 % Sehr schnell aber nicht optimal in der gleichverteilung
195 % Traingsset verfeinern durch zufälige Punkte im Dreieck aus
196 % zufälligen Eckpunkten
199 % size_left = length(child_left.model.training(1,:));
200 % size_right = length(child_right.model.training(1,:));
201 % for i=1:(child_left.model.RB_train_size-size_left)
202 % % Zufällige Eckpunkte
203 % rand1 = randi(size_left+i-1,1);
204 % rand2 = randi(size_left+i-1,1);
205 % rand3 = randi(size_left+i-1,1);
208 % rand5 = rand(1)*(1-rand4);
210 % newpoint = child_left.model.training(:,rand1) + rand4*(child_left.model.training(:,rand2)-child_left.model.training(:,rand1))+rand5*(child_left.model.training(:,rand3)-child_left.model.training(:,rand1));
211 % child_left.model.training = [child_left.model.training,newpoint ];
214 % for i=1:(child_right.model.RB_train_size-size_right)
215 % % Zufällige Eckpunkte
216 % rand1 = randi(size_right+i-1,1);
217 % rand2 = randi(size_right+i-1,1);
218 % rand3 = randi(size_right+i-1,1);
221 % rand5 = rand(1)*(1-rand4);
223 % newpoint = child_right.model.training(:,rand1) + rand4*(child_right.model.training(:,rand2)-child_right.model.training(:,rand1))+rand5*(child_right.model.training(:,rand3)-child_right.model.training(:,rand1));
224 % child_right.model.training = [child_right.model.training,newpoint ];
227 child_left.training = child_left.model.training;
228 child_right.training = child_right.model.training;
230 % Rekrusiver Aufruf der neuen Einträge
231 % mit Cells wird ein Baum erzeugt.
232 tree_out={hRB(child_left),hRB(child_right)};
237 %Aktuallisiert die Änderungen bei dem Baume mit der Ankerstruktur
238 function tree_out = change_littletree(tree_in,para_expand,para_add)
241 tree_in{1} = change_littletree(tree_in{1},para_expand,para_add);
242 tree_in{2} = change_littletree(tree_in{2},para_expand,para_add);
245 if isequal(tree_in,para_expand)
246 tree_out = {tree_in,para_add};
255 function is = part_of_domain(ltree, anchor,param,model)
256 test = iscell(ltree);
259 % Representanten bestimmen
260 first_l=littletree_first(ltree{1});
261 first_r=littletree_first(ltree{2});
262 % Mit d-Funktion naviagtion durchführen
263 distance_l = model.distance_function(model,first_l,param);%norm(first_l-param,2);
264 distance_r = model.distance_function(model, first_r,param);%norm(first_r-param,2);
265 % Unterbaum finden und Rekursiv vortfahren
266 if distance_l<distance_r
267 is = part_of_domain(ltree{1}, anchor,param,model);
269 is = part_of_domain(ltree{2}, anchor,param,model);
272 % im passenden Gebiet angekommen - RB Simulation durchführen
274 if isequal(ltree,anchor)
284 function value= littletree_first (test)
287 value=littletree_first(test{1});