martes, 22 de mayo de 2012

Practica Simulink (Matlab)


Practica Simulink (Matlab)


En este post analizaremos la posibilidad que nos da matlab para simular sistemas de primer orden y de segundo orden.
También gracias a una extensión de Matlab llamada Simulink nos permitirá hacer lo mismo pero de forma mas gráfica y mas sencilla.

¿Que es simulink?

Simulink es una plataforma para simulación multidominio y diseño basado en modelos de sistemas dinámicos y embebidos. Proporciona un entorno gráfico interactivo y un conjunto de librerías de bloques personalizables que permiten diseñar, simular, implementar y probar una gran variedad de sistemas con variación temporal, entre los que se incluyen sistemas de comunicaciones, control, procesado de señales, vídeo e imagen.(fuente:mathworks.es)


Lo primero, señalar que las variables utilizadas en Simulink hay que declararlas en Matlab.


Para entrar en Simulink lo que hay que hacer es pinchar en este icono:




SISTEMA DE PRIMER ORDEN CON SIMULINK.

Tendremos que obtener la salida de la función Y(s) a partir de una entrada   calculando la función de tranferencia siguiente:


La salida seria igual al producto de la entrada por la función de transferencia:

 

Para obtener la salida Y(t) aplicaremos la inversa de Laplace:





El resultado de lo anterior lo hará Simulink así que no nos tenemos que preocupar si no sabemos hacerlo. Ahora mediante simulik visualizaremos la gráfica de los resultados obtenidos:

En primer lugar entramos en Simulik haciendo click en el icono visto anteriormente en la ventana de Matlab. Esto nos mostrara la ventana Simulink mostrándonos las distintas librerías que dispone con todos los tipos de bloques que existen aunque nosotros solo utilizaremos tres:

Step : Lo encontramos en la librería sources, y es un generador de funciones. Si pinchamos dos veces en él nos mostrara un menú de para configurar los valores de nuestra función de salto. Los valores que introduciremos en esta practica sera Steptime a cero y Final value a cinco.



Transfer Fun: La encontramos en la librería continous y nos permite determinar la función de transferencia, G(s) antes mencionada.Como antes al hacerle doble click se nos abrirá una ventana para introducirle la función de transferencia.


Scope: Nos permite ver el resultado de la simulación en una gráfica de Y(t) haciendo doble click sobre él. Se incluye en la librería sinks.


Este seria el resultado de nuestro diagrama de bloques:



SISTEMA DE SEGUNDO ORDEN CON SIMULINK.
Es el mismo proceso que el anterior pero cambia nuestra función de transferencia que en este caso es de segundo orden.





Primero definiremos en la ventana de Matlab las variables A=10, wn=6, xi=0.2.
Modificamos la función de transferencia en el bloque Transfer Fun y simulamos, como en el caso anterior.
Simulamos y hacemos doble clic sobre Scope

El resultado de la nueva función de transferencia será:


Sistemas de Primer Orden con MATLAB.

Como hemos dicho al inicio del post esto mismo se puede hacer con Matlab a continuación veremos como se realizan.
Utilizaremos las mismas funciones que antes:






En la ventana de Matlab escribiremos:
>> clear
>> syms t s
>> A=10

A =

    10

>> a=2

a =

     2

>> U=1/s

U =

1/s

>> G=A/(s+a)

G =

10/(s + 2)

>> Y=G*U

Y =

10/(s*(s + 2))

>> y=ilaplace(Y,s,t)

y =

5 - 5/exp(2*t)

>> ezplot(y,[0,5]), axis([0,5 0,3])
>> ezplot(y,[0,5]), axis([0,5 0,6])

(En el post anterior ya vimos como se utilizaban los comandos de Matlab)

Primero definimos las variables a utilizar y las ecuaciones U, G, e Y, mediante el comando "ilaplace" nos hará su transformada en función de s y de t.


Ahora con el comando "ezplot" nos hará su gráfica que debería ser igual a la anterior.



Sistema de Segundo Orden con MATLAB.

Para este ejemplo cambiamos la función de transferencia G(s):






Y en la ventana de Matlab escribimos:

>> syms s t
>> A=10

A =

    10

>> xi=0.2

xi =

    0.2000

>> wn=6

wn =

     6

>> U=1/s

U =

1/s

>> G=A*wn^2/(s^2+2*xi*wn*s+wn^2)

G =

360/(s^2 + (12*s)/5 + 36)

>> Y=G*U

Y =

360/(s*(s^2 + (12*s)/5 + 36))

>> y=ilaplace(Y,s,t)

y =

10 - (10*(cos((12*6^(1/2)*t)/5) + (6^(1/2)*sin((12*6^(1/2)*t)/5))/12))/exp((6*t)/5)

>> ezplot(y,[0,5]), axis([0,5,0,3])
>> ezplot(y,[0,5]), axis([0,5,0,30])
>> ezplot(y,[0,5]), axis([0,5,0,20])

El resultado de nuestra función será:




