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)
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)
8 % Bernard Haasdonk 7.9.2009
10 % assuming lin_evol_model as base_model:
12 model = lin_ds_model_default;
14 model.base_model = lin_evol_model; % so access to these settings possible
17 {
'data_const_in_time',
'verbose',
'T',
'nt',...
18 'mu_names',
'mu_ranges',
'debug'};
20 for i = 1:length(copyfields)
21 model = setfield(model,copyfields{i},getfield(lin_evol_model,copyfields{i}));
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',...
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}));
44 model.A_function_ptr = @(model,model_data) ...
45 eval_affine_decomp(@A_components,...
49 model.B_function_ptr = @(model,model_data) ...
50 eval_affine_decomp(@B_components,...
54 model.C_function_ptr = @(model,model_data) ...
55 eval_affine_decomp(@C_components,...
59 model.x0_function_ptr = @(model,model_data) ...
60 eval_affine_decomp(@x0_components,...
64 model.D_function_ptr = @D_func;
65 model.u_function_ptr = @(model) 1;
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;
72 % special gen_model_data routine
73 model.gen_model_data = @lin_ds_from_lin_evol_gen_model_data;
75 % special plot routine
76 model.plot_sim_data = @lin_ds_from_lin_evol_plot_sim_data;
78 % determin model data, i.e. matrix components, matrix G
79 model.affinely_decomposed = 1;
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;
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);
91 % be sure to determine correct constants once,
if anything in the
92 % problem setting has changed!!
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);
99 model.state_bound_constant_C1 = C1;
100 model.output_bound_constant_C2 = C2;
103 lin_ds_model = model;
105 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
107 function Acomp = A_components(model,model_data)
108 Acomp = model_data.A_components;
110 function Acoeff = A_coefficients(model);
111 model.base_model.decomp_mode = 2;
112 model.base_model.t = model.t;
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;
121 function Bcomp = B_components(model,model_data)
122 Bcomp = model_data.B_components;
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;
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;
137 function Ccomp = C_components(model,model_data)
138 Ccomp = model_data.C_components;
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;
145 %model.base_model = model.base_model.set_mu(model.base_model,mu);
147 model.base_model.operators_output(model.base_model,[]);
149 function res = D_func(model,model_data);
150 res = zeros(model.dim_y, model.dim_u);
152 function x0comp = x0_components(model,model_data)
153 x0comp = model_data.x0_components;
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;
160 %model.base_model = model.base_model.set_mu(model.base_model,mu);
161 res = model.base_model.init_values_algorithm(model.base_model,[]);
163 function model = set_mu_with_base_model(model,mu)
164 model.base_model = model.base_model.set_mu(model.base_model,mu);
166 model = set_mu_default(model,mu);
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);