0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 function varargout = assemble( varargin )
0034
0035
0036 utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]);
0037
0038
0039 if utils.helper.isinfocall(varargin{:})
0040 varargout{1} = getInfo(varargin{3});
0041 return
0042 end
0043
0044
0045 if ~(nargin==2||nargin==1), error('wrong number of inputs!'), end
0046
0047 if ~isa(varargin{1},'ssm'), error(['argument is not a ssm but a ', class(varargin{1})]),end
0048
0049 sys_array = varargin{1};
0050 Nsys = length(sys_array);
0051
0052 sys_out = ssm;
0053
0054
0055 for i=1:Nsys
0056 sys_out.paramnames = [sys_out.paramnames sys_array(i).paramnames ];
0057 sys_out.paramvalues = [sys_out.paramvalues sys_array(i).paramvalues];
0058 sys_out.paramsigmas = [sys_out.paramsigmas sys_array(i).paramsigmas];
0059 end
0060 sys_out.isnumerical = true;
0061 for i=1:Nsys
0062 sys_out.isnumerical = sys_out.isnumerical*sys_array(i).isnumerical;
0063 end
0064
0065
0066
0067 names = cell(1,0);
0068 ssnames = cell(1,0);
0069 ssvarnames = cell(1,0);
0070 ssini = zeros(0,1);
0071 sssizes = zeros(1,0);
0072 ssposition = zeros(2,0);
0073 outputnames = cell(1,0);
0074 outputvarnames = cell(1,0);
0075 outputsizes = zeros(1,0);
0076 outputposition = zeros(2,0);
0077 inputnames = cell(1,0);
0078 inputvarnames = cell(1,0);
0079 inputsizes = zeros(1,0);
0080 inputposition = zeros(2,0);
0081 for i=1:Nsys
0082 names = [names sys_array(i).name ];
0083 ssnames = [ssnames sys_array(i).ssnames ];
0084 ssvarnames = [ssvarnames sys_array(i).ssvarnames ];
0085 ssini = [ssini ; sys_array(i).ssini ];
0086 sssizes = [sssizes sys_array(i).sssizes ];
0087 ssposition = [ssposition [i*ones(1,sys_array(i).Nss) ; 1:sys_array(i).Nss] ];
0088 outputnames = [outputnames sys_array(i).outputnames ];
0089 outputvarnames = [outputvarnames sys_array(i).outputvarnames ];
0090 outputsizes = [outputsizes sys_array(i).outputsizes ];
0091 outputposition = [outputposition [i*ones(1,sys_array(i).Noutputs) ; 1:sys_array(i).Noutputs] ];
0092 inputvarnames = [inputvarnames sys_array(i).inputvarnames ];
0093 inputnames = [inputnames sys_array(i).inputnames ];
0094 inputsizes = [inputsizes sys_array(i).inputsizes ];
0095 inputposition = [inputposition [i*ones(1,sys_array(i).Ninputs) ; 1:sys_array(i).Ninputs ] ];
0096 end
0097
0098 sys_out.ssini = ssini;
0099 sys_out.ssnames = ssnames;
0100 sys_out.ssvarnames = ssvarnames;
0101 sys_out.outputnames = outputnames;
0102 sys_out.outputvarnames = outputvarnames;
0103
0104
0105 for i=1:length(names)
0106 [pos_in, sum_in] = ssm.cellstrfind(names, names{i},'all');
0107 if sum_in>1
0108 error([num2str(sum_in),' systems are named ', names{i}])
0109 end
0110 end
0111 for i=1:length(ssnames)
0112 [pos_in, sum_in] = ssm.cellstrfind(ssnames, ssnames{i},'all');
0113 if sum_in>1
0114 error([num2str(sum_in),' states are named ', ssnames{i}])
0115 end
0116 end
0117 for i=1:length(outputnames)
0118 [pos_in, sum_in] = ssm.cellstrfind(outputnames, outputnames{i},'all');
0119 if sum_in>1
0120 error([num2str(sum_in),' outputs are named ', outputnames{i}])
0121 end
0122 end
0123
0124
0125 inputisouter = false(1,length(outputnames));
0126 for i=1:length(inputnames)
0127 [pos_in, sum_in] = ssm.cellstrfind(outputnames, inputnames(i),'all');
0128 if sum_in==0
0129 inputisouter(i)=true;
0130 end
0131 end
0132
0133
0134 amats = {};
0135 mmats = {};
0136 cmats = {};
0137 for i=1:Nsys
0138 amats = ...
0139 [amats cell(size(amats,1),size(sys_array(i).amats,2)) ; ...
0140 cell(size(sys_array(i).amats,1),size(amats,2)) sys_array(i).amats ] ;
0141 mmats = ...
0142 [mmats cell(size(mmats,1),size(sys_array(i).mmats,2)) ; ...
0143 cell(size(sys_array(i).mmats,1),size(mmats,2)) sys_array(i).mmats ] ;
0144 cmats = ...
0145 [cmats cell(size(cmats,1),size(sys_array(i).cmats,2)) ; ...
0146 cell(size(sys_array(i).cmats,1),size(cmats,2)) sys_array(i).cmats ] ;
0147 end
0148 sys_out.mmats = mmats;
0149
0150
0151 B_in = cell( length(ssnames), length(outputnames) );
0152 D_in = cell( length(outputnames), length(outputnames) );
0153 for i=1:length(outputnames)
0154 [pos_in, sum_in] = ssm.cellstrfind(inputnames, outputnames{i},'all');
0155 if sum_in>0
0156 for pos = pos_in
0157 systemNumber = inputposition(1,pos);
0158 inputNumber = inputposition(2,pos);
0159 B_in(ssposition(1,:)==systemNumber, i) = sys_array(systemNumber).bmats(:,inputNumber);
0160 D_in(outputposition(1,:)==systemNumber, i) = sys_array(systemNumber).dmats(:,inputNumber);
0161 end
0162 end
0163 end
0164
0165
0166 B_ext = cell( length(ssnames), length(inputnames) );
0167 D_ext = cell( length(outputnames), length(inputnames) );
0168 pos_keep = false(1, length(inputnames));
0169 for i=1:length(inputnames)
0170 [pos_in, sum_in] = ssm.cellstrfind(outputnames, inputnames(i),'all');
0171 if sum_in==0
0172 [pos_in, sum_in] = ssm.cellstrfind(inputnames, inputnames(i),'all');
0173 for pos = pos_in;
0174 systemNumber = inputposition(1,pos);
0175 inputNumber = inputposition(2,pos);
0176 B_ext( ssposition(1,:)==systemNumber , pos_in(1) ) = sys_array(systemNumber).bmats(:,inputNumber);
0177 D_ext( outputposition(1,:)==systemNumber, pos_in(1) ) = sys_array(systemNumber).dmats(:,inputNumber);
0178 pos_keep(pos_in(1)) = true;
0179 end
0180 end
0181 end
0182
0183
0184 B_ext = B_ext(:,pos_keep);
0185 D_ext = D_ext(:,pos_keep);
0186 sys_out.inputnames = inputnames(pos_keep);
0187 sys_out.inputvarnames = inputvarnames(pos_keep);
0188
0189
0190 D_in_f = ssm.cell_fusion(D_in, outputsizes,outputsizes);
0191 id_D_inv = (eye(size(D_in_f)) - D_in_f)^-1;
0192 id_D_inv = ssm.cell_recut(id_D_inv, outputsizes, outputsizes);
0193 sys_out.amats = ssm.cell_add(amats, ssm.cell_mult(B_in, ssm.cell_mult(id_D_inv, cmats)));
0194 sys_out.bmats = ssm.cell_add(B_ext, ssm.cell_mult(B_in, ssm.cell_mult(id_D_inv, D_ext)));
0195 sys_out.cmats = ssm.cell_mult(id_D_inv, cmats);
0196 sys_out.dmats = ssm.cell_mult(id_D_inv, D_ext);
0197
0198
0199 name = 'assembled( ';
0200 for i = 1:Nsys
0201 if i==1
0202 name = [name, sys_array(i).name ];
0203 elseif i<Nsys
0204 name = [name,' + ', sys_array(i).name];
0205 else
0206 name = [name,' + ', sys_array(i).name,')'];
0207 end
0208 end
0209 name = [name ')'];
0210 sys_out.name = name;
0211
0212
0213 for i=1:Nsys
0214 if i == 1
0215 sys_out.timestep = sys_array(i).timestep;
0216 elseif ~ sys_out.timestep == sys_array(i).timestep
0217 error(['error because systems 1 and ',num2str(i),...
0218 ' named ',sys_array(i).name,' and ',sys_array(i).name,...
0219 ' have different timesteps :',...
0220 num2str(sys_array(i).timestep),' and ',num2str(sys_array(i).timestep) ]);
0221 end
0222 end
0223
0224
0225 h = history();
0226 for i=1:Nsys
0227 h(i) = sys_array(i).hist;
0228 end
0229 sys_out.addHistory(ssm.getInfo(mfilename), plist , {''}, h );
0230
0231 sys_out = validate(sys_out);
0232 varargout = {sys_out};
0233 end
0234
0235
0236 function ii = getInfo(varargin)
0237 if nargin == 1 && strcmpi(varargin{1}, 'None')
0238 sets = {};
0239 pls = [];
0240 elseif nargin == 1 && ~isempty(varargin{1}) && ischar(varargin{1})
0241 sets{1} = varargin{1};
0242 pls = getDefaultPlist(sets{1});
0243 else
0244 sets = {'Default'};
0245 pls = [];
0246 for kk=1:numel(sets)
0247 pls = [pls getDefaultPlist(sets{kk})];
0248 end
0249 end
0250
0251 ii = minfo(mfilename, 'ssm', '', 'STATESPACE', '$Id: resp.m,v 1.17 2008/07/22 10:22:38 ingo Exp $', sets, pls);
0252 end
0253
0254 function out = getDefaultPlist(set)
0255 switch set
0256 case 'Default'
0257 out = plist;
0258 otherwise
0259 error('### Unknown set [%s] to get the default plist.', set);
0260 end
0261 end