Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@math/pf2ss.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/+utils/@math/pf2ss.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,110 @@ +% PF2SS Convert partial fraction models to state space matrices +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DESCRIPTION: +% +% Convert partial fraction models to state space matrices. This method +% works only for poles of multiplicity one. In case of multiple parfrac +% models they must have the same set of poles. +% +% +% CALL: +% +% [A,B,C,D] = pf2ss(pf) +% +% INPUTS: +% +% Assuming to have M pf models with N poles (common to every model) +% +% - res, vector of matrix of residuals NxM, M is the number of pf +% models +% - poles, vector of poles Nx1 +% - dterm, vector of direct terms, Mx1 +% +% OUTPUT: +% +% - A matrix +% - B matrix +% - C matrix +% - D matrix +% +% +% +% NOTE: +% +% This method works only for poles of multiplicity one. +% In case of multiple parfrac models they must have the same set of poles +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% HISTORY: 29-01-2010 L Ferraioli +% Creation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% VERSION: '$Id: vcfit.m,v 1.10 2009/04/21 10:15:35 luigi Exp $'; +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [A,B,C,D] = pf2ss(res,poles,dterm) + + [N,M]=size(res); + + % pf = varargin{:}; + % + % %%% get poles, residues and direct terms + % poles = pf(1).poles; % a common set of poles is assumed + % + % N = length(poles); + % M = numel(pf); + % + % res = zeros(N,M); % init residues matrix + % + % if size(poles,2)>1 + % poles = poles.'; + % end + % dterm = zeros(M,1); % init dterm matrix + % + % for ii=1:M + % r = pf(ii).res; + % if size(r,2)>1 + % r = r.'; + % end + % res(:,ii) = r; + % dterm(ii,1) = pf(ii).dir; + % end + + %%% Marking complex and real poles + % cindex = 1; pole is complex, next conjugate pole is marked with cindex + % = 2. cindex = 0; pole is real + cindex=zeros(1,N); + for m=1:N + if imag(poles(m))~=0 + if m==1 + cindex(m)=1; + else + if cindex(m-1)==0 || cindex(m-1)==2 + cindex(m)=1; cindex(m+1)=2; + else + cindex(m)=2; + end + end + end + end + + %%% Build SS matrices + % init matrices + A = diag(poles); + B = ones(N,M); + C = res.'; + D = dterm; + + for kk = 1:N + if cindex(kk) == 1 + A(kk,kk)=real(poles(kk)); + A(kk,kk+1)=imag(poles(kk)); + A(kk+1,kk)=-1*imag(poles(kk)); + A(kk+1,kk+1)=real(poles(kk)); + B(kk,:) = 2; + B(kk+1,:) = 0; + C(:,kk+1) = imag(C(:,kk)); + C(:,kk) = real(C(:,kk)); + end + end + +end +