Está en la página 1de 38

MATLAB

Programa orientado al clculo y operaciones con matrices


Funcionamiento en lnea de comandos y con ficheros de instrucciones o
programas Matlab

Fundamentos:

a=4/3
a=
1.3333
Almacena en la variable a el valor 1.3333 y lo saca por pantalla

a=4/3;
Lo mismo que en el caso anterior. Almacena el valor pero no lo saca por
pantalla (por el ;)
Se pueden utilizar variables que ya tienen un valor en expresiones.

b=1.34*37;
c=b-a
c=
48.2467
Para recordar rdenes previas y corregir letras dentro de una orden utilizamos
las teclas de los cursores.
Las variables pueden tener como mximo 19 caracteres ( a-z, A-Z, 0-9, _ ), y la
primera debe ser una letra.
MATLAB es sensible a las maysculas y minsculas (las distingue).
Cualquier cosa que venga despus del carcter % se interpreta como un
comentario
Borrado de variables:
clear: borramos TODAS del espacio de trabajo.

clear a b c: borramos las variables a b c


Guardar en disco el espacio de trabajo.
File / Save Workspace As
save :
Cargar en Memoria.
File / Load Workspace
load fichero
Forma de trabajo:
En MATLAB podemos trabajar bien con las instrucciones en la lnea de
comandos, o bien creando unos ficheros *.m, programados en un lenguaje
interpretado propio de MATLAB.
Matrices y vectores
A=[1 2 3; 4 5 6; 7 8 9]
A=
1
4
7

2
5
8

3
6
9

Separar los elementos por espacios o comas especfica elementos en


diferentes columnas; separar elementos por puntos y comas especfica
elementos en filas diferentes.
B=[-1.3 sqrt(3) 3^2.5]
B=
-1.3000

1.7321 15.5885

Los elementos de una matriz o vector pueden ser expresiones.


C=A*B
??? Error using ==> *
Inner matrix dimensions must agree.
Las dos matrices no se pueden multiplicar pues B debera ser un vector
columna y es un vector fila. Con calculamos la transpuesta.

B=
-1.3000

1.7321 15.5885

B'
ans =
-1.3000
1.7321
15.5885
Luego podemos hacer

C=A*B'
C=
48.9295
96.9910
145.0525
Sellecin de elementos en matrices
D=A(1:2,:)
D=
1
4

2
5

3
6

Forma una matriz D con las dos primeras filas de A y todas sus columnas

E=A(2:3,1:2)
E=
4
7

5
8

Forma matriz E con las filas 2 y 3 y las columnas 1 y 2 de A.

A(:,[1 3])

ans =
1
4
7

3
6
9

Forma una matriz con las columnas 1 y 3 de A.


1:10
ans =
1

10

Crea un vector de 10 con los valores de 1 a 10


1:0.2:2
ans =
1.0000

1.2000

1.4000

1.6000

1.8000

2.0000

En este caso a:i:b especifica el uso del incremento i

logspace(1,2,10) %Crea vector de 10 elementos entre 10^1 y 10^2


Columns 1 through 7
10.0000 12.9155 16.6810 21.5443 27.8256 35.9381 46.4159
Columns 8 through 10
59.9484 77.4264 100.0000

who
Your variables are:
A
B

C
D

E
a

ans
b

Muestra el valor de las variables inicializadas presentes en la memoria.


El comando help nos muestra las toolbox instaladas de las que podemos
solicitar ayuda. Nos indica el directorio donde se encuentran. Si escribimos

help control por ejemplo nos muestra todas las funciones disponibles en la
toolbox de control.
help control
Control System Toolbox.
Version 4.2 (R11) 15-Jul-1998
What's new.
Readme
- New features and enhancements in this version.
Creation of LTI models.
tf
- Create a transfer function model.
zpk
- Create a zero/pole/gain model.
ss
- Create a state-space model.
.
Demonstrations.
ctrldemo - Introduction to the Control System Toolbox.
jetdemo - Classical design of jet transport yaw damper.
diskdemo - Digital design of hard-disk-drive controller.
milldemo - SISO and MIMO LQG control of steel rolling mill.
kalmdemo - Kalman filter design and simulation.
Podemos obtener ayuda de alguna funcin en particular.

help sqrt
SQRT Square root.
SQRT(X) is the square root of the elements of X. Complex
results are produced if X is not positive.
See also SQRTM.
Overloaded methods
help sym/sqrt.m
Escribiendo doc funcion nos da documentacin sobre el manejo de la funcion.
Ej doc sqrt
Veamos algunas funciones para construir matrices

zeros(2,3)
ans =

0
0

0
0

0
0

Crea una matriz de 2*3 de ceros