Sistema de control en lazo cerrado.
Para acabar con este post veremos el ejemplo un sistema de control de lazo cerrado utilizando Simulink, lo que lo diferencia de los otros ejemplos es que este dispone de retroalimentación.

Lo primero que tenemos que hacer es declarar las variables necesarias en la ventana de Matlab:
 


Ahora escribiremos nuestra función de transferencia:


 


A la función de transferencia de retroalimentación le llamaremos "C".
Incluimos nuestros bloques como en los ejemplos anteriores como indica la imagen:




Si nos fijamos en esta ocasión al tener retroalimentación tenemos que poner una función de suma y nos tendremos que fijar que los signos +- de esta función estén correctamente. Por ultimo indicar que el bloque de realimentación y el de función de transferencia son del mismo tipo solo cambia la función de transferencia y que para que encaje bien hay que rotarlo con el botón secundario del ratón y pinchar en propiedades=>rotate.
Después simulamos y vemos el resultado haciendo doble click en Scope.










miércoles, 9 de mayo de 2012

Practica de matlab

Practica de matlab:

Matlab es el nombre abreviado de “Matrix Laboratory”. Matlab es un programa para realizar cálculos numéricos con vectores y matrices. Como caso particular puede también trabajar con números escalares, tanto reales como complejos. Una de las capacidades más atractivas es la de realizar una amplia variedad de gráficos en dos y tres dimensiones. 


  • Operaciones con números reales:
>> 2+2

ans =

     4

>> 654654656465645+6765767657655352421

ans =

   6.7664e+18

  • Si introducimos la palabra "help" en la ventana de comandos el programa nos imprimira en pantalla una serie de comandos que nos ayudara a resolver el problema que tengamos.

aquí dejo algunas de ellas como ejemplo aunque hay muchas mas:

>> help
HELP topics:

matlab/general                 - General purpose commands.
matlab/ops                     - Operators and special characters.
matlab/lang                    - Programming language constructs.
matlab/elmat                   - Elementary matrices and matrix manipulation.
matlab/randfun                 - Random matrices and random streams.
matlab/elfun                   - Elementary math functions.
matlab/specfun                 - Specialized math functions.
matlab/matfun                  - Matrix functions - numerical linear algebra.
matlab/datafun                 - Data analysis and Fourier transforms.
matlab/polyfun                 - Interpolation and polynomials.
matlab/funfun                  - Function functions and ODE solvers.
matlab/sparfun                 - Sparse matrices.
matlab/scribe                  - Annotation and Plot Editing.
matlab/graph2d                 - Two dimensional graphs.
matlab/graph3d                 - Three dimensional graphs.
  • Si añadimos a la palabra help por ejemplo rank el programa nos mostrara la ayuda respecto a la palabra que le sigue en este caso de las matrices.

>> help rank
 RANK   Matrix rank.
    RANK(A) provides an estimate of the number of linearly
    independent rows or columns of a matrix A.
    RANK(A,tol) is the number of singular values of A
    that are larger than tol.
    RANK(A) uses the default tol = max(size(A)) * eps(norm(A)).

    Class support for input A:
       float: double, single

    Overloaded methods:
       gf/rank
       rptcp/rank

    Reference page in Help browser
       doc rank

  • También puedes declarar variables lo que nos permite trabajar más cómodos y más rápido 


>> cos(pi)

ans =

    -1

>> a=3

a =

     3

>> b=5

b =

     5

>> a-b

ans =

    -2

>> x=a+b

x =

     8
  • Si la variable utilizada no existe nos saldrá el siguiente mensaje.


>> z
??? Undefined function or variable 'z'.

  • También hace raíces, en el caso del ejemplo raíz cuadrada de 4:

>> sqrt(4)

ans =

     2
  •  Operaciones con números complejos:

>> z=3+2i

z =

   3.0000 + 2.0000i

>> s=5-7i

s =

   5.0000 - 7.0000i

>> z+s

ans =

   8.0000 - 5.0000i

>> z*s

ans =

  29.0000 -11.0000i

Para pasar un número complejo a polar solo hay que sacar su modulo y su ángulo 

>> abs(z)

ans =

    3.6056

>> angle(z)

ans =

    0.5880

>> m=abs(x)

m =

     8

>> alfa=angle(z)

alfa =

    0.5880

>> m=abs(z)

m =

    3.6056

 En caso de que queramos pasar el numero de polar a imaginario se haría de esta forma:

>> x=m*cos(alfa)

x =

     3

>> y=m*sin(alfa)

y =

    2.0000
  • Matrices
Para introducir una matriz solo hay que poner su nombre = y entre [] los números de las filas separados por un espacio y una coma cuando cambiemos de fila.


>> A=[1 2 3;5 -1 -2; 0 0 0 ]

A =

     1     2     3
     5    -1    -2
     0     0     0

>> B=[1 1 1;2 2 2 ;1 -1 2]

B =

     1     1     1
     2     2     2
     1    -1     2

