//===============================================================
// Scilab como herramienta en Sistemas y Control
//===============================================================

//===============================================================
// PARTE 1
//===============================================================

//
// Definiendo una funcion de transferencia en general
//
// Funcion de transferencia de lazo abierto del sistema
// H(s) =   1/ s(s+2)(s+4)
//

// Definiendo H en funcion de sus polos

H1 = poly([ 0 -2 -4],"s", ["roots"]) 

H = 1/H1

pause

// Definiendo H en forma simbolica

s=poly(0,"s") // Polinomio generico s

H =   1/ (s*(s+2)*(s+4))

pause

// Otra forma
H1 =   1/ s

H2=   1/ (s+2)

H3=   1/(s+4)

H=H1*H2*H3 

pause

// Definiendo el sistema lineal cuya funcion de transferencia es H

[sist_test]=syslin('c',H)   

// Hallando el LGR (Lugar Geometrico de las Raices)

evans(sist_test)

pause

evans(sist_test,100)
pause


g=kpure(sist_test) // Maxima ganancia para tener raices sobre el eje imaginario
evans(sist_test,max(g))

pause

//===============================================================
// Respuesta en el dominio de la frecuencia
//===============================================================


//===============================================================
// Diagrama de Bode 
//===============================================================

[ frq repf]=repfreq(sist_test,0.001, 1000)

[db,phi]=dbphi(repf)

subplot(2,1,1)
plot2d(frq,db,logflag="ln")  
xtitle('Magnitud')

subplot(2,1,2)
plot2d(frq,db,logflag="ln")  
xtitle('Angulo')

pause


bode(sist_test)

pause

//===============================================================
// Diagrama de Nyquist 
//===============================================================

Ro = abs(repf);
X = real(repf);
Y= imag(repf);

subplot(2,1,1)
plot2d(X,Y);
xtitle('Diagrama de Nyquist')
xgrid

subplot(2,1,2)
nyquist(frq, repf,'Directamente')



//===============================================================
// PARTE 2 - VARIABLES DE ESTADO Y SIMULACIONES EN EL TIEMPO
//===============================================================


//
// Definiendo un sistema sabiendo su representacion de estado
//

A = [ -0.7 -0.05; 1 0]
B = [  1 0]'
C = [  0  1]
D = [ 0]

[sist_1]=syslin('c',A,B,C,D)   

pause


//
// Verificamos la correcta entrada de las matrices de estado
//

sist_1("A")
sist_1("B")
sist_1("C")
sist_1("D")
sist_1("X0")   // Valor inicial

pause

//
// Hallando la funcion de transferencia
//

[h]=ss2tf(sist_1) 

Num = numer(h)

Den = denom(h)


//
// Caso contrario de querer pasas de funcion de transferencia a 
// representacion de estado usar tf2ss
//

pause

//
// Autovalores (polos) del sistema 
//

spec(A)

// Verificamos polos

roots(Den)

pause

//
// Simulacion en el tiempo
//

t=0:0.05:100

// Respuesta a una funcion escalon

U = ones(1,length(t));

[y1 X]=csim(U,t,sist_1);

plot2d(t, [U', y1'])
//legend(['u(t)';'Salida(t)'],a=2) Corregir esto


pause

xbasc

// Respuesta a una funcion escalon

[y2 X]=csim("step",t,sist_1);
plot2d(t, y2)

pause

xbasc


// Respuesta a una funcion senoidal

U = sin(t);
[y3 X]=csim(U,t,sist_1);
plot2d(t, [y3' X(1,:)' X(2,:)'], style=[color("red"),color("green"),color("blue")])

// Otras herramientas

// Matriz de controlabilidad

Cc=cont_mat(A,B)

pause

Cc=cont_mat(sist_l)

pause

// Matriz de observabilidad
Obs = obsv_mat(A,C)   


[O]=obsv_mat(sl)   