ones(4,2)
ans =
1
1
1
1

1
1
1
1

Matriz 4+2 de unos


eye(5)
ans =
1
0
0
0
0

0
1
0
0
0

0
0
1
0
0

0
0
0
1
0

0
0
0
0
1

Matriz identidad 5*5

rand(10,2)
ans =
0.9501
0.2311
0.6068
0.4860
0.8913
0.7621
0.4565
0.0185
0.8214
0.4447

0.6154
0.7919
0.9218
0.7382
0.1763
0.4057
0.9355
0.9169
0.4103
0.8936

Matriz 10*2 de nmeros aleatorios entre 0 y 1.


% Operaciones con matrices.

A = [1 2 3]; B = [1 0 -1];
A+B
A + 100
A * B'
A' * B
A .* B
[1:10] .^ 2
D = rand(5,3)
sum(D)
sum(D(:))
help elfun
(exp,round,etc...)

% Suma de vectores
% El 100 se suma a cada elemento
% Producto escalar
% El producto externo es una matriz
% Utilizar . Para especificar producto de elementos
% Eleva cada nmero al cuadrado
% Crea vector de nmeros aleatorios
% Suma las columnas de D
% Suma todos los elementos de D
% Lista todas las funciones elementales

Operadores relacionales
<
<=
>
>=
==
~=
~

menor que
menor o igual que
mayor que
mayor o igual que
igual que
distinto de
not

% Ms funciones
det(x)
trace(x)

% Determinate de la matriz x
% Suma de los elementos de la diagonal

Los polinomios se representan como vectores. As x2+3x+1 se puede


representar por el vector [1 3 1].
polyval(p,1) % Devuelve el resultado de evaluar el polinomio p para x=1
p=[1 3 1];
polyval(p,1)
ans =
5
roots(p)
roots(p)
ans =

% calcula las races del polinomio p

-2.6180
-0.3820
poly(A)

% Si A es una matriz devuelve el polinomio |I-A|


% Si A es un vector el polinomio de las raices (x-r1)(x-r2)(x-r3)

poly([1 2])
ans =
1

-3

2
% Es el producto de (x-1)(x-2)

conv(p1,p2) % Producto de polinomios p1 y p2


[q,r]=deconv(p1,p2) % Divide dos polinomios y calcula cociente (q) y resto (r)
Otras funciones
sin(a)
cos(a)
tan(a)
asin(x)
acos(x)
atan(x)
log(x)
log10(x)

% Seno de a (en radianes)


% Coseno de a (en radianes)
% Tangente de a (en radianes)
% Arco seno de x
% Arcos coseno de x
% Arco tangente de x
% Logaritmo neperiano de x
%logaritmo decimal de x

abs(x)

% Valor absoluto de x. Si x es complejo se obtiene el mdulo

abs(3+4*i)
ans =
5
angle(x)

% Si x es complejo devuelve la fase en radianes

angle(3+4*i)
ans =
0.9273

real(x)
imag(x)

% Parte real de un numero x


% Parte imaginaria de x

Bsqueda de elementos:
>>A=[8 2 -3; 4 -5 6];
>>[i,j]=find(A>5)
5

% Devuelve los ndices de los elementos de A mayores de

>>max(A)

% Devuelve el mximo de cada columna

>>min(A)

% Devuelve el mnimo de cada columna

Control de flujo:
MATLAB posee una serie de sentencias que nos permiten alterar el flujo
secuencial de una funcin. En el editor las instrucciones de los bucles aparecen
de color azul.
Bucle For
for i=1:5
ordenes
end
Tambin pueden anidarse varios bucles.
Estructura if
if expr1
ordenes1
elseif expr2
ordenes2
else
ordenes3
end
Bucle while
while expresion
ordenes
end

break
Sentencia que nos permite saltar o salir de un bucle while o for. Si hay bucles
anidados, nicamente se abandona el bucle ms interno.

Introduccin de valores por teclado:


a=input('nmero de manzanas: ')
nmero de manzanas: 3
Para visualizar un determinado texto por pantalla:
disp(Introducir los siguientes datos :)
fprintf(adios\n\n)
Las cadenas de caracteres se deben escribir entre comitas , y en el editor
aparece en rojo.