Con esta función el programa nos crea una matriz con números aleatorios.

>> C=rand(3,3)

C =

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

Transpuesta de una matriz:

>> X=[1 1 5]'

X =

     1
     1
     5

>> A+B

ans =

     2     3     4
     7     1     0
     1    -1     2

>> A-C

ans =

    0.1853    1.0866    2.7215
    4.0942   -1.6324   -2.5469
   -0.1270   -0.0975   -0.9575

>> A

A =

     1     2     3
     5    -1    -2
     0     0     0



>> A*X

ans =

    18
    -6
     0

>> A*C

ans =

    3.0073    2.4707    4.2448
    2.9139    3.7394   -1.0694
         0         0         0

>> X*a

ans =

     3
     3
    15

En caso de que la operación entre matrices no este permitida nos saldrá este error:

>> X*A
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Esta función es para obtener el rango de una matriz.


>> rank(A)

ans =

     2

>> rank (2)

ans =

     1

>> rank(B)

ans =

     2

 Polinomio caracteristico de la matriz:

>> poly(A)

ans =

     1     0   -11     0

Inversa de una matriz:

>> inv(C)

ans =

   -1.9958    3.0630   -1.1690
    2.8839   -2.6919    0.6987
   -0.0291   -0.1320    1.1282

Determinante de una matriz:

>> det(a)

ans =

     3

Este comando nos imprimirá la matriz unidad de orden "n":

>> eye(3)

ans =

     1     0     0
     0     1     0
     0     0     1

Valores propios y vectores propios

>> [val.vec]=eig(A)

val =

    vec: [3x1 double]

>> [z,v]=eig(A)

z =

    0.6535   -0.4204    0.0493
    0.7569    0.9073   -0.8385
         0         0    0.5426


v =

    3.3166         0         0
         0   -3.3166         0
         0         0         0

>> expm(A)

ans =

   17.9521    8.3009   11.2875
   20.7522    9.6513   11.4836
         0         0    1.0000

  • Esta función nos borra todas las variables definidas

>> clear

  • El comando "syms" nos permite trabajar con las variables como un símbolo 

>> syms x y s lambda

>> A=[1 2 3;0 1 0;3 -1 7]

A =

     1     2     3
     0     1     0
     3    -1     7

>> det(A-lambda*eye(3))

ans =

- lambda^3 + 9*lambda^2 - 6*lambda - 2

>> x+y

ans =

x + y

>> x-y

ans =

x - y

>> x*x

ans =

x^2

>> x+x

ans =

2*x

>> x+2*y

ans =

x + 2*y

>> c=det(A-lambda*eye(3))

c =

- lambda^3 + 9*lambda^2 - 6*lambda - 2

>> c=A-lambda*eye(3)

c =

[ 1 - lambda,          2,          3]
[          0, 1 - lambda,          0]
[          3,         -1, 7 - lambda]

>> det(c)

ans =

- lambda^3 + 9*lambda^2 - 6*lambda - 2

>> p=det(c)

p =

- lambda^3 + 9*lambda^2 - 6*lambda - 2

>> q=poly(A)

q =

    1.0000   -9.0000    6.0000    2.0000

  • Derivadas


>> f=3*x^2

f =

3*x^2

>> diff(f,x)

ans =

6*x

  • Integrales

 Integral indefinida

>> int(f,x)

ans =

x^3

Integral definida

>> int(f,x,-3,5)

ans =

152


>> p=int(f,x,-3,5)

p =

152

Si ponemos double el resultado sera un número real no entero

>> double(p)

ans =

   152

  • Matlab también nos permite hacer gráficos de funciones para ello ponemos la función  y los intervalos que queremos que tenga nuestra gráfica y con la función plot(x,y),title('parábola') nos sacara una gráfica de titulo parábola como se muestra en la foto de mas abajo.


>> y=x^2

y =

x^2

>> x=[-2:0.1:2]

x =

  Columns 1 through 15

   -2.0000   -1.9000   -1.8000   -1.7000   -1.6000   -1.5000   -1.4000   -1.3000   -1.2000   -1.1000   -1.0000   -0.9000   -0.8000   -0.7000   -0.6000

  Columns 16 through 30

   -0.5000   -0.4000   -0.3000   -0.2000   -0.1000         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000

  Columns 31 through 41

    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000

>> y=x.^2

y =

  Columns 1 through 15

    4.0000    3.6100    3.2400    2.8900    2.5600    2.2500    1.9600    1.6900    1.4400    1.2100    1.0000    0.8100    0.6400    0.4900    0.3600

  Columns 16 through 30

    0.2500    0.1600    0.0900    0.0400    0.0100         0    0.0100    0.0400    0.0900    0.1600    0.2500    0.3600    0.4900    0.6400    0.8100

  Columns 31 through 41

    1.0000    1.2100    1.4400    1.6900    1.9600    2.2500    2.5600    2.8900    3.2400    3.6100    4.0000




>> plot(x,y),title('parabola')