Matlab Tutorial
Matlab Tutorial
Matlab Tutorial
ans = 4
Recordad que las variables sirven para almacenar resultados en la memoria y volverlos a utilizar
>> a = 4; >> a + 2; ans = 6
Importante Por omisin Matlab siempre muestra el resultado del ltimo clculo. Esto sucede tanto en sesiones interactivas como en los programas que escribamos en el editor. Para prevenir la salida de una ristra interminable de resultados intermedios debemos escribir un punto y coma al final de cada lnea. Los operadores matemticos bsicos se expresan en Matlab mediante los siguientes smbolos:
Suma: +. Resta: -. El signo menos tambin sirve como prefijo para expresar que un nmero es negativo. Multiplicacin: .*. Divisin: ./. Potencia: .^.
Importante Probablemente os sorprenda el hecho que los ltimos tres operadores utilicen un punto y no sean simplemente el smbolo. La razn la entenderemos en el momento en el que empecemos a operar con matrices. Hay muchos ms operadores aritmticos, de momento nos hemos ceido a los ms bsicos. Matlab es capaz de operar con nmeros complejos gracias a que el nmero imaginario es una constante expresada por la variable i. Cualquier nmero
multiplicado por i ser en realidad la componente imaginaria de un nmero complejo. Por ejemplo
>> a = 1; >> b = 1.*i; >> a + b ans = 1 + 1i >> a .* b ans = 0 + 1i
Advertencia Matlab no mostrar ningn aviso en el caso que sobreescribamos i. Para evitar posibles accidentes podemos utilizar smbolos alternativos para expresar la constante imaginaria: j, I yJ. Lo que convierte a Matlab en una herramienta til es la enorme biblioteca de funciones que cubre prcticamente cualquier disciplina del clculo numrico, desde el lgebra Lineal al anlisis de seales pasando por la teora de juegos o las redes neuronales. Cualquier funcin tiene argumentos de entrada y argumentos de salida y Matlab los trata de una manera un poco particular. Las funciones ms simples tienen slo un argumento de entrada y otro de salida
>> sin(1.4) ans = 0.98545 >> sqrt(4) ans = 2
Como no hemos asignado el argumento de salida a ninguna variable Matlab ha utilizado la variable especial ans de la que hemos hablado en el captulo anterior. Hay funciones que tienen varios argumentos de entrada y de salida como por ejemplo la funcin quadque calcula la integral numrica de una funcin en un intervalo dado. quad tiene cinco argumentos de entrada y cuatro de salida y es prcticamente imposible que la utilicemos correctamente sin consultar la documentacin. Hacerlo es tan sencillo como escribir lo siguiente en el intrprete
>> help(quad)
documentadas y tenemos acceso a esa informacin a travs de help. Siempre que sea matemticamente consistente cualquier funcin operar indistintamente con nmeros reales y complejos:
>> a = 1.6; >> b = 3.4.*i; >> exp(b) ans = -0.96680 - 0.25554i
Ejercicio 1 Define tres variables con los siguientes valores: a = 1.5, b = 3.4 y c = 5.2. Calcula el valor de d para Ejercicio 2 En un Congreso Internacional de Matemticas se vot como la frmula ms bella . Comprueba que Matlab piensa que esta frmula es correcta. Te
conviene utilizar la constante pi. Ejercicio 3 Comprueba que el producto de dos nmeros complejos es igual al producto de sus mdulos y la suma de sus argumentos. Puede ser que necesites las funciones angle y abs. Ejercicio 4 No existe el infinito en Matlab porque sirve para el Clculo Numrico, no para el Clculo Simblico. Pero hay una constante propia llamada Inf que es un nmero lo suficientemente grande como para ser el infinito en la prctica (es un nmero ms grande que el total de tomos de la masa conocida del Universo). La funcin tangente, tan conecta el valor de con el infinito: . Si
utilizamos la expresin anterior para calcular el infinito en Matlab no llegamos a un nmero tan grande. Puedes dar una explicacin?
Definicin de funciones
Ahora ya sabemos operar con escalares y con funciones simples. El siguiente paso es aprender a definir nuestras propias funciones. Hay dos maneras de definir una funcin en Matlab, de momento nos basta con la ms sencilla y a la vez la menos potente: mediante el operador @(). La sintaxis queda bien clara mediante el siguiente ejemplo:
>> fsin = @(x) x - x.^3/6 fsin = @(x) x - x .^ 3 / 6 >> fsin(pi) ans = 8.3093
Una funcin definida por el usuario puede hacer uso tanto de otras funciones independientemente de su origen.
>> comp = @(x) fsin(x) - sin(x) comp = @(x) fsin (x) - sin (x) >> comp(0.1) ans = 3.3325e-004
Nota Tcnicamente lo que hemos definido antes no es exactamente una funcin y de hecho no se llama funcin sino funcin annima. Pero de momento no encontraremos ninguna diferencia.
Vectores
El vector es el tipo derivado ms simple de Matlab. Se trata de una concatenacin de nmeros ordenados en fila. La caracterstica ms importante de los vectores es que son un conjunto ordenado del que podemos tomar uno o varios de sus elementos a partir de su ndice. La manera ms sencilla de definir un vector es utilizando un literal:
>> v = [11,12,13,14,15,16,117,18,19] v =
11
12
13
14
15
16
17 ...
Podemos obtener un elemento del vector llamndolo como si fuera una funcin
>> v(2) ans = 12
Obtener porciones del vector es tan fcil como obtener elementos. Basta con separar el primer nidice del ltimo con dos puntos
>> v(2:4) ans = 12 13 14
Tambin podemos utilizar otro vector para obtener un vector con elementos individuales
>> v([2,4,6,7]) ans = 12 14 16 17
Difclmente escribiremos nunca un vector largo en Matlab. O lo obtenderemos como dato o utilizaremos una funcin especficamente diseada para ello como
linspace o logspace.
linspace(base, limit, N)
Devuelve un vector fila con N elementos separados linealmente entre base y limit Ejemplo:
>> linspace(0,10,11) ans = 0 1 2 3 4 5 6 7 8 9 10
logspace(base, limit, N)
Similar a linspace excepto que los valores estn espaciados logartmicamente entre y .
Cuando un vector se opere con un escalar se operar con cada uno de los elementos del vector.
>> v = [1,2,3,4]; >> 3+v ans = 4 5 >> 3.*v ans = 3 6 6 7
12
Si los dos operandos son vectores el requisito fundamental es que ambos tengan el mismo tamao.
>> w = [8,7,6,5]; >> v+w ans = 9 9 >> v.*w ans = 8 14 9 9
18
20
Importante No existe una multiplicacin de vectores, la operacin anterior es operar los vectores elemento elemento, lo que corresponde ms a una tabla que a lo que se esperara de un vector. De hecho en Clculo Numrico no hay ninguna diferencia entre un vector y una simple lista de nmeros. Una operacin importante cuando se habla de vectores es el producto escalar, que se define como.
dot(u, v, dim)
Calcula el producto escalar de dos vectores. El tercer argumento, dim es de utilidad en el caso que alguno de los dos argumentos o ambos sean matrices.
Aunque sea mucho menos eficiente tambin podemos calcular ese producto escalar utilizando la definicin de la operacin y la funcin
sum.
sum(x, dim)
Suma los elementos de un vector. dim es de utilidad cuando el argumento sea una matriz.
>> sum(v.*w) ans = 60
Advertencia En muchos programas escritos en Matlab encontraremos el producto escalar escrito como
>> u'*v
Es una operacin vlida, aunque an no sepamos qu operaciones son el apstrofe y el asterisco sin punto respectivamente. El problema de no utilizar la funcin dot es que estamos utilizando una sintaxis ambigua, no sabemos si u y v son vectores, adems de ser una opreacin mucho ms propensa a fallar sin dar excesiva informacin del porqu. Recordad que la belleza es importante.
prod(x, dim)
Calcula el producto de los elementos de un vector. dim es de utilidad cuando el argumento sea una matriz. Una tcnica importante en Matlab es la concatenacin de dos vectores que puede hacerse simplemente pegndolos
>> a = [1,2,3]; >> b = [4,5,6]; >> [a,b] ans = 1 2 3 4 5 6
o utilizando la funcin cat. Ejercicio 5 Cuando Gauss contaba siete aos el profesor les puso un ejercicio para tenerlos entretenidos un rato. Cunto es la suma de todos los nmeros enteros entre 1 y 100? Gauss lleg fcilmente al reultado en slo unos pocos segundos porque vio que sumando pares de nmeros 1+99, 2+98, 3+97... La operacin poda reducirse a 50 99+100. Con Matlab se puede hacer la operacin por fuerza bruta de muchas maneras pero... Eres capaz de hacerlo con slo una lnea de cdigo? Ejercicio 6
El nmero
Cuntos trminos son necesarios para llegar a una precisin de ? Cunta es la precisin de la suma de 100 trminos?
Polinomios
Se define un polinomio de grado n como
(2) No es ms que una funcin en la que el valor de la variable se eleva sucesivamente a una potencia hasta n y se multiplica por una constante. Utilizando el smbolo del sumatorio la expresin anterior puede compactarse a:
Si nos fijamos un momento en la expresin (2) observaremos que un polinomio puede expresarse fcilmente en forma de vector utilizando sus coeficientes. El orden puede deducirse fcilmente con el nmero de coeficientes. Matlab utiliza vectores para expresar los polinomios con la nica salvedad que los almacena del modo inverso al que hemos escrito (2). El polinomio sera en Matlab
La operacin ms comn con un polinomio es evaluarlo en un punto dado, para ello utilizaremos la funcin polyval.
polyval(p, x)
Evala el polinomio p en el punto x
Ejemplo
>> p = [1, 0, -1, 1]; >> polyval(p,3) ans = 25
La importancia de los polinomios es que, siendo una funcin, todas las operaciones elementales (suma, resta, multiplicacin y divisin) pueden reducirse slo a operaciones con sus coeficientes. De esta manera podemos convertir operaciones simblicas en operaciones puramente numricas. Tomemos por ejemplo estas dos funciones: y . Sumar y restar estas dos funciones es trivial, pero no multiplicarlas. Como se trata de una operacin con coeficientes Matlab la har sin inmutarse
>> p = [4, 0, -1, 0]; >> q = [1, 0, 6]; >> conv(p,q) ans = 4 0 23 0
-6
conv(u, v) Calcula la convolucin de dos vectores de coeficientes. En el caso de vectores, la convolucin es la misma operacin que el producto.
Efectivamente
Dividir dos polinomios nos servir para aprender cmo tratar las funciones con dos argumentos de salida. De define la divisin de dos polinomios como
tiene como y el
deconv(u, v)
Calcula la deconvolucin de dos vectores de coeficientes. En el caso de polinomios esta operacin es equivalente al cociente del primero por el segundo. Devuelve dos argumentos, el cociente y el residuo.
>> c = deconv(p,q) c = 4 0
Hay otras operaciones que son operadores lineales aplicados a los polinomios como por ejemplo la derivada y la integral.
polyderiv(p)
Calcula los coeficientes de la derivada del polinomio p. Si le proporcionamos un segundo argumento q calcular la derivada del producto de polinomios.
roots(p)
Calcula las races del polinomio p. Las races no son slo importantes como solucin de la ecuacin sino que sirven, por ejemplo, para buscar factores comunes entre dos polinomios. Otra funcin bastante til para los que utilizan Matlab para el anlisis de sistemas dinmicos lineales es la funcin residue que calcula la descomposicin en fracciones parciales del cociente de dos polinomios
residue(p, q)
Calcula la descomposicin en fracciones parciales del cociente de dos polinomios p y q donde el primero es el numerador y el segundo el denominador. Por ejemplo
>> >> >> >> b = [1, 1, 1]; a = [1, -5, 8, -4]; help residue [r,p,k,e] = residue(b,a)
El vector r es el numerador de cada uno de los trminos, el vector p son los polos del sistema y el vector e es la multiplicidad de cada uno de los polos. Entonces la descomposicin en fracciones parciales ser:
Ejercicio de sntesis
Existe una manera de representar la forma de una funcin cualesquiera en un punto dado mediante un polinomio. Dicho polinomio converge con mayor orden en los alrededores del punto a medida que se van aadiendo trminos. Se trata del desarrollo de Taylor. La nica informacin que necesitamos de la funcin es su valor y el de sus derivadas en el punto dado expresin general es . La
Para entender mejor cmo este polinomio se ajusta a la funcin podemos utilizar el desarrollo de la funcin exponencial en .
Este polinomio puede crearse de muchas maneras pero posiblemente la ms sencilla sea utilizar los polinomios en Matlab para tener que generar slo los coeficientes.
>> exp_serie = @(x,n) polyval(1./ [factorial(linspace(n,1,n)),1],x) exp_serie = @(x, n) polyval (1 ./ [factorial(linspace (n, 1, n)), 1], x)
Nota Esta lnea de cdigo sirve para aprender una regla muy importante sobre cmo debemos escribir un programa. Las lneas demasiado largas son difciles de leer, por lo tanto son un peligro inclusopara nosotros mismos. Es recomendable romperlas en algn punto donde romperamos una operacin matemtica: despus de un operador, justo despus de abrir un parntesis. Para hacerlo debemos escribir tres puntos .... Podemos utilizar esta funcin para entender de un modo mucho ms visual el concepto de convergencia de una serie. Sabemos que a medida que
aadamos trminos el error que comete el desarrollo de Taylor cerca del punto se reduce. Pero de qu forma? Una confusin habitual es pensar que al aumentar orden del desarrollo aumenta la regin donde se acerca a la funcin pero esto slo es cierto accidentalmente. Slo existe una mayor convergencia cerca del punto. Para verlo mejor calcularemos el error de la aproximacin en los puntos 0.2 y 0.1 para distintos rdenes.
exp_serie = @(x,n) polyval(1./ [factorial(linspace(n,1,n)),1],x) x_01 = [exp_serie(0.1,1), exp_serie(0.1,2), exp_serie(0.1,3), exp_serie(0.1,4), exp_serie(0.1,5), exp_serie(0.1,6), exp_serie(0.1,7)]; x_02 = [exp_serie(0.2,1), exp_serie(0.2,2), exp_serie(0.2,3), exp_serie(0.2,4), exp_serie(0.2,5), exp_serie(0.2,6), exp_serie(0.2,7)];
disp('error en 0.1') err_01 = abs(exp(0.1)-x_01) disp('error en 0.2') err_02 = abs(exp(0.2)-x_02) disp('logaritmo del error en 0.1') logerr_01 = log(err_01) disp('logaritmo del error en 0.2') logerr_02 = log(err_02)
error en 0.1 err_01 = 5.1709e-03 1.7092e-04 4.2514e-06 8.4742e-08 1.4090e-09 2.0092e-11 2.5091e-13 error en 0.2 err_02 = 2.1403e-02 1.4028e-03 6.9425e-05 2.7582e-06 9.1494e-08 2.6046e-09 6.4932e-11 logaritmo del error en 0.1 logerr_01 = -5.2647 -8.6743 -12.3683 -16.2837 -20.3804 -24.6307 -29.0137 logaritmo del error en 0.2 logerr_02 = -3.8442 -6.5693 -9.5753 -12.8009 -16.2070 -19.7660 -23.4577
Podemos ver que si tomamos logaritmos la diferencia entre los valores permanece aproximadamente constante.