PROGRAMACIÓN DE MATLAB

Anuncio
PROGRAMACIÓN DE MATLAB
MATLAB es una aplicación que se puede programar muy fácilmente.
g j de programación
p g
pronto
p
verá que
q no tiene
De todas formas,, como lenguaje
tantas posibilidades como otros lenguajes (ni tan complicadas...).
Se comenzará viendo las bifurcaciones y bucles
bucles, y la lectura y escritura
interactiva de variables, que son los elementos básicos de cualquier programa
de una cierta complejidad.
complejidad.
La programación en MATLAB se realiza básicamente en archivos *.m o M-files
Estos archivos son simplemente archivos ASCCII o scripts y como tales pueden ser
creados o modificados en cualquier editor de texto
De acuerdo a como se definan estos archivos pueden separarse en dos tipos:
Archivos de comandos (scripts)
Funciones
PROCESO PARA EL DISEÑO DE UN PROGRAMA
INICIO
State the problem you
are trying
t i to
t solve
l
Define required inputs
and outputs
Descomposition
Design the algorithm
Convert algorithm into
MATLAB statements
Test the resulting
MATLAB program
Finished
Stepwise refinement
Top--down desing process
Top
Proceso típico de prueba para un programa largo
INICIO
Unit testing of individual
subtasks
Subtasks validated separately
Succesives builds
(adding subtaks to the
program)
As many time as necesary
Subtasks combined into program
Alpha release
As many time as necesary
Worst bugs fixed
Beta release
Minor bugs fixed
Finished
As many time as necesary
PROGRAMACIÓN DE MATLAB
L secciones
Las
i
de
d un código
ódi de
d computadora
t d
(programa),
(
) se identifican
id tifi
como
secuencias,, estructuras de selección y estructuras de repetición.
secuencias
Secuencias
Una secuencia es una
lista de comandos
que son ejecutados
uno después de otro.
otro.
Estructuras de
selección
Una
estructura
de
selección permite al
programador ejecutar un
comando si el criterio es
verdadero y un segundo
comando si el criterio es
falso..
falso
Estructuras de
repetición.
Una
estructura
de
repetición (loop)
loop) considera
un grupo de
d sentencias
t
i
a
ser ejecutadas en múltiples
tiempos
PROGRAMACIÓN DE MATLAB
Di
Diagramas
de
d Flujo
Fl j y seudocódigo.
d ódi
Los diagramas
g
de flujo,
j , son aproximaciones
p
graficas
g
de apoyo
p y en la
planeación de un programa (código).
El seudocódigo es la descripción verbal de la planeación del programa.
Diagramas de flujo para el diseño de programas de computadora
Un ovalo es utilizado para indicar el principio o el final
de una sección del código
Un paralelogramo es empleado para indicar procesos
de entrada o salida
Un diamante indica un punto de decisión
Los cálculos se encuentran en un rectángulo
PROGRAMACIÓN DE MATLAB
Ejemplo
j p
Inicio
Definir un vector
de xx- valores
Encontrar el índice
de los números en
la matriz x,
x para
valores mayores a 9.
Use el índice de los
números para
obtener los valores
de la matriz x.
Crear una tabla de salida
usando disp o fprint
fprint..
fin
Operadores
Relacional
Lógicos
Funciones
 Las functions se caracterizan por admitir argumentos de entrada y salida y por
disponer de su propio espacio de trabajo
 Las funciones son rutinas de programa
programa, implementadas en M-files
 La primera línea de un fichero llamado *.m que define una función tiene la
forma:
function [lista de valores de retorno] = name(lista de argumentos)
p
p
por comas van los valores de retorno ((siempre
p
Entre corchetes y separados
que haya más de uno)
Entre paréntesis también separados por comas los argumentos.
argumentos
Puede haber funciones sin valor de retorno y también sin argumentos.
 Los argumentos son los datos de la función
 Los valores de retorno sus resultados.
 Si no hay valores de retorno se omiten los corchetes y el signo igual (=)
Funciones
 Las variables definidas dentro de una función son variables locales
locales,, en el
sentido de que son inaccesibles desde otras partes del programa y en el de que
no interfieren con variables del mismo nombre definidas en otras funciones o
partes del programa
programa..
 Para que la función tenga acceso a variables que no han sido pasadas como
argumentos es necesario declarar dichas variables como variables globales,
globales,
tanto en el programa principal como en las distintas funciones que deben
acceder a su valor.
valor.
 Dentro
D t de
d lla función,
f
ió llos valores
l
d retorno
de
t
d b
deben
ser calculados
l l d
en algún
l ú
momento (no hay sentencia return obligatoria, como en C/C++/Java)
C/C++/Java)..
 De todas formas,
formas no hace falta calcular siempre todos los posibles valores de
retorno de la función, sino sólo los que el usuario espera obtener en la
sentencia de llamada a la función.
función.
 En cualquier función existen dos variables definidas de modo automático,
llamadas nargin y nargout
nargout,, que representan respectivamente el número de
argumentos
g
y el número de valores de retorno con los q
que la función ha sido
llamada..
llamada
Ejemplo de una función
Preparar una función sol.m que resuelva el siguiente sistema de ecuaciones:
5x + 2ry + rz = 2
3x + 6y + (2r - 1)z = 3
2x + (r - 1)y + 3rz = 5
para un valor arbitrario del parámetro r que introduciremos antes de ejecutar el
programa, de esta forma:
>> r=10;
10 A
A=[5
[5 2 1
1;6
6 6 1;2
1 2 1 3];
3] b=[2,3,5];
b [2 3 5]
>> X=sol(r,A);
% programa para resolver una matriz
function [x]=sol(r,b,A)
AA(1 2)=A(1 2)*r;
AA(1,2)=A(1,2)
r; AA(1,3)=A(1,3)
AA(1 3)=A(1 3)*r;
r; AA(2,3)=A(2,3)
AA(2 3)=A(2 3)*(2*r
(2 r-1);
1);
AA(3,2)=A(3,2)*(r-1); AA(3,3)=A(3,3)*r;
x=A\b’;
Partes básicas de un mm-file
 Para una simple