Creacin de funciones
Otra forma de utilizacin de los archivos *.m: En el caso que deseemos realizar
clculos donde utilizamos varias rdenes y deseamos cambiar el valor de
alguno de los argumentos, en lugar de volver a escribir cada vez estas rdenes
en la lnea de comandos, MATLAB nos proporciona la capacidad de agrupar
todas las rdenes dentro de un archivo que debe cumplir las siguientes
caractersticas:
* El archivo debe crearse con un editor de tipo ASCII
* La extensin del archivo debe ser *.m (mifuncin.m)
* El archivo debe encontrarse en un directorio conocido por MATLAB.
* El nombre del archivo no debe coincidir con algn comando de
MATLAB, ya que estos tienen prioridad y el programa no se ejecutar.
En cuanto a la escritura del cdigo de la funcin dentro del archivo deberemos
tener en cuenta los siguientes puntos:
* La primera lnea debe declarar el archivo como de tipo funcin, y se
deben indicar los argumentos de dicha funcin y sus valores devueltos.
Los valores devueltos pueden ser uno o varios, en cuyo caso deben
escribirse entre corchetes.
function [res1,res2,...]=mifuncion(arg1,arg2,...)
* La segunda lnea debe ser de comentario (se denomina lnea H1), y en
ella se debe dar una breve descripcin de lo que hace la funcin. Esta
lnea es examinada por la orden de bsqueda de ayuda lookfor.
%MIFUNCION esta es mi maravillosa funcin
As cuando desde la lnea de comandos ejecutemos la orden lookfor
obtendremos lo siguiente:
>>lookfor maravillosa
MIFUNCION esta es mi maravillosa funcin
* A partir de la segunda lnea de comentario el resto de lneas que sean

de comentario hasta la primera lnea de no comentario, sern las


mostradas cuando pidamos ayuda de la funcin con el comando
>>help mifuncion.
* Las variables creadas dentro de la funcin son locales, y se destruyen
al abandonar la funcin.
* Los argumentos que recibe la funcin son pasados por referencia a
menos que se alteren dentro de la funcin, en cuyo caso se pasa una
copia (para no alterar el valor).
* El nmero de parmetros pasados a la funcin est disponible en la
variable llamada nargin; esto puede tener utilidad para establecer
valores por defecto.
El nmero de variables de salida est disponible en la variable nargout.
Ejemplos de funcines:
% Incicializa matriz con suma de ndices
% El smbolo % indica comienzo de comentario en la lnea
function M=inicializa(m,n)
for k=1:m
for l=1:n
M(k,l)=k+l;
end
end
%Funcion amort(M)
% Determina el coeficiente de amortiguamiento a partir del sobrepico
% Argumentos:
%
M: Sobrepico
function [] = amort(M)
c=- log(M) / sqrt((log(M)^2)+pi^2)

%Funcion spico(c)
% Determina el sobrepico a partir el coeficiente de amortiguamiento
% Argumentos:
%
c: coefieciente de amortiguamiento
function [] = spico(c)
Mp=exp(-pi*c/sqrt(1-c*c))

Creando dibujos
plot(v) ;

% dibuja vector v

plot(x,y);

% dibuja vector y (ordenadas) frente a vector x (abcisas)

plot(x1,y1,x2,y2,x2,y3);
plot(X,Y)

% dibuja 3 grficos en una pantalla

% Si X e Y son matrices, dibuja tantos graficos como columnas de


% X frente a las columnas de Y

% Construimos un ejemplo:
>> t=[0:0.2:2*pi];
>> x=sin(t);
>> y=cos(t);
>> figure(1);
>> plot(t, x, '+', t, y, '*')
>> figure(2)
>> plot(t, x, 'r+', t, y, 'm*')

0.8

0.8

0.6

0.6

0.4

0.4

0.2

0.2

-0.2

-0.2

-0.4

-0.4

-0.6

-0.6

-0.8

-0.8

-1

FIGURE (1)
Otras funciones relacionadas son:
>>xlabel(string)
>>text(x,y,string)

-1

FIGURE (2)

>>title(string)
>>gtext

% Permite poner textos en posiciones especficas

>>axis[xmin xmax ymin ymax]


>>grid

% crea regilla

>>subplot(m,n,p) % crea ventana mxn y elige zona p para dibujar


>>hold on

% La siguiente figura se imprime enciam de la anterior

>>polar(teta, ro) %dibuja en coordenadas polares


>>semilogx

% igual que plot pero el ejex est en escala logartmica

>>bar
>>stairs

