Sei sulla pagina 1di 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 B' ans = -1.3000 1.7321 15.5885 Luego podemos hacer 1.7321 15.5885

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 2 3 4 5 6 7 8 9 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 c

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...) Operadores relacionales < <= > >= == ~= ~ menor que menor o igual que mayor que mayor o igual que igual que distinto de not

% 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

% 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) abs(x) abs(3+4*i) ans = 5 angle(x) % Si x es complejo devuelve la fase en radianes % 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 % Valor absoluto de x. Si x es complejo se obtiene el mdulo

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 >>max(A) >>min(A) % Devuelve los ndices de los elementos de A mayores de

% Devuelve el mximo de cada columna % 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) ; plot(x,y); % dibuja vector v % dibuja vector y (ordenadas) frente a vector x (abcisas) % dibuja 3 grficos en una pantalla

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

% 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*')

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

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


0 1 2 3 4 5 6 7

-1

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

FIGURE (2)

>>title(string) >>gtext >>grid >>hold on >>semilogx >>bar >>stairs % Permite poner textos en posiciones especficas % crea regilla % La siguiente figura se imprime enciam de la anterior % igual que plot pero el ejex est en escala logartmica >>axis[xmin xmax ymin ymax] >>subplot(m,n,p) % crea ventana mxn y elige zona p para dibujar >>polar(teta, ro) %dibuja en coordenadas polares

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 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -5 -4 -3 -2 -1 Real Axis 0 1 2

[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 0.2 Imag Axis 0 -0.2 -0.4 -0.6 -0.8 -1 -5 -4 -3 -2 -1 Real Axis 0 1 2

Imag 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 2 2 0 0 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.1

Amplitude

0.05 To: Y(1) 0 -0.05 -0.1

0.5

1.5

2.5

3.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);

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 20

Phase (deg); Magnitude (dB)

10 0 -10 0 -100 To: Y(1) -200 -300 -400 10-1

100

101

102

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]);

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

Imaginary Axis

10 To: Y(1) 0 -10 -20 -8

-6

-4

-2

Real Axis Nichols Charts


From: U(1)

Open-Loop Gain (dB)

30 20 To: Y(1) 10 0 -10 -400

-350

-300

-250

-200

-150

-100

-50

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 10

Phase (deg); Magnitude (dB)

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 n=1; %%%%%%%%% RED DE ADELANTO %%%%%%%%%%%%%%%%% %Por defecto alfa min

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 % Planta

num=1; den=[1 1 0]; 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); 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)); % Posiciono el cero de cancelacin

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 % Planta

num=1; den=[1 1]; 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 J= 1 0 0 1 1 0 0 1 1 -1 0 1 1 0 0

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 1

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 3 2 1 3

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

Representacin mediante objeto sys=ss(A,B,C,D) a= x1 x2 b= x1 x2 c= u1 1 0 x1 -1 1 x2 -1 0

y1 d= y1

x1 0

x2 1

u1 0

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) G= 0.9889 -0.2325 H= 0.1052 0.1052 0.1162 1.3376

%Periodo de muestreo

%% 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);

Potrebbero piacerti anche