Home > classes > @ssm > ssmFromPzmodel.m

ssmFromPzmodel

PURPOSE ^

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SYNOPSIS ^

function ssmout = ssmFromPzmodel(pzmodelsin)

DESCRIPTION ^

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 FUNCTION:    ssmFromPzmodel

 DESCRIPTION: Construct a statespace model from a pzmodel

 CALL:        see ssm

 PARAMETER:   

 HISTORY:     15-04-2008 Adrien
              Creation

 TODO:      

 VERSION :    '$Id: test_ssm_constructor.m,v 1.7 2008/06/13 22:36:18 adrien Exp $';
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0002 %
0003 % FUNCTION:    ssmFromPzmodel
0004 %
0005 % DESCRIPTION: Construct a statespace model from a pzmodel
0006 %
0007 % CALL:        see ssm
0008 %
0009 % PARAMETER:
0010 %
0011 % HISTORY:     15-04-2008 Adrien
0012 %              Creation
0013 %
0014 % TODO:
0015 %
0016 % VERSION :    '$Id: test_ssm_constructor.m,v 1.7 2008/06/13 22:36:18 adrien Exp $';
0017 %
0018 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0019 function ssmout = ssmFromPzmodel(pzmodelsin)
0020 utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]);
0021 
0022 ssmout(1,length(pzmodelsin))=ssm;
0023 for i_pzms=1:length(pzmodelsin)
0024   a = 1;
0025   b = 1;
0026   for i=1:length(pzmodelsin(i_pzms).poles)
0027     if isnan(pzmodelsin(i_pzms).poles(i).q)
0028       w0 = pzmodelsin(i_pzms).poles(i).f*2*pi ;
0029       a = conv(a,[1 -w0]);
0030     else
0031       q = pzmodelsin(i_pzms).poles(i).q;
0032       w0 = 2*pi*pzmodelsin(i_pzms).poles(i).f;
0033       p = [1, -1/q*w0 w0^2];
0034       a = conv(a,p);
0035     end
0036   end
0037   for i=1:length(pzmodelsin(i_pzms).zeros)
0038     if isnan(pzmodelsin(i_pzms).zeros(i).q)
0039       w0 = pzmodelsin(i_pzms).zeros(i).f*2*pi ;
0040       b = conv(b,[1 -w0]);
0041     else
0042       q = pzmodelsin(i_pzms).zeros(i).q;
0043       w0 = 2*pi*pzmodelsin(i_pzms).zeros(i).f;
0044       p = [1, -1/q*w0 w0^2];
0045       b = conv(b,p);
0046     end
0047   end
0048   ssmout = ssm();
0049 
0050   num = b*pzmodelsin(i_pzms).gain;
0051   den = a;
0052   Nss = length(den)-1;
0053   if length(num)<Nss+1
0054     num = [zeros(1,Nss+1-length(num)) num];
0055   end
0056   [q,r] = deconv(num,den);%polynmial division for den = conv(num,q)+r .
0057   if ~length(q)==1
0058     error('system may be non caussal');
0059   end
0060 
0061   ssmout(i_pzms).dmats = {q};
0062   ssmout(i_pzms).amats = {[zeros(Nss-1,1) eye(Nss-1); fliplr(-den(2:(Nss+1)))]};
0063   ssmout(i_pzms).bmats = {[zeros(Nss-1,1) ;1]};
0064   ssmout(i_pzms).cmats = {r(2:(Nss+1))};
0065 
0066   ssmout(i_pzms).name  = pzmodelsin(i_pzms).name;
0067   ssmout(i_pzms).timestep = 0;
0068   ssmout(i_pzms).inputnames = {'U'};
0069   ssmout(i_pzms).outputnames = {'Y'};
0070   ssmout(i_pzms).addHistory(ssm.getInfo('ssm', 'From Pzmodel'), plist(), {''}, pzmodelsin(i_pzms).hist);
0071 end
0072 
0073 
0074 end

Generated on Mon 08-Sep-2008 13:18:47 by m2html © 2003