p función se p
presenta las p
partes básicas de un m-file
 Note que cuando en una línea se emplea el carácter %, esta no es ejecutable (este


carácter indica comentario)
En la versión 2006ª de MATLAB, se puede ejecutar un archivo m-file, por partes,
esto es creando celdas dentro del archivo. Para ello se utilizan el carácter % dos
veces en una línea %%
%%. Este se emplea cada que se crea una celda. (deben
aparecer solo
l %% en una sola
l lílínea, sin
i texto,
t t de
d lo
l contrario
t i se considera
id
como
comentario)
Bloque de comentarios.
comentarios Para escribir un bloque de comentarios que requiere de
más de una línea, se usa el operador %{ y %}.
 Partes básicas
function f = fact(n)
% Compute a factorial value.
% FACT(N) returns the factorial of N,
% usually denoted by N!
%%
% Put simply, FACT(N) is PROD(1:N).
f = prod(1:n);
Línea de definición de función
Linea de comentario y/o texto (ayuda)
Inicio de celda
Comentario
Cuerpo de la función
Ejemplo
function [med,des]=med_des(x)
% Funciona para calcular la media y la desviación a la vez
% [med,des]=med
[med,des] med_des(x)
des(x)
%
% curso CIRA (may/2010)
med=mean(x(:));
d
( ( ))
des=std(x(:));
>> help med_des
Funciona para calcular la media y la desviación a la vez
[med,des]=med_des(x)
curso CIRA (may/2010)
Programación
Elementos básicos de cualquier programa de una cierta complejidad
Bifurcaciones Bucles
MATLAB posee un lenguaje de programación que –como cualquier otro
lenguaje– dispone de sentencias para realizar bifurcaciones y bucles. Las
lenguaje
bifurcaciones permiten realizar una u otra operación según se cumpla o no
una determinada condición.
Bifurcaciones Bucles
Los bucles permiten repetir las mismas o análogas operaciones sobre
datos distintos. Mientras que en C/C++/Java el "cuerpo" de estas sentencias
se determina mediante llaves {{...},
}, en MATLAB se utiliza la p
palabra end con
análoga finalidad.
Control de Declaraciones en un programa
El control de declaraciones en MatLab,
MatLab, es divido en 4 categorías:
1. Control Condicional; “if,
if, switch”.
switch”.
2 Control Loop (bucle); “for
2.
for,, while
while,, continue
continue,, break
break”
3. Control de error; “try, catch”
4. Terminación del programa; “return”
return”
Condicional de control; “if,
if, switch
Este grupo de instrucciones de control, permite seleccionar en tiempo de ejecución
cuál bloque del código es ejecutado.
La selección de esta acción, esta en función de si una condición es verdadera o
falsa. Para ello se utiliza la sentencia if (el cual puede incluir else o elseif
elseif)).
Para seleccionar un número de opciones posibles, en función del valor de una
expresión, utilice como opción las declaraciones swhtch y case (que puede incluir
lo contrario).
Sentencia if
if,, else,
else, y elseif en MATLAB
if evalúa una expresión lógica, y ejecuta un grupo de declaraciones basadas
en el valor de la expresión. La sintaxis es muy simple, if se escribe en la forma
siguiente::
siguiente
bifurcación simple
if condicion (expresión lógica)
sentencias ((declaraciones))
end
Existe también la bifurcación múltiple,
múltiple, en la que
pueden concatenarse tantas condiciones como se
desee::
desee
if condicion1
bloque1
elseif condicion2
bloque2
else % opción por defecto para cuando no se
cumplan las condiciones 1,2
bloque3
end
Ejemplo:
>> a=5.1;
a=5 1;
If rem(a,2)==0
disp(‘a
disp(
disp
((‘a
a es par’);
par );
b=a/2
end
Crear un Script que permita identificar si un número es par
o impar. Use la función mod
mod(n,2)
(n,2)
Tarea
Siempre se debe verificar si es posible encadenar (anidar), lo
que se busca
b
es simplificar
i lifi
Sentencia switch
switch,, case,, and otherwise
La sentencia switch realiza una función análoga a un conjunto de if
if...
...elseif
elseif
concatenados.. Su sintaxis es la siguiente
concatenados
siguiente::
Switch expresion
case value
value1
1,
bl
bloque1
bloque
1
case {case_expr
{case_expr2
2, case_expr3
case_expr3, case_expr4
case_expr4,...}
...}
bloque2
bloque
2
...
otherwise,, % opción por defecto bloque3
otherwise
bloque3
End
Al principio se evalúa la expresión
expresión,, cuyo resultado debe ser un número escalar o una
cadena de caracteres
caracteres.. Este resultado se compara con value
value1
1 , y se ejecuta el bloque
de sentencias que corresponda con ese resultado
resultado.. Si ninguno es igual a expresión se
ejecutan las sentencias correspondientes a otherwise
otherwise.. Según puede verse en el
ejemplo anterior, es posible agrupar varias condiciones dentro de unas llaves
((constituyendo
y
lo q
que se llama un cell array
y o vector de celdas)
celdas);
); basta la igualdad
g
con
cualquier elemento del cell array para que se ejecute ese bloque de sentencias
sentencias.. La
“igualdad” debe entenderse en el sentido del operador de igualdad (==) para
escalares y la función strcmp
strcmp()
() para cadenas de caracteres)
caracteres)..
Sentencias de repetición
1. Las sentencias de repetición
2. Sentencias de repetición controladas por
contador
3. Sentencias de repetición controladas por una
expresión lógica
• Se utilizan para ejecutar una misma actividad
repetidas veces.
• Las sentencias que se realizan en cada repetición
(o iteración) son las mismas, y lo que puede
variar en cada iteración son los datos.
• La repetición de un bloque de sentencias un
determinado número de veces también se
denomina bucle.
Las sentencias de repetición
Sentencia for
La sentencia for de MATLAB es muyy diferente y no tiene la generalidad
de la
g
sentencia for de C/C++/Java. La siguiente construcción ejecuta sentencias con
valores de i de 1 a n, variando de uno en uno.
for i=1:n
sentencias
end
o bien,
for i=
i=vectorValores
vectorValores
sentencias
end
donde vectorValores es un vector
con los distintos valores para i.
for i=n:i=n:-0.2:1
sentencias
t
i
end
dos
anidados
d bucles
b l anidados.
id d .
for i=1:m
for j=1:n
sentencias
end
end
Una última forma de interés del
bucle for es la siguiente (A es una
matriz):
for i=A
sentencias
end
en la que la variable i es un vector
que va tomando en cada iteración el
q
valor de una de las columnas de A.
Número de apariciones de una letra en una
frase
% N = NumLetras(CADENA,
NumLetras(CADENA LETRA)
% Numero de apariciones de una letra en una cadena
% CADENA: Cadena a explorar
% LETRA : L
Letra
t buscada
b
d
function n = NumLetras(cadena, letra)
n = 0;
for l = cadena
if l == letra
n = n + 1;;
end
end
Obsérvese que se puede realizar matricialmente de forma
más compacta:
p
ffunction
ti n = NumLetras(cadena,
N L t
( d
letra)
n = sum(cadena == letra);
Sentencias de repetición controladas por una
p
lógica:
g
expresión
WHILE condición
% La paga
pvp entrada = 6; % El cine cuesta 6 pesos
pvp_entrada
disponible = 0; % Somos muy pobres
while disponible < pvp_entrada
recibido = input('Papá, dame dinero: ');
disponible = disponible + recibido;
end
disp('Gracias por los');
disp(disponible);
p( p
);
% FOR con contador
for i = 1:100
suma = suma + i; % O cualquier otra operación
end
%
% WHILE equivalente
i = 1;
while i <= 100
suma = suma + i % O cualquier otra operación
i=i+1
end
WHILE – Prevención de errores comunes
Es preciso asegurarse de que las variables de las expresiones
que definen el vector están inicializadas antes de
evaluarlas
e
a ua as po
por p
primera
e a vez.
e
●Delimitar siempre el cuerpo del bucle con while ... End
●Utilizar el sangrado para reconocer fácilmente el conjunto
de instrucciones que pertenecen al bucle
●En la secuencia de instrucciones debe modificarse alguna
g
variable que forme parte de ExprLog para que alguna vez se
evalúe a verdadero, y evitar la ejecución infinita del bucle.
●Evitar bucles infinitos es una responsabilidad exclusiva del
programador.
programador
Sentencia while
La estructura del bucle while es muyy similar a la de C/C++/Java. Su sintaxis es
la siguiente:
while condicion
sentencias
end
donde condicion puede ser una expresión vectorial o matricial. Las sentencias
se siguen ejecutando mientras haya elementos distintos de cero en condición
condición,,
es decir, mientras haya algún o algunos elementos true
true.. El bucle se termina
cuando todos los elementos de condición son false (es decir, cero).
SENTENCIA break
Al igual que en C/C++/Java, la sentencia break hace que se termine la
ejecución del bucle for y/o while más interno de los que comprenden a dicha
sentencia.
SENTENCIA continue
La sentencia continue hace que se pase inmediatamente a la siguiente iteración
d lb
del
bucle
l for
f o while
while,
hil , saltando
lt d ttodas
d llas sentencias
t
i que h
hay entre
t continue
ti
y ell fi
fin
del bucle en la iteración actual.
actual.while
while más interno de los que comprenden a dicha
sentencia.
EJEMPLOS
for i=1:5
A(i,1)=1;
A(1,i)=1;
end
Para salir del bucle se utiliza break
for k=1:100
x=sqrt
x=
sqrt(k);
(k);
if((k>10)&(x
if
((k>10)&(x--floor
floor(x)==0))
(x)==0))
break
end
end
k
for i=2:5
for j=2:5
A(i,j
A(
i,j)=A(i,j
)=A(i,j--1)+A(i1)+A(i-1,j);
end
end
A
Mostrar una línea de texto utilizando
while y disp
n=10;
k=0;
while
hil k<=n
k
x=k/3;
disp
disp([x
p([
([x x^2 x^3])
])
k=k+1;
pause
end
Tarea: Calcular el factorial de un número (n). Considere los casos
particulares para el 0 y el 1. Y el caso de entrada inválida, n<0
El cálculo del factorial. Observe como se capturan los casos particulares para el 0
y el 1. Y el caso de entrada inválida, n<0.
% retorna
t
ell ffactorial
t i ld
dell número
ú
d
dado
d
function [ ] = factorial(n);
if n < 0
disp('Ingrese un número positivo !')
return;
end;
if n==0 | n==1
disp('El factorial de ');
disp(n);
disp('es 1');
return;
end;
mult = 1;
f i=1
for
1:n;
mult = mult * i;
end;
Lectura y escritura interactiva de variables
Una forma sencilla de leer variables desde teclado y escribir mensajes en la
pantalla del PC es utilizando la función input y disp.
FUNCIÓN INPUT
La función input permite imprimir un mensaje en la línea de comandos de MATLAB y
recuperar como valor de retorno un valor numérico o el resultado de una expresión
tecleada por el usuario
usuario..
>> n = input('Teclee el número de ecuaciones')
Otra posible forma de esta función es la siguiente (obsérvese el parámetro 's
's'):
'):
>> nombre = input('¿Cómo te llamas?','s')
llamas?','s')
FUNCIÓN DISP
La función disp permite imprimir en pantalla un mensaje de texto o el valor de una
matriz, pero sin imprimir su nombre.
>> disp
disp('El
disp(
(('El
El programa ha terminado
terminado'))
>> A=rand(4,4)
>> disp(A)
disp(A)
Entrada y salida de datos
Ya se ha visto una forma de realizar la entrada interactiva de datos por medio de
lla función
f
ió input
i
t y de
d imprimir
i
i i resultados
lt d por medio
di de
d lla función
f
ió disp
di . Ahora
disp.
Ah
se
van a ver otras formas de intercambiar datos con otras aplicaciones
aplicaciones..
IMPORTAR DATOS DE OTRAS APLICACIONES
Hay varias formas de pasar datos de otras aplicaciones –por ejemplo de Excel
Excel–
–a
MATLAB Se pueden enumerar las siguientes:
MATLAB.
siguientes:
 Se puede utilizar Copy y Paste para copiar datos de la aplicación original y
depositarlos entre los corchetes de una matriz o vector, en una línea de
comandos de MATLAB.
 Se puede crear un fichero *.m con un editor de textos, con lo cual no existen
problemas de edición.
 Es posible leer un flat file escrito con caracteres ASCII. Un flat file es un fichero
con filas de longitud constante separadas con Intro
Intro,, y varios datos por fila
separados por blancos (espacios).
(espacios).
 MATLAB llee este
t tipo
ti
d ficheros
de
fi h
con ell comando
d load.
l d. Si se ejecuta
load
j
t load
l d
datos.txt el contenido del flat file se deposita en una matriz con el nombre
datos.
datos.. Por ejemplo, creando un fichero llamado flat
datos
flat..txt que contenga las líneas:
líneas:
>> 23.
23.456 56
56..032 67
67..802
3.749 -98.
98.906 34
34..910
 El comando A=load('flat
A=load('flat..txt') leerá estos valores y los asignará a la matriz A.
Para más información utilizar help load
load..
 El comando textread permite leer datos de cualquier tipo de un fichero siempre
que estén convenientemente separados
separados.. Ver el Help para más información
información..
– Se pueden leer datos de un fichero con las funciones fopen y fread
– Existen también otros métodos posibles
posibles:: escribir funciones en C para
traducir a formato *.mat (y cargar
g después
p
con load
load),
), crear un fichero
ejecutable *.mex que lea los datos, etc
etc..
Por ejemplo, creando un fichero llamado flat.txt que contenga las líneas:
23.456 56.032 67.802
3.749 -98.906 34.910
 El comando A=load('flat.txt') leerá estos valores y los asignará a la matriz A.
Para más información utilizar help load.
load.
 El comando textread permite leer datos de cualquier tipo de un fichero siempre
que estén convenientemente separados.–
separados.–se pueden leer datos de un fichero
con las
l ffunciones
i
f
fopen
y fread
f
d
 El comando imread
imread,, lee una imagen
g desde un archivo g
grafico
Sintaxis A = imread(
imread(filename,fmt
filename,fmt))
 El comando imwrite
imwrite,, escribe una imagen en un archivo grafico
Sintaxis imwrite
imwrite((A,filename,fmt)
A filename fmt)
A,filename,fmt
fmt)
 El comando xlsread
xlsread,, lee una archivo creado en Excel (archivo .xls
.xls))
Sintaxis num = xlsread('filename',
xlsread('filename', sheet, 'range')
 El comando xlswrite
xlswrite,, graba una matriz en un archivo de Excel (archivo .xls
.xls))
Sintaxis xlswrite
xlswrite('filename',
('filename', M, sheet, 'range')
Ejemplos para crear programas
Crear un programa que permita resolver un sistema de ecuaciones
Ax=b,
Ax
=b, por el método iterativo de Jacobi
x
x
( k 1)
i
( k 1)
i


n
1 
k

b j   aij x i

aii 
i 1


i j
bi  ai1 x1k  ......  aii1 xik1  aii1 xik1  ...  ain x nk

aii
Crear un programa que permita resolver una integral utilizando la
regla
g del trapecio
p
compuesta
p
b

a
M 1
h
f ( x)dx   f (a )  f (b)    f ( x k )
2
k 1
x k  a  kh

b  a
h
M
4
x e
2
0
x
dx
function X=jacobi(A,B,P,delta, max1)
% Input
- A matriz no singular N x N
%
- B matriz de N x 1
%
- P matriz N x 1 valores iniciales
%
- delta es la tolerancia de P
%
- max1 numero máximo de iteraciones
% Output
- X es una matriz N x 1 la aproximación de la solución AX = B
N = length(B);
for k=1:max1
for j=1:N
j
X(j)=(B(j)-A(j,[1:j-1,j+1:N])*P([1:j-1,j+1:N]))/A(j,j);
end
err=abs(norm(X'-P));
(
(
));
relerr=err/(norm(X)+eps);
P=X';
if (err
(err<delta)|(relerr<delta)
delta)|(relerr delta)
break
end
end
X=X';
5x  y  z  5
x  4y  z  4
x  y  3z  3
A=[5
A
[5 1 1;
1 1 4 1;
1 1 1 3]
3],
b=[5 4 3]’
x=A\b resto=A
x=A\b,
resto=A*x-b
x-b
function s=traprl(f,a,b,M)
%Input - f es la funcion a integrar como cadena de caracteres, 'f'
%
- a y b son los limites superior e inferior de integracion
%
- M es el numero de subintervalos
%Output - s es la suma trapezoidal
h=(b-a)/M;
s 0;
s=0;
for k=1:(M-1)
x=a+h*k;
s=s+feval(f,x);
end
s=h*(feval(f,a)+feval(f,b))/2+h*s;
>> fh = @(x)
@( ) x^4*exp(-x)
^4*
( )
fh =
@(x) x^4*exp(-x)
x 4 exp(-x)
<<traprl(fh,0,4,10)
p (
)
ans =
8.9079
<<traprl(@(x) x^4*exp(-x),0,4,10)
ans =
8.9079
CREACIÓN DE REFERENCIAS DE FUNCIÓN ((function
function handles
handles))
Las referencias de función son un nuevo tipo de datos de MATLAB. Una
referencia de función se puede crear de dos formas diferentes:
Mediante el operador @ ("at" o "arroba")
"arroba")
La referencia a la función se crea precediendo el nombre de la función por
el operador @. El resultado puede asignarse a una variable o pasarse
como argumento a una función.
función Ejemplos:
fh = @sin;
quad(@sin,
quad
(@sin,, 0,, pi);
(@
pi
p );
area = q
2. Mediante la función str2func
La función str2func recibe como argumento una cadena de caracteres
conteniendo el nombre de una función y devuelve como valor de
retorno la referencia de función. Una de las ventajas
j de esta función es
que puede realizar la conversión de un vector de celdas con los
nombres en un vector de referencias de función. Ejemplos:
>> fh = str2func(
str2func('sin');
sin );
>> str2func({'
str2func({'sin','cos','tan
sin','cos','tan'})
'})
@sin @cos
@cos @tan
ans = @sin
Recomendaciones generales de programación
Las funciones vectoriales de MATLAB son mucho más rápidas que sus
contrapartidas escalares. En la medida de lo posible es muy interesante vectorizar
los algoritmos de cálculo, es decir, realizarlos con vectores y matrices, y no con
variables escalares dentro de bucles.
Aunque los vectores y matrices pueden ir creciendo a medida que se necesita, es
mucho más rápido reservarles toda la memoria necesaria al comienzo del
programa. Se puede utilizar para ello la función zeros. Además de este modo la
memoria reservada es contigua.
Es importante utilizar el profile para conocer en qué sentencias de cada función
se gasta la mayor parte del tiempo de cálculo. De esta forma se descubren “cuellos
de botella” y se pueden desarrollar aplicaciones mucho más eficientes.
Conviene desarrollar los programas incrementalmente, comprobando cada función o
componente que se añade. De esta forma siempre se construye sobre algo que ya
h sido
ha
id comprobado
b d y que funciona.
f
i
Si aparece algún error, lo más probable es que se deba a lo último que se ha
añadido y de esta manera la búsqueda de errores está acotada y es mucho más
añadido,
sencilla. Recuérdese que el tiempo ordinario de corrección de errores en un
programa puede ser 4 ó 5 veces superior al tiempo de programación.
El debugger es una herramienta muy útil a la hora de acortar ese tiempo de
puesta a p
p
punto. En este mismo sentido, p
puede decirse q
que p
pensar bien las cosas al
programar (sobre una hoja de papel en blanco, mejor que sobre la pantalla del PC)
siempre es rentable, porque se disminuye más que proporcionalmente el tiempo de
depuración y eliminación de errores.
Otro objetivo de la programación debe ser mantener el código lo más sencillo y
ordenado posible.
Al pensar en cómo hacer un programa o en cómo realizar determinada tarea es
conveniente pensar siempre primero en la solución más sencilla, y luego plantearse
otras
t
cuestiones
ti
como la
l eficiencia.
fi i
i
Finalmente, el código debe ser escrito de una manera clara y ordenada,
introduciendo comentarios,
comentarios utilizando líneas en blanco para separar las distintas
partes del programa, sangrando las líneas para ver claramente el rango de las
bifurcaciones y bucles, utilizando nombres de variables que recuerden al significado
de la magnitud física correspondientes,
correspondientes etc.
etc
En cualquier caso, la mejor forma (y la única) de aprender a programar es
programando.
programando
Argumentos de una función
•
•
Checar el número de argumentos de entrada
•
Pasar un número variable de argumentos
•
Checar el número de argumentos de salida
Número de argumentos de entrada y salida
nargin y nargout indican cuántos argumentos de entrada o salida, respectivamente, ha
utilizado un usuario.
•
Ejemplo
•
Ejemplo
testarg1(a,b)
function [x0, y0] = testarg2(x, y, npts,
npts, angle,
angle, subdiv)
subdiv)
•
Pasar un número variable de argumentos
varargin indica una lista de argumentos de entrada variable
varargout indica una lista de argumentos de salida variable
function y = bar(varargin)
La función acepta un numero variable
de argumentos de entrada
function myplot
myplot((x,varargin)
x,varargin)
plot((x,varargin
plot
x,varargin{:})
{:})
function varargout = foo(n)
La función indica que se pude obtener
un numero variable de argumentos de
salida
function [s,varargout]=
s,varargout]=tamano
tamano(x)
(x)
nout = max
max(nargout,1)
(nargout,1)--1
s = size
size(x);
(x);
for k=1:nout, varargout
varargout(k)
(k) = {s(k)}; end
Lectura y escritura de ficheros
MATLAB dispone de funciones de lectura/escritura análogas a las del lenguaje
C (en
(
l
las
que están
tá inspiradas),
i
i d ) aunque con algunas
l
dif
diferencias.
diferencias
i . En
E generall
son versiones simplificadas –con menos opciones y posibilidades
posibilidades–
– que las
correspondientes funciones de C
FUNCIONES FOPEN Y FCLOSE
Estas funciones sirven para abrir y cerrar ficheros, respectivamente. La función
fopen tiene la forma siguiente (sintaxis):
[fi,texto]
fi,texto] = fopen
fopen('
('filename','c
filename','c')
')
donde
fi, es un valor de retorno que sirve como identificador del fichero
texto, es un mensaje para caso de que se produzca un error, y
c, es un carácter
á t (o
( dos)
d ) que iindica
di ell ti
tipo d
de operación
ió que se d
desea
realizar. Las opciones más importantes son las siguientes:
'r'
'w'
'a'
'r+'
r+
lectura (de read)
escritura reemplazando (de write)
escritura a continuación (de append)
lectura y escritura
Cuando por alguna razón el fichero no puede ser abierto, se devuelve un (-1). En
puede proporcionar
p p
información sobre el
este caso el valor de retorno texto p
tipo de error que se ha producido (también existe una función llamada ferror
que permite obtener información sobre los errores.
Después de realizar las operaciones de lectura y escritura deseadas, el fichero se
puede cerrar con la función close en la forma siguiente (sintaxis):
st = fclose
f
fclose(fi)
(f )
donde st es un valor de retorno para posibles condiciones de error.
Si se quieren cerrar todos los ficheros abiertos a la vez puede utilizar el comando:
st = close(
close('all')
all )
Lectura y escritura de ficheros
Cuando MATLAB lee un archivo especifico, se intenta hacer coincidir los datos en
el archivo de la cadena del formato.
formato Si se produce una coincidencia,
coincidencia los datos se
escriben en la matriz del orden de las columnas del archivo. Si se produce una
coincidencia parcial, sólo los datos que corresponden se escriben en la matriz, y se
detiene la operación de lectura.
La cadena de formato consiste en caracteres ordinarios y/o especificaciones de
conversión. Las especificaciones
p
de conversión indican el tipo
p de datos y
cotejarlos implica el uso del carácter %, y de forma opcional el ancho del campo
seguido la conversión de los caracteres.
Las especificaciones de conversión
comienzan con el carácter% y contienen
estos elementos opcionales y requeridos:
•
•
•
•
Banderas (Flags,opcional)
A h y campos d
Ancho
de precisión
i ió
(opcional)
Un especificador de subtipo
(
(opcional)
i
l)
La conversión de caracteres
(requerido)
FORMATO
La cadena (string) entre comillas simples que describe el formato de los campos de
salida. Puede incluir las combinaciones siguientes:
1.-- Signo de porcentaje,
1
porcentaje seguido de una conversión de caracteres
caracteres, tales como '%
% s'
s para
las cadenas.
2-.. Operadores que describen el ancho de campo, precisión, y otras opciones.
2
3.- El texto (variable) para impresión.
4.- caracteres, incluyendo:
''
Single quotation mark
%% Percent character
\\
Backslash
\a
Alarm
\b
Backspace
\f
Form feed
\n
New line
\r
Carriage return
\t
Horizontal tab
\v
Vertical tab
\xN Hexadecimal number, N
\N
Octal number, N
En la tabla siguiente se muestran los caracteres de conversión disponibles y subtipos.
Value Type
yp
Integer, signed
Integer unsigned
Integer,
Conversion
%d or %i
%ld or %li
%hd or %hi
%u
%o
%x
%X
%lu
%lo
%lx or %lX
%hu
%ho
%hx or %hX
Floating-point number %f
%e
%E
%g
%G
%b or %bX
%bx
%bo
%bu
%tx or %tX
%to
%tu
Characters
%c
%s
Details
Base 10 values
64-bit base 10 values
16-bit base 10 values
Base 10
Base 8 (octal)
Base 16 (hexadecimal), lowercase letters a–f
pp
letters A–F
Same as %x, uppercase
64-bit values, base 10, 8, or 16
16-bit
16
bit values, base 10, 8, or 16
Fixed-point notation
Exponential notation
notation, such as 3
3.141593e+00
141593e+00
Same as %e, but uppercase, such as 3.141593E+00
The more compact of %e or %f, with no trailing zeros
The more compact of %E or %f, with no trailing zeros
D bl
Double-precision
i i h
hexadecimal,
d i l octal,
t l or d
decimal
i l value
l
Example: %bx prints pi as 400921fb54442d18
Single-precision hexadecimal, octal, or decimal value
Example: %tx prints pi as 40490fdb
Single character
String of characters
Flags
Action
Flag
Example
Left-justify
Left
justify.
'–'
%-5
%
5.2f
2f
Print sign character (+ or –).
'+'
%+5.2f
Insert a space before the value.
''
% 5.2f
Pad with zeros.
'0'
%05.2f
Modify
y selected numeric conversions:
oFor %o, %x, or %X, print 0, 0x, or 0X
prefix.
oFor %f, %e, or %E, print decimal point
even when precision is 0.
oFor %g or %G, do not remove trailing
zeros or decimal point.
'#'
%#5.0f
Identificador
Orden del procesamiento de las entradas. Utilice la sintaxis $ n,
n donde n representa la
posición del valor en la lista de entrada.
Por ejemplo
'%3$s %2$s %1$s %2$s' imprime las entradas 'A', 'B', 'C' de la forma: C B A B.
Limitaciones de las conversiones:
1.- En conversiones numéricas imprime sólo el componente real de los números
complejos.
2.- Si solicita un número entero o una cadena de conversión a un valor numérico
que contiene una fracción,
f
MATLAB anula la conversión especificada
f
y utiliza%
% e.
3.- Si solicita una conversión de cadenas (% s) en valores enteros, MATLAB:
a) Emite una advertencia.
b) Convierte los valores que corresponden a los códigos de carácter
válido a los caracteres. Por ejemplo, '% s' convierte [65 66 67] de ABC.
4.- Diferentes plataformas de visualización de notación exponencial (como% e)
con un número diferente de dígitos en el exponente.
FUNCIONES FSCANF
FSCANF,, SSCANF
SSCANF,, FPRINTF Y SPRINTF
Estas funciones permiten leer y escribir en ficheros ASCII, es decir, en
ficheros formateados. La forma general (sintaxis)de la función fscanf es la
siguiente:
i i t
[var1,var2,...] = fscanf
fscanf((fi,'cadena de control',size)
control',size)
donde
fi
size
es el identificador del fichero (devuelto por la función
f
fopen),
)
es un argumento opcional que puede indicar el tamaño del
vector o matriz a leer.
cadena de control va encerrada entre apóstrofos simples, y contiene
los especificadores de formato para las variables:
%s
%d
%f
%lf
para cadenas de caracteres
para variables enteras
para variables de punto flotante
para variables de doble precisión
La función sscanf es similar a fscanf pero la entrada de caracteres no proviene
de un fichero sino de una cadena de caracteres.
La función fprintf dirige su salida formateada hacia el fichero indicado por el
identificador.
S sintaxis
Su
i t i es:
fprintf(fi,'cadena de control',var1,var2,...)
Ésta es la función más parecida a su homóloga de C. La cadena de control
contiene los formatos de escritura, que son similares a los de C, como muestran
los ejemplos siguientes:
fprintf(fi,'El número de ecuaciones es: %d\n',n)
fprintf(fi 'El
fprintf(fi,
El determinante es: %lf10.4\n
%lf10 4\n',n)
n)
De forma análoga, la función sprintf convierte su resultado en una cadena de
caracteres que devuelve como valor de retorno, en vez de enviarlo a un fichero.
Ejemplo:
resultado = sprintf('El cuadrado de %f es %12.4f\n',n,n* )
donde resultado es una cadena de caracteres. Esta función constituye el método
más general de convertir números en cadenas de caracteres, por ejemplo para
ponerlos como títulos de figuras.
Ejemplo
Agua en un canal (alcantarilla)
Determinar la cantidad de agua que fluirá a través de una alcantarilla, situación
que no es fácil de primera instancia, dado que, el canal puede ser de forma no
uniforme , el flujo ser influenciado por obstrucciones,
obstrucciones la fricción es un factor
importante, etc. Un enfoque numérico nos permite considerar todos esos
factores, desarrollando un modelo que permita simular el comportamiento real del
agua.
agua
Considere el siguiente grupo de datos (altura de agua contra flujo, gasto) de una
alcantarilla de sección transversal definida
Altura (ft)
Flujo
(ft3/s)
0
1.7
1.95
2.6
2.92
4.04
5.24
0
2.6
3.6
4.03
6.45
11.22
30.61
1.- Calcule el mejor ajuste lineal,
1
lineal cuadrático y cubico,
cubico
obteniendo la ecuación de ajuste y la grafica de cada una
de ellas en una sola figura. Indicando en el grafico, los
datos que representa el modelo en el siguiente orden,
lineal en primer término, después cuadrático y finalmente la
cubica.
Solución
1.- Planteamiento del problema
Realizar una regresión polinomial, graficar los resultados y determinara
el orden de la representación de los datos.
2.- Describir las entradas y salidas
Entrada: Datos de altura y flujo
Salida: Gráfica de resultados
3 - Desarrollar a mano el ejemplo (esbozo de la solución)
3.
4.- Utilizar MATLAB para obtener la solución
4.- Utilizar MATLAB para obtener la solución
INTERFAZ GRÁFICA DE USUARIO EN MATLAB
(GUIDE)
GUIDE es un entorno de programación visual disponible en MATLAB para
realizar y ejecutar programas que necesiten ingreso continuo de datos.
datos. Tiene
las características básicas de todos los programas visuales como Visual
Basic o Visual C++
C++..
INICIO Para iniciar un proyecto, se puede realizar de dos maneras:
• Ejecutando la siguiente instrucción en la ventana de comandos:
>> guide
• Haciendo un click en el ícono que muestra la figura:
Icono
Guide
Ventana de inicio
Opciones de la ventana de inicio
a) Blank GUI (Default) La opción de interfaz gráfica de usuario en blanco
(viene predeterminada), presenta un formulario nuevo, el cual se utiliza par
diseñar un programa.
b) GUI with Uicontrols Esta
opción presenta un ejemplo en el
cual se calcula la masa, dada la
densidad y el volumen, en
alguno de los dos sistemas de
unidades.. Se puede ejecutar este
unidades
ejemplo y obtener resultados
resultados..
c) GUI with Axes and Menu Esta
opción
p
es otro ejemplo
j p
el cual
contiene el menú File con las
opciones Open, Print y Close
Close.. En el
formulario tiene un Popup menu,
menu,
un push button y un objeto Axes
Axes,,
se pude ejecutar el programa
eligiendo alguna de las seis
opciones que se encuentran en el
menú despegable y haciendo click
en el botón de comando
comando..
d) Modal Question Dialog Con esta opción se muestra en la pantalla un
cuadro de diálogo común, el cual consta de una pequeña imagen, una
etiqueta y dos botones Yes y No, dependiendo del botón que se presione, el
GUI retorna el texto seleccionado (la cadena de caracteres ‘Yes’ o ‘No’).
‘No’).
Interfaz gráfica de usuario en blanco
Blank GUI
Herramientas de la
interfaz gráfica
Alinear objetos.
objetos
Editor de menú.
Paleta de
componentes
Editor de orden de
etiqueta.
Editor del MM-file.
file.
ÁREA DE
TRABAJO
P
Propiedades
i d d de
d
objetos.
N
Navegador
d d
de objetos.
bj t
j
Grabar y ejecutar
(ctrl
ctrl.. + T).
Etiqueta de cada elemento de la paleta de componentes
File >> Preferences
Descripción de los componentes
Control
Valor de estilo
Descripción
Check box
‘checkbox’
checkbox
Indica el estado de una opción o atributo
Editable Text
‘edit’
Caja para editar texto
Pop-up menu
‘popupmenu’
Provee una lista de opciones
List Box
‘listbox’
Muestra una lista deslizable
Push Button
‘pushbutton’
Invoca un evento inmediatamente
Radio Button
‘radio’
Indica una opción que puede ser
seleccionada
Toggle
gg Button
‘togglebutton’
gg
Solo dos estados , “on” o “off”
Slider
‘slider’
Usado para representar un rango de
valores
St ti Text
Static
T t
‘t t’
‘text’
M
Muestra
t un string
t i de
d ttexto
t en una caja
j
Panel button
Agrupa botones como un grupo
Button Group
Permite exclusividad de selección con los
radio button
PROPIEDADES DE LOS COMPONENTES
Cada uno de los elementos de GUI, tiene un conjunto de opciones y se accede
a ellas con click derecho.
View Callbacks
Una de las opciones de un elemento del área de diseño más importantes
que se accede con click derecho es View Callbacks,
Callbacks, la cual, al ejecutarla,
abre el archivo .m asociado al diseño y nos posiciona en la parte del
programa que corresponde a la subrutina que se ejecutará cuando se
realice una determinada acción sobre el elemento que se esta editando
editando..
Por ejemplo, al ejecutar View Callbacks>>Callbacks en el Push Button, nos
ubicaremos en la parte del programa:
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject,
pushbutton2 Callback(hObject eventdata,
eventdata handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
FUNCIONAMIENTO DE UNA APLICACIÓN GUI
Una aplicación GUIDE consta de dos archivos:
archivos: .m y .fig.
.fig.
El archivo .m es el que contiene el código con las correspondencias de los
botones de control de la interfaz.
El archivo
hi .fig
fi contiene
ti
los
l elementos
l
t gráficos.
áfi
Cada vez que se adicione un nuevo elemento en la interfaz gráfica, se
genera automáticamente código en el archivo .m.
.m
m.
Para ejecutar una Interfaz Gráfica, si se ha etiquetado con el nombre
curso fig simplemente se ejecuta en la ventana de comandos
curso.fig,
>> curso %nombre de la interfaz gráfica
O desde el achivo m-file haciendo click derecho y seleccionando la
opción RUN
RUN..
MANEJO DE DATOS ENTRE LOS ELEMENTOS DE LA APLICACIÓN Y
EL ARCHIVO .M
Todos los valores de las propiedades de los elementos (color, valor, posición, string…)
y los valores de las variables transitorias del programa se almacenan en una
estructura,
est
uctu a, los
os cuales
cua es son
so accedidos
acced dos mediante
ed a te un
u único
ú co y mismo
s o identificador
de t cado pa
para
a
todos éstos. Tomando el programa listado anteriormente, el identificador se asigna en:
handles.output
p = hObject;
j ;
handles, es nuestro identificador a los datos de la aplicación. Esta definición de
identificador es salvada con la siguiente
g
instrucción:
guidata(hObject, handles);
guidata, es la sentencia para salvar los datos de la aplicación.
Nota: guidata es la función que guarda las variables y propiedades de los elementos
en la estructura de datos de la aplicación, por lo tanto, como regla general, en cada
subrutina se debe escribir en la última línea.
Esta sentencia nos garantiza que cualquier cambio o asignación
ó de propiedades o
variables quede almacenado.
Por ejemplo
Si dentro de una subrutina una operación dio como resultado una variable diego
para poder utilizarla desde el programa u otra subrutina debemos salvarla de la
siguiente manera:
handles.diego=diego;
guidata(hObject,handles);
La primera
L
i
lílínea crea la
l variable
i bl di
diego a lla estructura
t t
d
de d
datos
t d
de lla aplicación
li
ió
apuntada por handles y la segunda graba el valor.
SENTENCIAS GET Y SET
La asignación u obtención de valores de los componentes se realiza mediante
las sentencias get y set.
Por ejemplo si queremos que la variable utpl tenga el valor del Slider escribimos:
utpl= get(handles.slider1,'Value');
Notar que siempre se obtienen los datos a través de los identificadores handles.
g
el valor a la variable utpl
p al statictext etiquetada
q
como text1 se
Para asignar
escribe:
set(handles.text1,'String',utpl); %Escribe el valor del Slider en static-text
PROGRAMA SUMADORA
Con este ejemplo, se muestra el uso de pushbutton, static text y Edit text.
Primero, ejecutamos
j
>> guide
en la ventana de comandos, y presionamos Enter.
Seleccionamos Blank GUI (default) y presionamos OK.
Insertamos los componentes que muestra la siguiente figura:
Descargar