FractionOrderSystem/FOTF Toolbox/INVLAP_new.m

49 lines
1.8 KiB
Matlab

function [t,y]=INVLAP_new(G,t0,tn,N,H,tx,ux)
% INVLAP_new - updated version of INVLAP for closed-loop system with any inputs
%
% [t,y]=INVLAP_new(G,t0,tn,N)
% [t,y]=INVLAP_new(G,t0,tn,N,H)
% [t,y]=INVLAP_new(G,t0,tn,N,H,u)
% [t,y]=INVLAP_new(G,t0,tn,N,H,tx,ux)
%
% G - the string representation of the open-loop model
% t0, tn, N - the time interval and number of points in the interval
% H - the string representation of the feedback model
% u - the function handle of the input signal
% tx, ux - the samples of time and input signal
% y, t - the output and time vectors
% Copyright (c) Dingyu Xue, Northeastern University, China
% Last modified 28 March, 2017
% Last modified 18 May, 2022
arguments
G, t0(1,1), tn(1,1) {mustBeGreaterThan(tn,t0)}
N(1,1){mustBePositiveInteger}=100;
H(1,1)=0; tx='1'; ux(1,:) {mustBeNumeric}=0;
end
G=add_dots(G); if ischar(H), H=add_dots(H); end
if ischar(tx), tx=add_dots(tx); end
a=6; ns=20; nd=19; t=linspace(t0,tn,N);
if t0==0, t=[1e-6 t(2:N)]; end
n=1:ns+1+nd; alfa=a+(n-1)*pi*1j; bet=-exp(a)*(-1).^n;
n=1:nd; bet(1)=bet(1)/2;
bdif=fliplr(cumsum(gamma(nd+1)./gamma(nd+2-n)./gamma(n)))./2^nd;
bet(ns+2:ns+1+nd)=bet(ns+2:ns+1+nd).*bdif;
if isnumeric(H), H=num2str(H); end
for i=1:N
tt=t(i); s=alfa/tt; bt=bet/tt; sG=eval(G); sH=eval(H);
if ischar(tx), sU=eval(tx);
else
if isnumeric(tx)
f=@(x)interp1(tx,ux,x,'spline').*exp(-s.*x);
else, f=@(x)tx(x).*exp(-s.*x); end
sU=integral(f,t0,tn,'ArrayValued',true);
end
btF=bt.*sG./(1+sG.*sH).*sU; y(i)=sum(real(btF));
end, t=t(:); y=y(:);
end
% remove and add back dots uniformly
function F=add_dots(F)
F=strrep(strrep(strrep(F,'.*','*'),'./','/'),'.^','^');
F=strrep(strrep(strrep(F,'*','.*'),'/','./'),'^','.^');
end