clear all
A=[3, 0; -3.5, -0.5]
B=[1, 1; 2, -2]
C=[1, -1]
D=[0, 0]
x0=[1; -2]

n=size(A,1) % n=numero stati
p=size(B,2) % p=numero ingressi
q=size(C,1) % q=numero uscite

% Calcolo dell'evoluzione libera dello stato xl(k)
[num_Xl,den_Xl]=ss2tf(A,x0,eye(n),zeros(n,1),1)
[r_Xl1,p_Xl1,k_Xl1]=residue(num_Xl(1,:),den_Xl)
[r_Xl2,p_Xl2,k_Xl2]=residue(num_Xl(2,:),den_Xl)

% Calcolo dell'evoluzione libera dell'uscita yl(k)
[num_Yl,den_Yl]=ss2tf(A,x0,C,zeros(q,1),1)
[r_Yl,p_Yl,k_Yl]=residue(num_Yl,den_Yl)

% Calcolo dell'evoluzione forzata dello stato xf(k)
% mediante il principio di sovrapposizione degli effetti
num_U1=2        % U1(z)/z
den_U1=[1, -1]
num_U2=3        % U2(z)/z
den_U2=[1, 0]
% effetto dell'ingresso u1(k)
[num_Xf1p,den_Xf1p]=ss2tf(A,B(:,1),eye(n),zeros(n,1),1)
% metodo alternativo
[num_Xf1p,den_Xf1p]=ss2tf(A,B,eye(n),zeros(n,p),1)
[r_Xf1,p_Xf1,k_Xf1]=residue(...
    conv(num_Xf1p(1,:),num_U1),conv(den_Xf1p,den_U1))
[r_Xf2,p_Xf2,k_Xf2]=residue(...
    conv(num_Xf1p(2,:),num_U1),conv(den_Xf1p,den_U1))

% effetto dell'ingresso u2(k)
[num_Xf2p,den_Xf2p]=ss2tf(A,B(:,2),eye(n),zeros(n,1),1)
% metodo alternativo
[num_Xf2p,den_Xf2p]=ss2tf(A,B,eye(n),zeros(n,p),2)
[r_Xf1,p_Xf1,k_Xf1]=residue(...
    conv(num_Xf2p(1,:),num_U2),conv(den_Xf2p,den_U2))
[r_Xf2,p_Xf2,k_Xf2]=residue(...
    conv(num_Xf2p(2,:),num_U2),conv(den_Xf2p,den_U2))






















