seminario de matlab
TRANSCRIPT
Ing. Andrés Marzo
Introducción.
Vectores.
Matrices.
Comandos y Funciones útiles.
Cadenas de Texto.
Scripts y Funciones.
Tipos de Datos.
Graficas 2D.
Estructuras de Control.
Graficas 3D.
Estructuras y Celdas.
GUI y GUIDE.
Data Acquisition.
Perfil de los participantes:
◦ Nombre
◦ Estudios.
◦ Expectativas del curso
◦ Conocimientos de Matlab, programación.
Objetivos al finalizar el curso
30 horas repartidas en 10 clases presenciales.
Certificado de aprobación: 70% en la calificación
Certificado de asistencia: 70% de asistencia al curso
Tópico Puntos
Prácticas 30%
Examen Teórico 20%
Examen Final 50%
Total 100%
Introducción
Lenguaje de Programación.
Alto Rendimiento.
Computación Técnica.
Computación, Visualización y Programación.
Problemas y soluciones en notación Matemática (de
Matrices).
Puede realizar funciones de computadora o lenguaje de
programación.
Combina calculo y visualización de graficas.
Relativamente fácil de aprender.
Es interpretado (no compilado), errores son fáciles de
solucionar.
Optimizado para ser rápido en operaciones con
matrices.
Tiene algunos elementos orientados a objetos.
No es un lenguaje de programación como C o C++.
Diseñado para computación científica.
Lenguaje interpretado, más lento que un compilador
como C.
Comandos son específicos para su uso en Matlab.
Matemáticas y Computación.
Desarrollo y Test de algoritmos.
Modelado, Simulación y Prototipos.
Análisis de Datos, exploración y visualización.
Gráficas de Ingeniería y Científicas.
Desarrollo de Aplicaciones finales (GUI)
Workspace & Directory
Command History
Barra de MenuCommand Window
clc
Clear
Exist(„Name‟)
Help name
Quit
Who, whos
Desde la ventana de comandos ingrese:
>> 2 + 3/4*5
¿Cual es el resultado? Observar ventana de comandos y el workspace
El símbolo % especifica un comentario.
No es ejecutado por Matlab.
>>%Esto es un comentario
>>x=2+3 % Suma
X=
5
No es necesario declarar variables.
Si no se especifica una variable en una operación, MATLAB usa la variable ans como una variable temporal.
>>2+3
ans=
5
Ejecute:
>> ans*5
Verifique el uso de variables y resultado
Las variables tienen un limite de tamaño de
nombre de 31 caracteres.
Deben empezar con una letra SIEMPRE.
NO deben contener caracteres especiales, salvo
el “guion bajo” _
Comando Descripción
ans Variable temporal que contiene la más reciente respuesta
eps Tolerancia numérica del Matlab
i,j Unidad imaginaria
Inf Infinito
NaN Resultado numérico indefinido
pi El número Π
1
Un simple número es un escalar.
Un escalar es un caso particular de un arreglo o
matriz.
Un “punto y coma” no permite que se imprima el
resultado en la ventana de comandos, solo se
guarda en el workspace.
Evaluar
>> x=2;y=6+x,x=y+7
Símbolo Operación Comando
^ Potenciación a^b
* Multiplicación ab A*b
/ División derecha a/b= a/b
\ División izquierda b/a
+ Suma a+b a+b
- Resta a-b a-b
ba
b
a
a
b
Vectores
Vectores que “se ven como filas”
Se definen con espacios o comas entre sus
elementos.
>>v = [ 1 3, sqrt(5)]
Verifique el resultado en el workspace.
>> length(v)
Verifique el resultado en el workspace.
Puede haber problemas con los espacios.
Ejecute:
v1 = [3+ 4 5]
Verifique el comportamiento
Ejecute:
v2 = [3 +4 5]
Verifique el comportamiento
Deben tener la misma dimensión para la suma.
>> v + v2
Pueden multiplicarse por un escalar.
>> v3 = 3*v
Pruebe:
>> v + v1
Se pueden formar vectores a partir de otros vectores (variables) ya definidos:
>> w = [1 2 3], z = [8 9]
>> cd = [2*z,-w], sort(cd)
Verifique el comportamiento.
Se puede recuperar (ver) el valor de un componente de un vector o cambiarlo haciendo uso de un índice.
El índice se define con el nombre de variable del vector y con los paréntesis para acceder a la posición del elemento a cambiar/ver.
>> w(2) = -2, w(3)
Ejecute:
>>1:10
Verifique el resultado.
Cual es la función del operador “:”?
De manera general a : b : c produce un vector con valor inicial a, valor final c e incrementos de b.
Se puede usar el operador : para definir vectores:
>> r5 = [1:2:6, -1:-2:-7]
Para obtener los elementos del 3 al 6
>> r5(3:6)
Cual será el resultado de?
>>r5(6:-2:1)
Vectores que se ven como columna.
Se definen usando “;”
Pruebe:
>> c = [ 1; 3; sqrt(5)]
>> c2 = [3
4
5]
Se puede convertir un vector fila en un vector columna y viceversa.
>> w, w', c, c'
Defina el vector complejo:
>> x = [1+3i, 2-2i]
La transpuesta para x corresponderá a la transpuesta conjugada.
Multiplicación de Vector Fila x Columna
>> u = [ 10, -11, 12], v = [20; -21; -22]
>> prod = u*v
Es una multiplicación Matricial!.
>> w = [2, 1, 3], z = [7; 6; 5]
>> u*w
Verifique ambos ejemplos.
El siguiente muestra dos maneras de obtener la norma (distancia euclidiana) de un vector:
>> [ sqrt(u*u'), norm(u)]
Corresponde al producto Hadamard.
Trabaja sobre vectores del mismo tipo (fila o columna).
>> u.*v‟
Tabulemos la función para
Se puede usar también para la división:
>> a = 1:5, b = 6:10, a./b
>> a./a
>> c = -2:2, a./c
>> a.*b -24, ans./c
Verifique el resultado.
cat(n,A,B,C,…)find(x)[u v w] = find(A)length(A)linspace(a,b,n)logspace(a,b,n)max(A)[x,k] = max(A)min(A)[x,k] = min(A)size(A)sort(A)sum(A)
Matrices
Ingrese en la ventana de comandos:
>>A = [ 16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1 ]
Verifique el resultado.
Use la flecha “hacia arriba” y reemplace los
espacios en blanco con “comas”.
Verifique el resultado.
Ejecute: A‟
Verifique el resultado
Subíndices será la manera de acceder a un elemento de una matriz.
Usa los paréntesis y el nombre de la variable.
>>A(1,4)
Verifique el resultado y la relación con A.
>>A(1:4,4)
Verifique el resultado.
Ejecute:
>>A(:,4)
Verifique el resultado?
Cual es la función del operador “:” manejando subíndices?
Se puede utilizar el operador : para generar matrices:
>> D = [1:5; 6:10; 11:2:20]
Verifique el resultado anterior.
En MATLAB en general todos son arreglos.
Un vector columna será una matriz de mx1.
Un vector fila será una matriz de 1xn.
El comando size nos devuelve la dimensión de la matriz que se usa como parámetro.
>> size(A)
>> size(ans)
El ultimo comando muestra que el valor retornado por size es en si mismo una matriz de 1x2.
También se puede guardar las dimensiones de una matriz en variables separadas.
>> [r c] = size(A'), S = size(A')
Verifique los valores de r y c y de S.
Verifique también los tipos de dato (arreglo) de dichas variables.
MATLAB provee algunas funciones propias de un tamaño deseado.
ones(m,n) da una matriz de mxn llena de unos.
>> P = ones(2,3)
zeros(m,n) da una matriz de mxn llena de ceros.
Z = zeros(2,3)
Es una matriz de ceros pero en su diagonal principal esta llena de unos.
>> I = eye(3), x = [8; -4; 1], I*x
Note que eye(3) es una matriz cuadrada identidad.
Verifique el resultado de I*x.
Por otro lado si A es una matriz el comando diag(A) extrae la diagonal principal de dicha matriz, incluso si la matriz A no es cuadrada.
>> F = [0 1 8 7; 3 -2 -4 2; 4 2 1 1]
>> diag(F)
A veces es necesario generar matrices grandes a partir de otras mas pequeñas (o vectores).
>> C=[0 1; 3 -2; 4 2]; x=[8;-4;1];
>> G = [C x]
>> G1 = [C ; x‟]
Se pueden construir matrices usando también funciones y operaciones sobre matrices:
>> J = [1:4; 5:8; 9:12; 20 0 5 4]
>> K = [ diag(1:4) J; J' zeros(4,4)]
Pruebe el siguiente comando:
>> spy(K), grid
Grafica la escasez del patrón en la matriz
Indica el ultimo elemento.
Ejemplo:
A = magic(5)
B = A(end,2:end)
Verifique el resultado.
X = ones(r,c) % Crea matriz de unos
X = zeros(r,c) % Crea matriz de ceros
A = diag(x) % Crea matriz cuadrada xondiagonal x
[r,c] = size(A) % Retorna las dimensiones de la matriz
+ - * / % Operaciones standard
.+ .- .* ./ % Operador .
v = sum(A) % Vector con la suma de lascolumnas
X = A‟ % Matriz transpuesta X = inv(A) % Matriz inversa de una matriz
cuadrada X = pinv(A) % Pseudo inversa X = chol(A) % Descomposicion Cholesky d = det(A) % Determinante [X,D] = eig(A) % Eigenvalores y eigenvectores [Q,R] = qr(X) % Descomposición QR [U,D,V] = svd(A) % Descomposicion a un
simple valor
Condición necesaria y suficiente para que una matriz sea invertible es que no sea singular, es decir, que su determinante sea no nulo |A| ≠ 0 <----> det(A)~=0
En Matlab:
>>inversaA=inv(A)
¿Cómo compruebo?
Comandos y Funciones útiles
Expresiones Matemáticas elementales:
>> help elfun
Expresiones Matemáticas especiales:
>>help specfun
Expresiones de Matrices elementales:
>>help elmat
Para genera números aleatorios usamos las funciones:
rand, randn, randint.
Verifique el uso de:
>> rand(2)
>> randn(2)
>> randint(2,2,[-4 4])
Para genera números aleatorios usamos las funciones:
rand, randn, randint.
Verifique el uso de:
>> rand(2)
>> randn(2)
>> randint(2,2,[-4 4])
Se utiliza el comando sum.
Genere un matriz para probar los siguientes comandos:
El comando find devuelve una lista con las posiciones de los elementos de un vector que satisfacen una determinada condición.
>> x = -1:.05:1;
>> y = sin(3*pi*x).*exp(-x.^2);
>> k = find(y > 0.2)
Verifique el contenido de k e interprételo.
Opera de manera muy similar en matrices:
>> A = [ -2 3 4 4; 0 5 -1 6; 6 8 0 1]
>> k = find(A==0)
Verifique e interprete el contenido de k.
Find en una matriz realmente primero reordena (reshape) la matriz en un vector para buscar.
Los índices del reordenamiento de la matriz quedan:
>> n = find(A <= 0)>> A(n) “n” devuelve una lista de las posiciones de la
matriz A que cumplen ser menores que cero, luego A(n) nos devuelve los valores de los elementos seleccionados.
En computación, la operación modulo encuentra el residuo de la división de un numero a otro.
En Matlab:
Se manejan complejos automáticos:
>> c=15+sqrt(-1)
Y valores “excepción” correctamente:
>> a=123/0
>> b=0/0
>> Inf-Inf
Representar el siguiente polinomio en Matlab: s3 + 2s2 + 3s + 4
>> p=[1 2 3 4];
Roots(p) < --- > Encuentra las raíces del polinomio
De modo complementario, se puede calcular un polinomio a partir de sus raices usando la funcion poly:
p2=poly([-1 -2]);
Un polinomio puede ser evaluado en un punto determinado usando polyval(p,s), donde p es el polinomio y s es el punto donde va a ser evaluado. Por ejemplo:
>>p2=[1 3 2]; a=[1 2; 3 4]; polyval(p2,a)
Si se introduce un vector o una matriz, en lugar de un valor individual, la evaluacion se hace elemento a elemento.
Podemos realizar cómodamente operaciones de multiplicación y división de polinomios mediante las funciones conv y deconv.
>>conv([1,2],[2,0])
La función residue, descompone el cociente de una fracción en fracciones parciales.
Teniendo un cociente de la forma:
La función es:
>>[r,p,k] = residue(b,a)
Entrega los resultados para:
Descomponga:
En fracciones parciales:
>> b=[1 1 1 2];
>> a=[1 0 3 0 2];
>> [r,p,k]=residue(b,a)
El resultado será:
En fracciones parciales:
>> b=[1 1 1 2];
>> a=[1 0 3 0 2];
>> [r,p,k]=residue(b,a)
El resultado será:
Use representación en MATLAB para resolver un sistema lineal del tipo
Ejemplo Práctico: Circuito eléctrico
Ejemplo Práctico: Circuito eléctrico
Leyes de Kirchof:
-V1+R1*i1+R4*i4=0
-R4*i4+R2*i2+R5*i5=0
-R5*i5+R3*i3+V2=0
i1=i2+i4
i2=i3+i5
Ejemplo Práctico: Circuito eléctrico
(R1+R4)*i1-R4*i2 =V1
-R4*i1+(R2+R4+R5)*i2-R5*i3=0
R5*i2-(R3+R5)*i3 =V2
Tenemos 3 ecuaciones y 3 incógnitas (i1,i2,i3)
¿Cuál es la corriente en cada ramal del circuito?
La función INPUT imprime un mensaje en la ventana de comandos y devuelve el resultado de una expresión tecleada por el usuario.
INPUT espera hasta que el usuario ingrese un valor numérico o una expresión
Cualquier expresión válida de MATLAB es aceptada por INPUT.
>> edad = input(„Ingrese la edad: ')
En el caso que sea una cadena de texto es recomendable:
>> nombre = input('¿Cómo te llamas?','s')
La función DISP imprime un mensaje en la ventana de comandos, puede ser un mensaje de texto o variables.
>> disp('El programa ha terminado')
>> A=rand(4,4)
>> disp(A)
Funciones para problemas de Integración numérica:
quad, quad8.
Solución de Ecuaciones Diferenciales.solver,ode23, ode45 y muchos otros.
Solución de Ecuaciones No linealesfmin, fsolve, etc.
InterpolaciónSpline,etc.
Scripts y Funciones
Son archivos de texto (.m) que contienen
comandos de MATLAB.
Para ejecutar los comandos de ese archivo se
debe escribir el nombre del archivo en la ventana
de comandos.
Las variables y resultados son de ámbito
GLOBAL.
Debe estar contenido en el directorio actual para
poder ejecutarlo (F5 o como comando).
Los nombres de los scripts deben seguir la regla
de las variables de MATLAB.
Mucho ojo con los espacios.
El nombre del script no debería interferir con alguna función o con una variable (error común).
Los comentarios en MATLAB se generan con el símbolo %:
>> %Esto es un comentario
Puede existir aplicaciones que requieran a los mismos datos frecuentemente
A=[2,4;7,9]
Son “user-defined” a diferencia de las “built-in”, también escritas en .m.
Las buit-in también son llamadas funciones de llamada.
Las user-defined son llamadas funciones de definición.
SIEMPRE reciben parámetros para realizar los cálculos.
Los comandos dentro de las funciones operan sobre los parámetros.
Las variables y resultados son de ámbito LOCAL.
Los .m de funciones deben encontrarse en el directorio actual para poder ser llamadas.
Luego de ser creadas y siempre que estemos en el directorio actual donde esta contenido el .m de la función de definición, entonces la función se convertirá en de llamada.
También se puede agregar funciones de definición a MATLAB.
El nombre de la función no DEBERIA interferir con alguno de una “buit-in”, ni de otra variable (error común).
El nombre del archivo .m conteniendo a la definición de la función DEBE ser igual al nombre de la función.
La primera línea del archivo debe tener el formato:
Luego de esta línea se puede documentar la función usando comentarios.
Cuerpo de la Función:
function [out1,out2,...] = nombre_fichero(in1,in2,...)
% Comentarios adicionales para el help
comandos de MATLAB
return;
Sabiendo que la resistencia equivalente de 3 resistencias conectadas en serie
es:rT= r1 + r2 + r3Y que si dichas resistencias se conectan en
paralelo, entonces su resistencia equivalente es:
1/rT = 1/r1 + 1/r2 + 1/r3Escribir una función tal que dadas 3
resistencias calcule su resistencia equivalente conectadas en paralelo y en serie.
Escriba una función que convierta la temperatura en grados Fahrenheit (ºF) a grados centígrados (ºC): Use la función input y fprintf mostrando una mezcla de texto y números. Recuerde que la formula de conversión es C = 5/9 * (F-32).
Escriba una función en Matlab, con 2 entradas y 2 salidas que determine la altura en centímetros y masa en kilogramos de una persona de altura en pulgadas y peso en libras.
Determine en unidades de SI la altura y peso de una persona de 5 ft.15 in que pesa 180 lb.
Tipos de Datos
>>tipo= class(x)
Nos devuelve el tipo de dato de “x”.
También existen comandos que nos dan
información lógica sobre cada tipo:
isinteger(x), isfloat(x), ischar(x), islogical(x),
iscell(x), isstruct(x).
isempty(x), isnan(x), isinf(x).
El tipo de Dato entero corresponde:
El tipo de Dato float corresponde:
Para convertir se usa el nombre del tipo a generar como si fuera función:
>> a = 522.08
>> int8(a)
>> int16(a)
Verifique el redondeo.
round: redondea al entero mas proximo.
floor: redondea a –inf.
ceil: redondea a +inf.
fix: redondea hacia cero.
>> x = pi*(-1:3), round(x)
>> fix(x)
>> floor(x)
>> ceil(x)
>> sign(x), rem(x,3)
MATLAB maneja el tipo Carácter.
Una cadena es un vector de caracteres.
Un Texto es una matriz de caracteres.
>> t1 = 'A'
Asigna el valor de „A‟ al arreglo de carácter 1x1 t1.
>> t2 = 'BCDE'
Asigna el valor BCDE al arreglo de caracteres 1x4 t2.
Las cadenas creadas se pueden tomar como arreglos regulares y manipularlos.
>> t3 = [t1,t2]
El direccionamiento funciona como en vectores:
Asigne:
>> t4 = [t3,' are the first 5 ';...
'characters in the alphabet.']
Asigna el valor:
'ABCDE are the first 5 '
'characters in the alphabet.'
Asigne:
>> t4 = [t3,' are the first 5 „,...
'characters in the alphabet.']
Asigna el valor:
'ABCDE are the first 5 '
'characters in the alphabet.'
Al arreglo de 2x27 t4, es NECESARIO que ambas filas del arreglo tengan el mismo numero de caracteres (elementos), eso es una regla general de arreglos en MATLAB.
Los … significan que el comando continua en la línea siguiente.
Todo carácter tiene un equivalente en valor numérico.
str2num convierte una cadena a su correspondiente representación numérica.
int2str y num2str convierte respectivamente un entero y un numero real a su correspondiente cadena de caracteres.
Deseamos generar la cadena: „El valor de pi es 3.1416'.
[„El valor de pi es ',num2str(pi)].
Otro ejemplo:
>> N = 5; h = 1/N;
>> ['The value of N is ',int2str(N),...
', h = ',num2str(h)]
El operador == realiza comparaciones entre vectores (elemento a elemento)
Graficas
“Una imagen vale mas que mil palabras”.
Es más fácil identificar patrones en una grafica
que en una tabla con números.
Ingenieros frecuentemente usan gráficas para
comunicar sus ideas a otros de una mejor
manera.
Graficar, tiene sus reglas que un ingeniero debe
seguir para presentar conclusiones correctas
acerca de los datos presentados
1. Cada eje debe ser etiquetado con la cantidad graficadas y las unidades.
2. Usar espaciado adecuado. No muy disperso, no muy denso.
3. Si se grafican 2 curvas, cada una debe tener una leyenda que lo identifique.
4. Si se van a usar múltiples graficas, use un titulo para cada una.
5. Si esta graficando cada medida de datos, diferencia cada uno con un símbolo como circulo, punto, triangulo.
6. Algunas veces, los símbolos están unidos por líneas que ayudan a visualizar los datos, especialmente si hay pocos puntos. Para hacer esto, es necesario tener conocimiento de que sucede entre cada punto.
7. Si está graficando puntos generados por la evaluación de una función, no use un símbolo para graficar los puntos. Use líneas continuas.
6. Algunas veces, los símbolos están unidos por líneas que ayudan a visualizar los datos, especialmente si hay pocos puntos. Para hacer esto, es necesario tener conocimiento de que sucede entre cada punto.
7. Si está graficando puntos generados por la evaluación de una función, no use un símbolo para graficar los puntos. Use líneas continuas.
La forma basica en Matlab para realizar una grafica XY es plot(x,y).
Si x y y son vectores, una curva es graficada con los valores de x en la abscisa y y en la ordenadas.
x=[0:0.1:52];y=0.4.*sqrt(1.8*x);plot(x,y);xlabel(„Distancia (Km)‟);ylabel(„Altura(Km)‟);title(„‟Altura del cohete en función de su distancia
al suelo);
Otra forma:
x=[0:0.1:52];
y=0.4.*sqrt(1.8*x);
plot(x,y);
xlabel('Distancia (Km)'),ylabel('Altura(Km)'),...
title('Altura del cohete en función de su distancia al suelo');
>> x = 0:pi/100:2*pi;
>> y = sin(x);
>> plot(x,y)
Para graficar y=sin(3*pi*x) para el rango [0,1] se muestrea la función a un numero suficientemente grande de puntos y luego se los une con líneas rectas.
Para tomar N+1 puntos igualmente espaciados a una distancia h:
>> N = 10; h = 1/N; x = 0:h:1;
>> y = sin(3*pi*x);
>> plot(x,y)
Verifique el gráfico e identifique que el numero N es muy pequeño aun.
Cambie N=100 y verifique el resultado
El “seno” es una función continua.
MATLAB trabaja con datos discretos.
PLOT realiza una interpolación lineal entre esos datos para graficar.
Mayor cantidad de puntos (muestras) harán que la gráfica sea prácticamente “continua”.
Grafica líneas de guía dependiendo el correspondiente “tick label”.
>>grid
>>grid on
>>grid off
Con el comando axis Matlab selecciona los limites de los ejes.
Sintaxis: axis[(xmin xmax ymin ymax)]
Notar que a diferencia de un arreglo, no se pueden usar comas.
Variantes:
>>axis square
>>axis equal
>>axis auto
Con el comando axis Matlab selecciona los limites de los ejes.
Sintaxis: axis[(xmin xmax ymin ymax)]
Notar que a diferencia de un arreglo, no se pueden usar comas.
Variantes:
>>axis square
>>axis equal
>>axis auto
Con el comando axis Matlab selecciona los limites de los ejes.
Sintaxis: axis[(xmin xmax ymin ymax)]
Notar que a diferencia de un arreglo, no se pueden usar comas.
Variantes:
>>axis square
>>axis equal
>>axis auto
Si y es un complejo, plot(y) grafica la parte imaginaria vs la parte real. En este caso plot(y) es
z=0.1+0.9i;
n=[0:0.01:10];
plot(z.^n),xlabel('Real'),ylabel('Imaginario')
igual a plot(real(y),imag(y))
Matlab automaticamente analiza la función que será graficada y decide cuantos puntos se usará de tal manera que se muestren todas las características de la función.
Sintaxis:
>>fplot(„string‟,[xmin xmax])
„string‟: Describe la función a ser graficada.
[xmin xmax] : Valores mínimo y máximo de la variable independiente.
f='cos(tan(x))-tan(sin(x))';
fplot(f, [1 2])
Realice el ejemplo anterior con el comando plot.
Otra forma de usar fplot es la siguiente:
>>[x y]= fplot('string', limites)
Donde limites puede ser [xmin xmax] o [xminxmax ymin ymax].
Retorna los valores de la abscisa y ordenada en un vector columna para x y y.
Se puede graficar polinomios fácilmente usando la
función polyval, la cual evalúa el polinomio en los
valores especificados por la variable
independiente.
Esto es útil para no tener que escribir toda la
expresión del polinomio.
Ejemplo:
x=[-6:0.01:6];
p=[3,2,-100,2,-7,90];
plot(x,polyval(p,x)),xlabel('x'),ylabel('p')
Plot puede recibir un tercer argumento.
Tercer argumento es una cadena que recibe como
primer carácter el color y segundo el estilo de
línea.
plot(x,y,'style_color_marker')
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
y2 = sin(x-.25);
y3 = sin(x-.5);
plot(x,y,x,y2,x,y3)
legend('seno(x)','seno(x-.25)','seno(x-.5)')
Cada llamado de la función PLOT es una petición
para crear un nuevo “eje” (axis – ventana donde
se contiene el gráfico).
Cada llamado de PLOT entonces reemplazará la
gráfica anterior.
>>hold on
“Mantiene” el gráfico actual en el eje actual.
Se puede llamar muchas veces a PLOT pero no
se reemplazará el gráfico hasta que exista un:
>>hold off
Ejercicio:
Realizar el ejemplo anterior usando comando hold.
Realice:
Matlab puede crear figuras que contengan un
arreglo de graficas, llamadas subplots. Estas son
útiles por ejemplo cuando tenemos que comparar
los mismos datos pero con diferente tipo de ejes.
Divide la ventana de graficos en un arreglo mxn en donde se pueden plotear mxngráficos.
Se enumeran de izquierda a derecha, de arriba hacia abajo.
Sintaxis:
Subplot(m,n,p)
Este comando divide la ventana en un arreglo
rectangular de m filas y n columnas.
La variable p le dice a Matlab donde va a colocar la
respectiva figura del comando plot.
clf, limpia la figura actual.
close 1, cierra la ventana llamada “Figure 1”.
figure, abre una nueva ventana.
figure(9), abre una nueva ventana “Figure 9”.
Para crear una leyenda use el comando legend.
>>legend(„string1‟,‟string2‟).
Este comando automáticamente obtiene de la grafica el tipo de línea usado para cada curva o datos.
Ejemplo: x=[0:0.01:2];
y=sinh(x);
z=tanh(x);
plot(x,y,x,z,'--'),xlabel('x'),...
ylabel('hiperbolico seno y tangente')
legend('sinh(x)','tanh(x)')
Otra forma de distinguir curvas es colocando una
etiqueta junta a cada una.
Se utiliza el comando gtext, que permite ajustarla
usando el mousse o con el comando text que
requiere que se le especifique las coordenadas.
>>gtext(„string‟)
>>text(x,y,‟string‟)
Ejemplo:
Todas las propiedades de cada objeto del gráfico
(figura, ejes, elemento gráfico,...) están guardadas
en "handles“
gcf current figure, gcacurrent axis
get(handle) muestra todos las propiedades que se
pueden cambiar.
set(handle,'PropertyName','Value',...) cambia propiedades.
Para personalizar el eje x sin dependencia del vector:
set(gca,'Xtick',[1 2 3 4 5 6]);
set(gca,'XtickLabel',['ene';'feb';'mar';'abr';'may';'jun']);
>>x=[1 3 5 9 1 1 6 8 2 3 6 1 2 9 3 4 9 8];
>>hist(x)
>>figure
>>bar(x)
Interprete los resultados.
La función polyfit(x,y,n) de Matlab calcula la aproximación lineal por mínimos cuadrados de un conjunto de puntos dados en los vectores x e y. La aproximación lineal se logra haciendo n=1.
Ejemplo:
x = [0.1, 0.4, 0.5, 0.7, 0.7, 0.9];
y = [0.61, 0.92, 0.99, 1.52, 1.47, 2.03];
c = polyfit(x,y,1)
c1 = x(1):0.1:x(length(x))
c2 = polyval(c,c1)
plot(c1,c2);hold on
plot(x,y,'x')
axis([0,1,0,2.1])
xlabel('x')
ylabel('y„)
x = [0.1, 0.4, 0.5, 0.7, 0.7, 0.9];
y = [0.61, 0.92, 0.99, 1.52, 1.47, 2.03];
c = polyfit(x,y,1)
a = input('escriba el valor de c1 : ')
b = input('Escriba el valor de c2 : ')
g = a.*x + b
plot(x,g,'xg',x,g,'m')
axis([0,1,0,2.1])
xlabel('x')
ylabel('y')
text(0.35,1.8, 'g(x) = a*x + b ')
La temperatura del café en una taza de porcelana a la temperatura del cuarto (68ºF) fue medida varias veces resultando en la tabla:
Desarrolle un modelo de la temperatura del café como una función del tiempo y use el modelo para estimar cuanto le tomaría alcanzar la temperatura de 120ºF
Tiempo (seg) Temperatura (ºF)
0 145
620 130
2266 105
3482 90
Graficas 3D
También se basa en graficar puntos:
>> t=0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t)
Esta gráfica es paramétrica.
Un solo parámetro resulta en una gráfica de linea. Se extiende la etiqueta zlabel(„texto‟)
Se deben generar los valores a graficar, estos deben ser una matriz.
Ejemplo:
>> z = peaks(10)
>> plot(z)
>> mesh(z)
>> contour(z,10)
>> surf(z)
Se puede cambiar “la vista” desde la ventana de comandos:
>> view(0,0)
>> view(90,0)
Una superficie también se define matemáticamente con una función f(x,y).
Para cada valor de (x,y) se calcula “la altura” de la función: z = f(x,y).
Para graficar esto debemos definir un rango de “x” y de “y” para el gráfico.
Definiendo el dominio:
x = 2:0.5:4; y = 1:0.5:3;
Definido el dominio debemos definir la “grilla” de valores que servirán de los puntos (x,y) para graficar.
Esto es como relacionar “x” y “y”.
>> [X,Y] = meshgrid(2:.5:4, 1:.5:3);
>> X
Si tomamos el i-esimo punto desde la izquierda y el j-esimo punto desde debajo de la grilla como el correspondiente (i,j) entrada en una matriz, entonces (X(i,j),Y(i,j)) serían las coordenadas de ese punto.
Grafique la siguiente función:
>> [X,Y] = meshgrid(2:.2:4, 1:.2:3);
>> Z = (X-3).^2-(Y-2).^2;
>> mesh(X,Y,Z)
>> title(„Silla'), xlabel('x'),ylabel('y')
Grafique la siguiente superficie:
Encuentre los valores máximos de la función.
>> [X,Y] = meshgrid(-2:.1:2,-2:.2:2);
>> f = -X.*Y.*exp(-2*(X.^2+Y.^2));
>> figure (1)
>> mesh(X,Y,f), xlabel('x'), ylabel('y'), grid
>> figure (2), contour(X,Y,f)
>> xlabel('x'), ylabel('y'), grid, hold on
Para encontrar los máximos:
>> fmax = max(max(f))
>> kmax = find(f==fmax)
>> Pos = [X(kmax), Y(kmax)]
>> plot(X(kmax),Y(kmax),'*')
>> text(X(kmax),Y(kmax),' Maximo')
x=[-20,-10,-5,-2,-1,0,1,2,5,10,20]/10;
y=x;
[X,Y]=meshgrid(x,y);
Z=cos(X)+cos(Y);
subplot(3,1,1)
surf(Z);
axis([0 11 0 11 0 2])
subplot(3,1,2)
surf(x,y,Z);
subplot(3,1,3)
surf(X,Y,Z);
Programando con Matlab
Operadores Lógicos.
Realizar funciones cuyas acciones dependan del
resultado de otras operaciones.
Repetir cálculos un número especifico de veces o
hasta que una condición se satisfaga.
Operador Relacional Significado
< Menor que
<= Menor o igual a
> Mayor que
>= Mayor o igual a
== Igual a
~= No igual a
Operador Nombre Definición
~ NOT ~A retorna 1‟s cuando sea 0 y 0‟s cuando sea 1
& AND A&B: retorna 1‟s cuando A y B no son cero y retorna cero cuando A y B no son cero.
| OR A|B retorna 1‟s cuando al menos un elemento de A o B sea 1. Caso contrario retorna 0.
Xor(A,B) Exclusive OR Xor(A,B) retorna 1 cuando los elementos de A o B son diferentes de 0. Caso contrario retorna 0.
1. Paréntesis.
2. Operadores aritméticos y NOT. Evaluados de
izquierda a derecha.
3. Operadores Relacionales, evaluados de
izquierda a derecha.
4. Operadores Lógicos, evaluados de izquierda a
derecha.
La declaracion condicional en Matlab nos permite escribir programas que tomen decisiones.
Contienen uno o mas declaraciones of, elsey elseif.
La declaración end determina el fin de una declaración condicional.
if expresiones lógicasDeclaraciones
end
Evalúa una condición lógica y si dicha expresión evalúa un
resultado POSITIVO (1) entonces “selecciona” ejecutar
un grupo de instrucciones, sino evalúa otro grupo o
sale de la condición.
if expr1
comandos_matlab
elseif expr2
otro_comandos_matlab
...
else
otros_comandos_matlab
end
t = rand(1)
if t >0.5
disp(“valor es mayor que 0.5”)
elseif t <0.25
disp(“valor es menor que 0.25”)
else
disp(“valor está entre 0.25 y 0.5”)
nd
El uso de lazos es o debería ser MUY LIMITADO en MATLAB por el uso del operador :
Los lazos son grandes consumidores de tiempo.
Tareas de optimización regularmente se encargan de evitar los lazos.
Se recomienda para: Repetir la ejecución de comandos por un número definido de veces.
for variable = expresión
comandos_matlab
end
“expresión” debe definir el número de veces que se ejecutan los comandos, variable controla ese numero de repeticiones.
Imprimir el cuadrado de los 5 primerosnúmeros naturales:
for i=[1, 2, 3, 4, 5]
disp(i^2)
end
Otra forma de usar el for:
“for i=1:5”
Imprimir el cuadrado de los númerosdecimales de una cifra decimal de 0 a 1, enforma decreciente, es decir empezando por1, 0.9, 0.8, ... 0.1, 0:
for i=1:-0.1:0
disp(i^2)
end
Uso de Matriz para asignar valores
matriz = [ 1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]
for x = matriz
x
end
Creación de subplots usando FOR.
>> x = -1:0.05:1;
>> for n = 1:8
>> subplot(4,2,n), plot(x,sin(n*pi*x))
>> end
El comando find es otro ejemplo de un lazo implicito. La declaración y=find(x>0) es equivalente a:
x=[0:20];
j=0;
for i=1:length(x)
if x(i)>5
j=j+1;
y(j)=i;
end
end
Se usa regularmente cuando no se conoce en primera instancia cuantas repeticiones se deben ejecutar.
Las repeticiones dependerán de la expresión condicional que se evalúa.
MIENTRAS se cumpla sigue la repetición.
while expresión
comandos_matlab
end
Imprimir el valor de x, mientras este seapositivo, decrementando cada vez x en 17:
x = 100
while x >0
disp(x)
x = x - 17;
end
Alternativa a if, elseif y else.
switch expresion de entrada(escalar o string)
case valor1
declaraciones1
case valor2
declaraciones2
…
otherwise
declaracionesn
end
Alternativa a if, elseif y else.
switch expresion de entrada(escalar o string)
case valor1
declaraciones1
case valor2
declaraciones2
…
otherwise
declaracionesn
end
Break: Para romper un lazo.
Continue: Puede ser usado para salir de un lazo
for y pasar inmediatamente a la siguiente iteración
del lazo, saltando las declaraciones que falten.
Return: Para salir y retornar los valores actuales
en la función
Hipermatrices
Matrices de mas de dos dimensiones.
El tercer subindice representa la tercera dimensión: “La profundidad de la hipermatriz”.
Se muestra a continuación cómo organizar las matrices x1 y x2 de 3x3 en dos páginas, o sea en un arreglo x de 3x3x2. (La variable x debe estar inicialmente vacía o no existir):
x1=[1 2 3; 4 5 6; 7 8 9]
x2=[10 20 30; 40 50 60; 70 80 90]
x(:,:,1)=x1;
x(:,:,2)=x2;
La información quedará organizada como se muestra en la figura:
Creación a partir de otras matrices de dos dimensiones:
A(:,:,1)=[1 2 3; 4 5 6]
A(:,:,2)=[2 3 4; 5 6 7]
Las funciones comunes para uso con matrices, también pueden manejar hipermatrices.
M=randn(2,3,2)M(:,:,1) =
-0.4326 0.1253 -1.1465-1.6656 0.2877 1.1909
M(:,:,2) =
1.1892 0.3273 -0.1867-0.0376 0.1746 0.7258
>> A=zeros(2,3); B=ones(2,3); Por su naturaleza la concatenación se realiza a través
de funciones.
¿Recuerdan la función CAT?
La función cat concatena arreglos.
Recibe 3 parámetros el primero es la dimensión a lo largo de la cual concatenará 2 matrices pasadas como parámetros.
cat(2,A,B) <--->[A,B].
cat(1,A,B) <--->[A;B].
¿Y cat(3,A,B)?
Tienen reglas especiales para usar funciones con ellas.
Todas las funciones de MATLAB que operan sobre escalares (sin(), cos(), etc.) se aplican sobre hipermatrices elemento a elemento (igual que sobre vectores y matrices).
Las funciones que operan sobre vectores(sum(), max(), etc.) se aplican a matrices ehipermatrices según la primera dimensión,resultando un array de una dimensióninferior.
Las funciones matriciales propias del ÁlgebraLineal (det(), inv(), etc.) no se pueden aplicar ahipermatrices. Para poderlas aplicar hay queextraer primero las matricescorrespondientes (por ejemplo, con eloperador dos puntos (:)).
reshape(x, 3, 6);
Interprete los resultados.
Estructuras y Celdas
Permiten guardar valores de diferente tipo de dato
bajo un mismo nombre.
Organizan la información, siguen un modelo de
campo-valor.
El acceso a los elementos de cada una de las
claves se hace con “.”
>> punto.x=2
>> punto.y=3
>> punto.color='rojo„
>> punto
Se pueden crear también vectores de Estructuras:
>> punto(2).x=4, punto(2).y=5, punto(2).color='verde'
Verifique el direccionamiento:
>> punto(1), punto(2)
Y el direccionamiento de campos:
>> campo = „x‟
>> punto.(campo)
Verifique el direccionamiento:
>> punto(1), punto(2)
Y el direccionamiento de campos:
>> campo = „x‟
>> punto.(campo)
Construye un arreglo donde cada elemento
puede ser de un tipo diferente.
>> c={12,'Red',magic(4)};
Verifique el contenido de c en el workspace
Se utilizan llaves { } en lugar de corchetes [ ] o
paréntesis ( )
>> b{1}=12;
>> b{2}='Red';
>> b{3}=magic(4);
La diferencia con las estructuras es que se
accede a los valores utilizando un índice en
lugar del nombre del campo.
Trabajar con estructuras es ineficiente
a{1,1} = 12;
a{1,2} = 'Red';
a{1,3} = magic(4);
a{2,1}=ones(3);
a{2,2}=43;
a{2,3}='texto';
Utilizando ( ) accede a un elemento, que es tipo
cell.
Utilizando { } accede al valor.
Verifique los tipos con:
class(a)
class(a(1,1))
class(a{1,1})
Interacción de Matlab con otros
programas
xlswrite(„Archivo', [12.7 5.02;-98 63.9])
d = {'Tiempo', 'Temp'; 12 98; 13 99; 14 97};
s = xlswrite(„file.xls', d, 'Temperaturas', 'E1')
[tipo, hojas] = xlsfinfo(„file.xls„)
[ndata, headertext] = xlsread(„file.xls', „Hoja‟)
A = xlsread(„file.xls', 1, 'A4:B5')
Crear un script que permita leer este archivo
Imagenes
[x,map]=imread('figura.jpg');
image(x)
colormap(map)
a = magic(4);
image(a);
map = hsv(16);
colormap(map)
colorbar
Matlab provee 2 maneras de generar graficas animadas:
1. On the fly – Borra continuamente y redibuja el objeto en la with each redraw.
2. Frame by frame capture and playback –Graba un número de diferentes figuras y luego los reproduce como si fuiera unapelicula..
Animación fly:t = 0:0.01:10*pi; x = t.*sin(t); y = t.*cos(t);axislimits = [min(x) max(x) min(y) max(y) min(t)
max(t)];line_handle = plot3(x(1), y(1),t(1), 'ko', ...'MarkerFaceColor',[.49 1 .63], 'MarkerSize',12);set(line_handle, 'erasemode','xor');axis(axislimits);grid onfor i = 2:length(x)
set(line_handle, 'xdata',x(i), 'ydata', y(i), 'zdata', t(i));drawnow;
end
Frame by frame
[x,y] = meshgrid([-10:0.5:10]);
for j = 1:15
z = bessel(0, (j-1)*0.2 + sqrt(x.^2 +y.^2));
surf(x,y,z)
axis([-10 10 -10 10 -.5 1])
M(j) = getframe;
end
frame_order = [1:15 14:-1:1];
number_repeats = 5;
movie(M, [number_repeats frame_order]);
GUI
GUI (Graphical User Interface) es util para
presentar el desarrollo final de un programa.
Adhiere usabilidad al ajuste de parámetros y
visualización de un programa
La elaboración de GUI se puede realizar de dos
formas: Código a través de un script
GUIDE que es la herramienta de diseño de MatLAB.
Ejecutar el comando guide en Matlab pàrainiciar.
Se tiene un formulario en blanco al cual se puede agregar CONTROLES.
Se debe antes preparar un diseño de la GUI
Se desea crear una GUI que realice un PLOT de una función determinada.
Primero se ubican los controles básicos para el programa del menu: axes, static text, editbox, button.
Se desea crear una GUI que realice un PLOT de una función determinada.
Primero se ubican los controles básicos para el programa del menu: axes, static text, editbox, button.
Axes: un espacio para dibujar.
Static text: texto que se adhiere a la
pantalla y el usuario no puede editarlo
Edit box: una caja blanca que el usuario puede
modificar
el contenido
Button: realiza una acción cuando el usuario da
click en el.
Cuando le dan doble click a un control, muestra
una ventana listando todas las propiedades de
ese control (fuente, posición, tamaño, etc.).
Tag: el nombre del control en el código, es mejor
renombrarlo por algo identificable.
String: el texto que va a tener en el gui si guera el
caso.
ForegroundColor: color del texto.
Background color: color del control.
Si presionan la flecha verde en la parte superior
del editor GUI se grabara el trabajo actual y
correrá el programa. La primera vez que lo corra
preguntara el nombre del programa.
Probar corriendo el programa.
Para agregar funcionalidad a la GUI se debe definir un callback para el boton para que así grafique la función cuando se presione
Cuando se corra el programa, se crean 2
archivos:
.fig: contiene el esquema grafico de los controles.
.m: contiene el código que define la función
callback para cada uno de los controles.
Generalmente no se edita el codigo de
inicializacion del .m.
Probablemente muchos callbacks de controles se
quedaran en blanco.
Se puede seleccionar el control y dar click
derecho para editar el Callback con la opciòn
“View Callback”.
% --- Executes on button press in PlotButton.
function PlotButton_Callback(hObject,
eventdata, handles)
% hObject handle to PlotButton (see GCBO)
% eventdata reserved - to be defined in a future
version of MATLAB
% handles structure with handles and user data
(see GUIDATA)
Se pueden borrar los comentarios.
Cada funcion tiene el parametro handles. Dicho
parametro contiene todos los controles:
handles.PlotButton, handles.edit1, etc…
Se pueden agregar variables a handles para
hacerlas disponibles en todos los controles/funciones: handles.x=42;
Se puede obtener cualquier propiedad de un control con la función GET.
Se puede cambiar el valor de cualquier propiedad con la función SET.
En este caso queremos OBTENER el Stringescrito en el edit box y graficarlo.
function PlotButton_Callback(hObject,
eventdata, handles)
x = -10 : 0.1 : 10;
s = get(handles.functionEdit, 'String');
y = eval(s); %eval just evaluates the given string
handles.axes1; %Subsequent commands draw
on axes1.
plot(x, y);
Cuando se modifica el código del m-file no se tiene que volver a correr la GUI (solo se ha modificado la funcionalidad).
Para correr el GUI se puede usar también desde el command window el nombre de la GUI como si fuera un script.