Global Index (short | long) | Local contents | Local Index (short | long)
thc=thd2thc(th,delays,nop)
THD2THC converts a model to continuous-time form. THC = THD2THC(TH) TH: A discrete time model defined in the theta format, see also THETA. THC: The continuous-time counterpart, stored in THETA format If the model TH has extra delays from some inputs (nk>1), these are first removed. They should be appended to the continuous-time model as a pure time-delay (deadtime) (this is done by TH2FF). To have the delays approximated by THC, enter THC = THD2THC(TH,'del'); The covariance matrix P of TH is translated by the use of numerical derivatives. The step sizes used for the differences are given by the m-file nuderst. To inhibit the translation of P, which saves time, enter THC = THD2THC(TH,c,'nop'), where c is 'del' or 'nodel'. CAUTION: The transformation could be ill-conditioned. Negative real poles, poles in the origin and in 1 may cause problems. See the manual. See also THC2THD, TH2FF.
This function calls | This function is called by |
---|---|
function thc=thd2thc(th,delays,nop) % L. Ljung 10-1-86,4-20-87,8-27-94 % Copyright (c) 1986-98 by The MathWorks, Inc. % $Revision: 2.3 $ $Date: 1997/12/02 03:44:40 $ if nargin < 1 disp('Usage: THC = THD2THC(TH)') disp(' THC = THD2THC(TH,Delay_Handling)') disp(' Delay_Handling is one of ''del'', ''nodel''.') return end T=th(1,2); dif=[]; if T<=0, error('This model is already denoted as continuous time!'),end if isthss(th), thc=th;thc(1,2)=-T; if thc(2,8)==3, if ~exist('minreal') disp('WARNING: Transformation of multioutput arx-models will be supported only if you have the CONTROL SYSTEMS TOOLBOX'), end,end return,end nu=th(1,3);nk=th(1,7+2*nu:6+3*nu); nn=th(1,3:6+2*nu);na=nn(2);nb=nn(3:2+nu);nc=nn(3+nu);nddd=nn(4+nu);nf=nn(5+nu:4+2*nu); % *** Set up default values *** if nargin<3,nop=[];end if nargin<2,delays=[];end ndd=na+sum(nb)+nc+nddd+sum(nf); if isempty(delays),delays='nodel';end if delays(1)=='d',delays=0;else delays=1;end [par,P]=th2par(th); if norm(P)==0 | isempty(P) | ~isempty(nop), nkder=0;else nkder=[0:ndd];end dt=nuderst(par); for kder=nkder th1=th;if kder>0,th1(3,kder)=th(3,kder)+dt(kder);end [a,b,c,d,f]=th2poly(th1); b(nu+1,1:length(c))=c; f(nu+1,1:length(d))=d; nk(nu+1)=0;nb(nu+1)=nc+1;nf(nu+1)=nddd; ss=1; thb=[];thcc=[];thd=[];thf=[];ncn=0;ndn=0; for k=[nu+1,1:nu] den=conv(a,f(k,1:nf(k)+1)); if delays~=0,nkmod=max(nk(k),1);else nkmod=1;end num=b(k,nkmod:nb(k)+nk(k)); nd=length(den);, nn=length(num); n=max(nd,nn); de=zeros(1,n);, de(1:nd)=den; if kder==0 if abs(de(n))<eps, disp('WARNING: Pole in the origin. Result may be unreliable!'),end rp=roots(de); if any(abs(rp-1))<eps disp('WARNING: Pure integration. Result may be unreliable!'),end if any((rp==real(rp)).*(real(rp)<0)),disp('WARNING: Pole on the negative real axis. Result may be unreliable!'),end end nume=zeros(1,n);, nume(1:nn)=num; A=[-de(2:n);eye(n-2,n-1)]; % Transform to state-space B=eye(n-1,1); C=nume(2:n)-nume(1)*de(2:n); D=nume(1); s=real(logm([[A B];zeros(1,n-1) eye(1)]))/T; % Sample Ac=s(1:n-1,1:n-1); Bcc=s(1:n-1,n); ff=poly(Ac); % Transform to i/o form bb=poly(Ac-Bcc*C)+(D-1)*ff; if nk(k)>0,bb=bb(2:length(bb));nkn(ss)=1;else nkn(ss)=0;end if k<nu+1, nbn(ss)=length(bb);nfn(ss)=length(ff)-1;ss=ss+1; thb=[thb bb]; thf=[thf ff(2:length(ff))]; end if k==nu+1, ncn=length(bb)-1;ndn=length(ff)-1; thcc=bb(2:length(bb)); thd=ff(2:length(ff)); end end thh=[thb thcc thd thf]; if kder==0, [ntr,ntc]=size(th);ntcc=max([ntc length(thh)]); thc=zeros(3+length(thh),ntcc); thc(1:ntr,1:ntc)=th; thc(1,2)=-T; if nu>0,thc(1,3:6+3*nu)=[nu 0 nbn ncn ndn nfn nkn]; else thc(1,3:6)=[nu 0 ncn ndn];end thc(3,1:length(thh))=thh;thh0=thh; end if kder>0, dif(:,kder)=(thh-thh0)'/dt(kder); end end if ~isempty(dif),Pc=dif*P*dif';else Pc=zeros(length(thh),length(thh));end thc(4:length(thh)+3,1:length(thh))=Pc; if delays, thc(length(thh)+4,1:length(nk))=(max(nk,1)-1)*T;end