rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
vi_detailed_simulation.m
1 function sim_data = vi_detailed_simulation(model,model_data)
2 %function sim_data = vi_detailed_simulation(model,model_data)
3 %
4 % function performing a detailed simulation of a vi-model (see
5 % elastic_rope_model) via "quadprog".
6 %
7 % Generated fields of sim_data:
8 % U: primal solution vector
9 % L: Lagrange multiplier vector
10 
11 % I.Maier 30.05.2011
12 
13 if ~isfield(model,'use_PDASS')
14  model.use_PDASS = 1;
15 end
16 
17 sim_data = [];
18 
19 model.decomp_mode = 0;
20 [A,B,f,g] = model.operators(model,model_data);
21 
22 
23 if ~model.use_PDASS
24 warning off
25 options = optimset;
26 %options.TolFun = 0;
27 options.MaxIter = 1000; % required for large bases...
28 options.Display = 'off';
29 sim_data.U = quadprog(A,-f,B',g,[],[],[],[],[],options);
30 warning on
31 
32 sim_data.L = max(0, B\(f - A*sim_data.U) );
33 else
34  [sim_data.U,sim_data.L] = pdass(A, B, f, g);
35 end
36 
37 
38 
39 
40 
41 %Primal-Dual-Active-Set_Strategy. Taken from Juliens RBVI Code
42 function [U,Lambda] = pdass(A, B, f, g)
43 tol = 1e-8;
44 H = size(A,1);
45 index = 1:H;
46 err = 1;
47 U = -ones(H,1);
48 Lambda = ones(H,1);
49 c = 1;
50 i = 1;
51 
52 while err>tol
53 
54  i = i+1;
55  Act_set = index(Lambda+c*(B'*U-g)> 0); %vorher: ohne c
56  Inact_set = index(Lambda+c*(B'*U-g)<=0); %vorher: ohne c
57  %----Active points----
58  U(Act_set) = -g(Act_set) ;
59  Lambda(Inact_set) = 0 ;
60  %---Inactive points---
61  M = [A(:,Inact_set) , B(:,Act_set)];
62  Bg = B*g;
63  if size(Act_set,2)>0
64  var = M\(f-A(:,Act_set)*Bg(Act_set)); ... % var = inv(M)*(f-A(:,Act_set)*Bg(Act_set)); ...
65  else
66  var = M\f; %var = inv(M)*f;
67  end
68  U(Inact_set) = var(1:length(Inact_set) );
69  Lambda(Act_set) = var(length(Inact_set)+1:end);
70  %---------------------
71  err1 = norm(A*U+B*Lambda-f);
72  err2 = norm(Lambda-max(0,Lambda+c*(B'*U-g)));
73  err = err1+err2;
74 
75 
76  if i > 1000
77  error('PDASS did not converge within 1000 steps. Please Check');
78  end
79 end