Ejemplo
>>subplot(211),plot(1:3),subplot(212),(plot(sin(1:3));

Dibujos en tres dimensiones

[X,Y] = meshgrid(-2:.2:2, -2:.2:2);


Z = X .* exp(-X.^2 - Y.^2);
mesh(Z)
figure
contour(Z)

Funciones de Control
Y(s)= G(s)= .
18(s+20)
.
U(s)
(s+15)(s+25)(s+0.4)
num=18*[1 20];
den=conv(conv([1 15],[1 25]),[1 0.4]);
printsys(num,den)
num/den =
18 s + 360
---------------------------s^3 + 40.4 s^2 + 391 s + 150

wn=2;
damping=0.707;
[num,den]=ord2(wn,damping);
printsys(num,den,'s')
num/den =
1
----------------------s^2 + 2.828 s + 4
Construyendo sistemas
s+1
(s+3)(s+5)

ngo=[1 1];
dgo=conv([1 3],[1 5]);
[ngc1,ngc2]=cloop(ngo,dgo);

s+1
(s+3)(s+5)
s+6
(s+10)

ngo=[1 1];
dgo=conv([1 3],[1 5]);
nh=[1 6];
dh=[1 10];
[ngc2,dgc2]=feedback(ngo,dgo,nh,dh);
printsys(ngc2,dgc2,'s')
num/den =
s^2 + 11 s + 10
------------------------------------s^3 + 19 s^2 + 102 s + 156
para bloques funciones: series, parallel, blkbuild,connect

Lugar de las raices


G(s)=(s+2)/)(s2+6s+10)

num=[1 2];
den=[1 6 10];
rlocus(num,den)
1
0.8
0.6

Imag Axis

0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-5

-4

-3

-2
-1
Real Axis

[k,polos]=rlocfind(num,den)
Select a point in the graphics window
selected_point =
-3.3065 + 0.5322i

k=
0.6195

polos =
-3.3097 + 0.5335i
-3.3097 - 0.5335i
1
0.8
0.6
0.4

Imag Axis

0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-5

-4

-3

-2
-1
Real Axis

Se puede especificar n complejo prximo al lugar de las raices en vez de


seleccionar con el ratn.
[r,k]=rlocfind(num,den,p);
Ceros y Polos
G(s)=(3s4+3s3+5s2+4s+6)/(s5+3s4+4s3+2s2+7s+2)

num=[3 2 5 4 6];
den=[1 3 4 2 7 2];
[z,p,k]=tf2zp(num,den)
z=
0.4019 + 1.1965i
0.4019 - 1.1965i
-0.7352 + 0.8455i
-0.7352 - 0.8455i

p=
-1.7680 + 1.2673i
-1.7680 - 1.2673i
0.4176 + 1.1130i
0.4176 - 1.1130i
-0.2991

k=
3
Funcin de transferencia a partir de ceros y polos

