rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
lin_ds_from_lin_evol_model.m
1 function lin_ds_model = lin_ds_from_lin_evol_model(lin_evol_model)
2 %function lin_ds_model = lin_ds_from_lin_evol_model(lin_evol_model)
3 %
4 % construction of lin_ds_model from lin_evol_model,
5 % assuming that implicit matrix is not parameter dependent and
6 % can be multiplied inversely to right-hand side matrix (==Id)
7 
8 % Bernard Haasdonk 7.9.2009
9 
10 % assuming lin_evol_model as base_model:
11 
12 model = lin_ds_model_default;
13 
14 model.base_model = lin_evol_model; % so access to these settings possible
15 
16 copyfields = ...
17  {'data_const_in_time','verbose','T','nt',...
18  'mu_names','mu_ranges','debug'};
19 
20 for i = 1:length(copyfields)
21  model = setfield(model,copyfields{i},getfield(lin_evol_model,copyfields{i}));
22 end;
23 
24 if_exists_copyfields = ...
25  {'save_time_indices',...
26  'state_bound_constant_C1',...
27  'output_bound_constant_C2',...
28  'estimate_lin_ds_nmu',...
29  'estimate_lin_ds_nX',....
30  'estimate_lin_ds_nt',...
31  'error_estimation',...
32  'RB_generation_mode',...
33  'RB_num_intervals'...
34  };
35 
36 for i = 1:length(if_exists_copyfields)
37  if isfield(lin_evol_model,if_exists_copyfields{i})
38  model = setfield(model,if_exists_copyfields{i},...
39  getfield(lin_evol_model, ...
40  if_exists_copyfields{i}));
41  end;
42 end;
43 
44 model.A_function_ptr = @(model,model_data) ...
45  eval_affine_decomp(@A_components,...
46  @A_coefficients,...
47  model,model_data);
48 
49 model.B_function_ptr = @(model,model_data) ...
50  eval_affine_decomp(@B_components,...
51  @B_coefficients,...
52  model,model_data);
53 
54 model.C_function_ptr = @(model,model_data) ...
55  eval_affine_decomp(@C_components,...
56  @C_coefficients,...
57  model,model_data);
58 
59 model.x0_function_ptr = @(model,model_data) ...
60  eval_affine_decomp(@x0_components,...
61  @x0_coefficients,...
62  model,model_data);
63 
64 model.D_function_ptr = @D_func;
65 model.u_function_ptr = @(model) 1;
66 
67 model.set_mu = @set_mu_with_base_model;
68 mu = lin_evol_model.get_mu(lin_evol_model);
69 model = model.set_mu(model,mu);
70 model.set_time = @set_time_with_base_model;
71 
72 % special gen_model_data routine
73 model.gen_model_data = @lin_ds_from_lin_evol_gen_model_data;
74 
75 % special plot routine
76 model.plot_sim_data = @lin_ds_from_lin_evol_plot_sim_data;
77 
78 % determin model data, i.e. matrix components, matrix G
79 model.affinely_decomposed = 1;
80 
81 model.dim_u = 1;
82 model.dim_y = 1;
83 
84 %model_data = gen_model_data(model); % store matrix components
85 %model.dim_x = size(model_data.A_components{1},1);
86 model.dim_x = lin_evol_model.dim_U;
87 
88 %model.get_estimator_from_sim_data = @(sim_data) sim_data.DeltaX(end);
89 % ds_model.get_estimator_from_sim_data = @(sim_data) sim_data.DeltaY(end);
90 
91 % be sure to determine correct constants once, if anything in the
92 % problem setting has changed!!
93 
94 if ~(isfield(model,'state_bound_constant_C1') & ...
95  isfield(model,'output_bound_constant_C2'))
96  disp('estimating coefficients...');
97  [C1,C2] = lin_ds_estimate_bound_constants(model,model_data);
98  disp('...finished');
99  model.state_bound_constant_C1 = C1;
100  model.output_bound_constant_C2 = C2;
101 end;
102 
103 lin_ds_model = model;
104 
105 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
106 
107 function Acomp = A_components(model,model_data)
108 Acomp = model_data.A_components;
109 
110 function Acoeff = A_coefficients(model);
111 model.base_model.decomp_mode = 2;
112 model.base_model.t = model.t;
113 %mu = get_mu(model);
114 %model.base_model = model.base_model.set_mu(model.base_model,mu);
115 [L_I_coeff, L_E_coeff, b_coeff] = ...
116  model.base_model.operators_ptr(model.base_model, []);
117 % L_E = Id + Delta t * A
118 Acoeff = L_E_coeff(2:end)/model.base_model.dt;
119 %keyboard;
120 
121 function Bcomp = B_components(model,model_data)
122 Bcomp = model_data.B_components;
123 
124 function Bcoeff = B_coefficients(model);
125 % hmmm the coefficients are now called twice in A and B
126 % should somehow be cached later...
127 model.base_model.decomp_mode = 2;
128 % base_model.t should be correctly set by set_time of model...
129 %model.base_model.t = model.t;
130 %mu = get_mu(model);
131 %model.base_model = model.base_model.set_mu(model.base_model,mu);
132 [L_I_coeff, L_E_coeff, b_coeff] = ...
133  model.base_model.operators_ptr(model.base_model, []);
134 % L_E = Id + Delta t * A
135 Bcoeff = b_coeff/model.base_model.dt;
136 
137 function Ccomp = C_components(model,model_data)
138 Ccomp = model_data.C_components;
139 
140 function Ccoeff = C_coefficients(model);
141 model.base_model.decomp_mode = 2;
142 % base_model.t should be correctly set by set_time of model...
143 %model.base_model.t = model.t;
144 %mu = get_mu(model);
145 %model.base_model = model.base_model.set_mu(model.base_model,mu);
146 Ccoeff = ...
147  model.base_model.operators_output(model.base_model,[]);
148 
149 function res = D_func(model,model_data);
150 res = zeros(model.dim_y, model.dim_u);
151 
152 function x0comp = x0_components(model,model_data)
153 x0comp = model_data.x0_components;
154 
155 function res = x0_coefficients(model);
156 model.base_model.decomp_mode = 2;
157 % base_model.t should be correctly set by set_time of model...
158 %model.base_model.t = model.t;
159 %mu = get_mu(model);
160 %model.base_model = model.base_model.set_mu(model.base_model,mu);
161 res = model.base_model.init_values_algorithm(model.base_model,[]);
162 
163 function model = set_mu_with_base_model(model,mu)
164 model.base_model = model.base_model.set_mu(model.base_model,mu);
165 
166 model = set_mu_default(model,mu);
167 
168 function model = set_time_with_base_model(model,time)
169 model.base_model = model.base_model.set_time(model.base_model,time);
170 model = set_time_default(model,time);
171 
172 
173 
174 
175 
176 
177 
178 
179