z=[0; 0; 0; -1];
p=[-1+i -1-i -2 -3.15+2.63*i -3.15-2.63*i];
k=2;
[num,den]=zp2tf(z,p',k)
num =
0

den =
1.0000 10.3000 48.0394 109.1576 126.2364 67.3576

Respuesta temporal

Escaln
grid on
step(num,den)
Step Response
From: U(1)
0.15

0.05
To: Y(1)

Amplitude

0.1

-0.05

-0.1

0.5

1.5

2.5

Time (sec.)

se puede especificar el tiempo:

step(num,den,0:0.1:10)
se puede obtener los valores para luego tratarlos
[y,x,t]=step(num,den,0:0.1:10);
plot(t,y);
Impulso:
impulse(num,den)
Entradas arbitrarias

[num,den]=zp2tf([-2],[-1 -0.2+10*i -0.2-10*i],100);

3.5

t=[0:0.1:20];
u=exp(-t);
lsim(num,den,u,t)
Si se quiere ver la salida con la entrada
y=lsim(num,den,u,t);
plot(t,u,t,y)

1.5

0.5

-0.5

10

12

14

16

18

20

Clculo de tiempo de pico, sobrepico, tiempo de subida y tiempo de


establecimiento.
%
%
%
%
%

Funcin para el clculo de los parmetros caractersticos de


la respuesta temporal de un sistema a un escaln unitario
Formato de llamada: paso(num,den)
num: numerador de la funcin de transferencia
den: denominador de la funcin de transferencia

function [] = paso(num,den)
[numexp,denexp]=cloop(num,den)
step(numexp,denexp)
pause
valorfinal=polyval(numexp,0)/polyval(denexp,0)
[y,x,t]=step(numexp,denexp);
[Y,kexp]=max(y);
tiempopico=t(kexp)
sobrepaso=100*(Y-valorfinal)/valorfinal
n=1;
while y(n)<0.1*valorfinal, n=n+1; end
m=1;
while y(m)<0.9*valorfinal, m=m+1; end
tiempo_subida=t(m)-t(n)
l=length(t);
while (y(l)>0.98*valorfinal)&(y(l) < 1.02*valorfinal)
l=l-1;

end
tiempo_establecimiento=t(l)

paso(num,den)
numexp =
0 0 1
denexp =
1 1 2
valorfinal =
0.5000
tiempopico =
2.4294
sobrepaso =
30.4117
tiempo_subida =
0.8834
tiempo_establecimiento =
7.7300
Dibujos en el dominio de la frecuencia

num=[5.9 53,.8 197.3 388.6];


den=[1 13 58 306 260];
bode(num,den)
gris

Bode Diagrams
From: U(1)
30

10
0
-10
0
-100
To: Y(1)

Phase (deg); Magnitude (dB)

20

-200
-300
-400
10-1

100

Frequency (rad/sec)

subplot(211),nyquist(num,den)
z=[-2 -2+5*i -2-5*i];
p=[-1 -5 -7 -1+7*i -1-7*i];
k=30;
subplot(211),nyquist(num,den)
subplot(212),axis([-360 0 -40 30]);

101

102

nichols(num,den)
ngrid
Nyquist Diagrams
From: U(1)

10
To: Y(1)

Imaginary Axis

20

0
-10
-20
-8

-6

-4

-2

-150

-100

-50

Real Axis
Nichols Charts

20
To: Y(1)

Open-Loop Gain (dB)

From: U(1)
30

10
0
-10
-400

-350

-300

-250

-200

Open-Loop Phase (deg)

Obteniendo informacin

num=10*[1 1];
den=conv([1 -1+5*i],[1 -1-5*i]);
bode(num,den)
[mag,phase,w]=bode(num,den);
[Mp,k]=max(mag)
Mp =
5.0767

k=
29
wp=w(k)
wp =
5.1784
n=1;
while 20*log10(mag(n))>=-3,n=n+1;end
anchobanda=w(n)
anchobanda =
0.1000
Margen de fase y margen de ganancia
[Gm,Pm,Wcg,Wcp]=margin(num,den)

Gm =
0.2000

Pm =
73.7398

Wcg =
5.2915

Wcp =
12.0000

Bode Diagrams
Gm=-13.979 dB (at 5.2915 rad/sec), Pm=73.74 deg. (at 12 rad/sec)
20

Phase (deg); Magnitude (dB)

10
0
-10
-20
300
200
100
0
-100
-200
10-1

100

101

102

Frequency (rad/sec)

Ejemplo funcin:
%Funcion mibode(num,den,d1,d2)
% Dibuja diagrama de bode en un ranfo de frecuencias
function [] = mibode(num,den,d1,d2)
w=logspace(d1,d2,d2-d1*100);
[mag,fase,w]=bode(num,den,w);
semilogx(w,20*log10(mag));
ylabel('Ganancia dB');
xlabel('Frecuencia (rad/seg)');
grid
axis tight
figure
semilogx(w,fase);
ylabel('Fase en grados');
xlabel('Frecuencia (rad/seg)');

grid

mibode(num,den,-1,2)

Representacin mediante objetos

num=1;
den=[1 1 1];
sys=tf(num,den)
Transfer function:
1
--------------s^2 + s + 1

sys1=zpk(z,p,k)
Zero/pole/gain:
29 (s+2) (s^2 + 4s + 29)
--------------------------------(s+1) (s+5) (s+7) (s^2 + 2s + 50)

Funciones similares a las vistas: bode(sys), rlocus(sys),


Operaciones ms sencillas
2 bloques en serie
sys*sys1
Zero/pole/gain:
29 (s+2) (s^2 + 4s + 29)
----------------------------------------------(s+1) (s+5) (s+7) (s^2 + s + 1) (s^2 + 2s + 50)

dos bloques en paralelo

sys*sys1
Zero/pole/gain:
29 (s+2) (s^2 + 4s + 29)
----------------------------------------------(s+1) (s+5) (s+7) (s^2 + s + 1) (s^2 + 2s + 50)

feedback(sys1,sys)
Zero/pole/gain:
29 (s+2) (s^2 + s + 1) (s^2 + 4s + 29)
--------------------------------------------------------------------------(s+6.81) (s+5.292) (s+1.334) (s^2 + 0.5767s + 1.434) (s^2 + 1.988s + 49.79)
Programa compensacin en Adelanto:

% Compensacion en adelanto
% Formato: adelanto(num,den,tipo)
% tipo: 'alfa' Red adelanto alfa min
%
'vertical'
Red adelanto polo en vertical
%
'compen' Red de adelanto por compensacin
%
'pd'
P
function [numct,denct] = adelanto (num,den,tipo)

capa=input('Introduce coef amortiguamiento ');


wn=input('Introduce frecuencia natural ');
% Polos Dominantes
s1=-capa*wn+wn*sqrt(1-capa*capa)*i
ang=angle(polyval(num,s1)/polyval(den,s1))*180/pi
% Contribucion angular Compensador
if ang<0
printf('No necesita compensar\n');
exit(1);
else
cang=180-ang
end
if(nargin == 2),
tipo='alfa';
end

%Por defecto alfa min

n=1;
%%%%%%%%% RED DE ADELANTO %%%%%%%%%%%%%%%%%

if tipo(1) == 'a'
echo on
% Red adelanto alfa min
echo off
if cang > 60
pause % Dos controladores en cascada
n=2;
cang=cang/2;
cang
end
theta=180-angle(s1)*180/pi
gamma=0.5*(180-theta-cang)
zc=sin(gamma*pi/180)*wn/sin((180-theta-gamma)*pi/180);
pc=sin((gamma+cang)*pi/180)*wn/sin((180-theta-gamma-cang)*pi/180);
numc=[1 zc];
denc=[1 pc];
kc=abs(polyval(den,s1))*abs(polyval(denc,s1))^n/((abs(polyval(num,s1))
*abs(polyval(numc,s1))^n));
pause
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
else
kc=kc
printsys(numc,denc,'s');
end
end
%%% Fin red de adelanto %%%%%%
%%% Compensador por cancelacin
if (tipo(1)=='c')
echo on
% Compensacin por cancelacin
echo off
zc=input('Introduce posicin del polo a cancelar ');

if cang > 60
pause % Dos controladores en cascada
n=2;
cang=cang/2;
cang
end

numc=[1 -zc];
angnum=angle(polyval([1 -zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];

kc=abs(polyval(den,s1))*abs(polyval(denc,s1))^n/((abs(polyval(num,s1))
*abs(polyval(numc,s1))^n));
kc=abs(kc);
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
else
kc=kc
printsys(numc,denc,'s');
end
end
%% Fin compensador de cancelacin
%% Compensador enla vertical
if (tipo(1)=='v')
echo on
% Compensacin en la vertical
echo off

if cang > 60
pause % Dos controladores en cascada
n=2;
cang=cang/2;
cang
end

zc=-real(s1)
numc=[1 zc];
angnum=angle(polyval([1 zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];

kc=abs(polyval(den,s1))*abs(polyval(denc,s1))^n/((abs(polyval(num,s1))
*abs(polyval(numc,s1))^n));
kc=abs(kc);
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
else
kc=kc
printsys(numc,denc,'s');
end
end
%% Fin compensador en la vertical

%%%%%% CONTROLADO PD %%%%%%%%%%%%%%%%5


if tipo(1) == 'p'

echo on
% Compensador PD
echo off
zc=-real(s1)+imag(s1)/tan(cang*pi/180);
numc=[1 zc]
denc=[1];
kc=polyval(den,s1)/((polyval(numc,s1)*polyval(num,s1)));
kc=abs(kc)
% printsys(numc,[],'s');
end

%% Comprobacin
if n==1
[numt,dent]=cloop(kc*conv(num,numc),conv(den,denc));
elseif n==2
[numt,dent]=cloop(kc*kc*conv(conv(num,numc),numc),conv(conv(den,denc),
denc));
end
roots(dent)
% Preparo argumentos
if(n==2)
kc=sqrt(kc)
printsys(numc,denc,'s'); printsys(numc,denc,'s');
numct=kc*conv(numc,numc);
denct=conv(denc,denc);
else
numct=kc*numc;
denct=denc;
end

Herramienta para compensacin de sistemas: rltool

num=4;
den=conv([1 0],[1 2]);
sys=tf(num,den);
rltool(sys)
Permite aadir ceros, polos, variar la ganacia y observar la respuesta temporal
y frecuencial.

Sistemas Discretos

[NUMd,DENd] = C2DM(NUM,DEN,Ts,'method') converts the continuoustime polynomial transfer function G(s) = NUM(s)/DEN(s) to discrete
time, G(z) = NUMd(z)/DENd(z), using 'method'.
'zoh'

Convert to discrete time assuming a zero order


hold on the inputs.
'foh'
Convert to discrete time assuming a first order
hold on the inputs.
'tustin'
Convert to discrete time using the bilinear
(Tustin) approximation to the derivative.
'prewarp' Convert to discrete time using the bilinear
(Tustin) approximation with frequency prewarping.
Specify the critical frequency with an additional
argument, i.e. C2DM(A,B,C,D,Ts,'prewarp',Wc)
'matched' Convert the SISO system to discrete time using the
matched pole-zero method.
Respuesta temporal ante un escaln para diferentes periodos de muestreo.
1
s(s+1)

%% Ejemplo respuesta temporal


num=1;
den=[1 1 0];
[numc,denc]=cloop(num,den);
hold off
step(numc,denc);
pause
% Paso a discreto con diferentes periodos de muestreo
Ts=0.5;
t=0:0.5:10;
[numd,dend]=c2dm(num,den,Ts,'zoh');
[numdc,dendc]=cloop(numd,dend);
hold on
dstep(numdc,dendc,t);
Ts=0.1;

t=0:0.1:10;
[numd,dend]=c2dm(num,den,Ts,'zoh');
[numdc,dendc]=cloop(numd,dend);
dstep(numdc,dendc,t);

Ejercicio: Dibujar el lugar geomtrico de las raices para Ts=0.5s, T=1s, T=2s.
Determinar el valor crtico de k y localizar los polos de lazo cerrado en los tres
casos.

1
s(s+1)

Ejercicio: Dado el controlador siguiente obtener una funcin matlab de forma


que dado una secuencia de errores en el tiempo almacenados en un vector se
obtenga la accion de control m.
13.93z-11.4077
G(z)=-----------------------z-0.15962
function [m]=control(e)
m(1)=13.93;
for i=2:length(e)
m(i)=0.1562*m(i-1)+13.93*e(i)-11.4077*e(i-1);
end;

%%
%%
%%
%%
%%
%%

Ejemplo diseo controladores


Planta G(s)=1/(s*(s+1))
Periodo de muestreo Ts=0.2
Coef amortiguamiento 0.5 frc natural 4.5345
Red de adelanto
Datos

num=1;
den=[1 1 0];

% Planta

capa=0.5;
wn=4.5345;

% Especificaciones

Ts=0.2;

% Periodo de muestreo

% Polo dominante
s1=-capa*wn+wn*sqrt(1-capa*capa)*i;
% Diseo controlador continuo
zc=-1;

% Posciono el polo de cancelacin

numc=[1 -zc];
ang=angle(polyval(num,s1)/polyval(den,s1))*180/pi;
if ang<0
% Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
angnum=angle(polyval([1 -zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];
kc=abs(polyval(den,s1))*abs(polyval(denc,s1))/((abs(polyval(num,s1))*a
bs(polyval(numc,s1))));
fprintf('Controlador continuo\n');
printsys(kc*numc,denc);
[numcc,dencc]=cloop(kc*conv(num,numc),conv(den,denc));
step(numcc,dencc,0:0.05:2);
pause
% controlador continuo con mantenedor a entrada
num1=1;
den1=conv(den,[Ts/2 1]);
% Diseo controlador continuo
zc=-1;

% Posciono el cero de cancelacin

numc=[1 -zc];
ang=angle(polyval(num1,s1)/polyval(den1,s1))*180/pi;
if ang<0
% Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
angnum=angle(polyval([1 -zc],s1))*180/pi;
zp=-real(s1)+imag(s1)/tan((angnum-cang)*pi/180);
denc=[1 zp];
kc=abs(polyval(den1,s1))*abs(polyval(denc,s1))/((abs(polyval(num1,s1))
*abs(polyval(numc,s1))));

fprintf('Controlador continuo con mantenedor a la entrada\n');


printsys(kc*numc,denc);
%% Discretizamos

[numcd,dencd]=c2dm(kc*numc,denc,Ts,'matched');
fprintf('Controlador discreto equivalente al continuo\n');
printsys(numcd,dencd,'z');
% Calculo G(z)
[numd,dend]=c2dm(num,den,Ts,'zoh');
printsys(numd,dend,'z');
% Lazo cerrado
[numdt,dendt]=cloop(conv(numd,numcd),conv(dend,dencd));
hold on
dstep(numdt,dendt,0:Ts:2);
pause
%% Calculo en digital directamente
z1=exp(Ts*s1); % Polo dominante en el plano z
% Diseo controlador discreto
zdc=exp(-1*Ts);

% Posiciono el cero de cancelacin

ndc=[1 -zdc];
ang=angle(polyval(numd,z1)/polyval(dend,z1))*180/pi
if ang<0
% Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
angnum=angle(polyval([1 -zdc],z1))*180/pi;
zdp=-real(z1)+imag(z1)/tan((angnum-cang)*pi/180);
ddc=[1 zdp];
kdc=abs(polyval(ddc,z1))*abs(polyval(dend,z1))/((abs(polyval(ndc,z1))*
abs(polyval(numd,z1))));
fprintf('Controlador discreto diseo en z\n');
printsys(kdc*ndc,ddc,'z');
[numdt2,dendt2]=cloop(kdc*conv(ndc,numd),conv(ddc,dend));

dstep(numdt2,dendt2,0:Ts:2);
hold off

%%
%%
%%
%%

Ejemplo diseo controladores


Planta G(s)=exp(-2s)/s+1
Controlador difital PI Gd(z)=Kp+Ki (z/z-1)=Kd z-zz/(z-1)
Datos

num=1;
den=[1 1];

% Planta

capa=0.5;
n=10;
Ts=1;

% Especificaciones
% muestras por oscilacin amortiguada

% Polo dominante
z1=exp((-2*pi*capa/(sqrt(1-capa^2)*n) + i*2*pi/n))

% Calculo G(z)
[numd,dend]=c2dm(num,den,Ts,'zoh');
dend=conv(dend,[1 0 0]);
% incluyo retraso 2 segundos
% Diseo controlador discreto
ddc=[1 -1]; % Posiciono el polo en z=1

ang=angle(polyval(numd,z1)/polyval(conv(dend,ddc),z1))*180/pi
if ang<0
% Contribucion angular Compensador
cang=ang+180;
else
cang=180-ang;
end
zz=-real(z1)+imag(z1)/tan(cang*pi/180);
ndc=[1 zz];
kdc=abs(polyval(ddc,z1))*abs(polyval(dend,z1))/((abs(polyval(ndc,z1))*
abs(polyval(numd,z1))));
fprintf('Controlador discreto diseo en z\n');
printsys(kdc*ndc,ddc,'z');
[numdt2,dendt2]=cloop(kdc*conv(ndc,numd),conv(ddc,dend));
roots(dendt2)
% Respuesta escaln
figure(1);
dstep(numdt2,dendt2,0:Ts:40);
kv=polyval((1/Ts)*kdc*conv(ndc,numd),1) /polyval(dend,1);
ess=1/kv
%respuesta a rampa
figure(2);
t=0:Ts:30;
u=t;
plot(t,u);

[Y]=dlsim(numdt2,dendt2,u);
hold on
stairs(t,Y);
title('Respuesta entrada escaln');
hold off

Espacio de estado
Clculo de los autovalores de una matriz

A x= x
|A- I|=0
eig(A)

valores propios
si A es real y simtrica los valores propios son reales

A=[0 1; -1 0];
eig(A)
ans =
0 + 1.0000i
0 - 1.0000i
Clculo de autovalores y auto vectores

A=[0 1 0; 0 0 1; -6 -11 -6];


[X,D]=eig(A)
X=
-0.5774 0.2182 -0.1048
0.5774 -0.4364 0.3145
-0.5774 0.8729 -0.9435

D=
-1.0000
0
0
0 -2.0000
0
0
0 -3.0000
Forma de jordan
A=[0 1 0; 0 0 1; 1 -3 3];
[V,J]=jordan(A)

V=
1
1
1

-1
0
1

1
0
0

1
0
0

1
1
0

0
1
1

J=

Funcin de transferencia a espacio de estados

y(s)/u(s)=num/den=C(sI-A)-1B+D

num=1;
den=[1 1 1];
[A,B,C,D]=tf2ss(num,den)
A=
-1
1

-1
0

B=
1
0

C=
0

D=
0
Si el sistema tiene ms de una entrada
[num,den]=ss2tf(A,B,C,D,iu) donde iu es el nmero de entrada

Ejemplo;
A=[0 1; -2 -3];
B=[1 0; 0 1];
D=[0 0];
C=[1 0];
[num1,den1]=ss2tf(A,B,C,D,1)
num1 =
0

den1 =
1

[num2,den2]=ss2tf(A,B,C,D,2)
num2 =
0

den2 =
1

Representacin mediante objeto


sys=ss(A,B,C,D)
a=
x1
x2

x1
-1
1

x1
x2

u1
1
0

b=

c=

x2
-1
0

y1

x1
0

y1

u1
0

x2
1

d=

Conversin de continuo a discreto


dx/dt=Ax+Bu -- x(k+1)=G x(k) + H u(k)

A=[0 1; -2 3];
B=[1 1]';
Ts=0.1;
[G,H]=c2d(A,B,Ts)

%Periodo de muestreo

G=
0.9889
-0.2325

0.1162
1.3376

H=
0.1052
0.1052

%% Ejemplo espacio de estado

A=[-3 1 0 0; 0 0 -2 0; -4 0 0 1; 0 0 -3 0];
B=[0 2; 1 0; 0 3; 1 -3];
C=[1 0 0 0; 0 0 1 0];
D=[0 0; 0 1];

% Calculo de controlabilidad y observabilidad


fprintf('Controlabilidad rango %d\n',rank(ctrb(A,B)));
fprintf('Observabilidad rango %d\n',rank(obsv(A,C)));
% Calculo autovalores
fprintf('Autovalores :\n');

eig(A)
% Calculo de matriz de Jordan
[S,J]=jordan(A);
A1=J;
B1=inv(S)*B;
C1=C*S;
D1=D;
printsys(A1,B1,C1,D1);

También podría gustarte