Professional Documents
Culture Documents
INTRODUCCION A MATLAB
Que es MATLAB?
Matlab es un lenguaje de alto funcionamiento para computacin tcnica, Este integra
computacin, visualizacin, y programacin, en un entorno fcil de usar donde los problemas y
las soluciones son expresados en la ms familiar notacin matemtica. Los usos ms familiares
de Matlab son:
Matemtica y Computacin
Desarrollo de algoritmos
Modelamiento , simulacin y prototipado
Anlisis de datos, exploracin y visualizacin
Graficas cientficas e ingenieriles
Desarrollo de aplicaciones, incluyendo construccin de interfaces graficas de usuario
El Sistema MATLAB
El sistema Matlab consiste de cinco partes principales:
Entorno de desarrollo:
Es el conjunto herramientas y mdulos que ayudan a usar las funciones y archivos de matlab.
Muchas de esas herramientas son interfaces graficas de usuario. Esto incluye, el escritorio de
matlab, la ventana de comandos, el historial de comandos, un editor y un depurador, navegadores
para revisin de la ayuda, el espacio de trabajo o workspace y los archivos.
La librera de funciones matemticas: esta es una gran coleccin de algoritmos computacionales
que van desde funciones elementales como la suma, la funcin seno y coseno, y la aritmtica de
nmeros complejos hasta funciones mucho mas sofisticadas como inversas de matrices,
autovalores de matrices, funciones de bessel, y transformadas radiadas de Fourier.
El lenguaje MATLAB:
Es un lenguaje de alto nivel para matrices con sentencias para control de flujo, creacin de
funciones y estructuras de datos, funciones de entrada/salida y algunas caractersticas de
programacin orientada por objetos, Este lenguaje permite tanto la programacin a pequea
escala para la creacin rpida de programas, como programacin a larga escala para la
realizacin de aplicaciones complejas.
Grficas:
Matlab cuenta con mdulos extensivos para la visualizacin de vectores y matrices en forma de
graficas, as como para realizar comentarios e impresin de estas grficas. Matlab incluye
funciones de alto nivel para la visualizacin de datos en dos y tres dimensiones, procesamiento
de imgenes, animacin, y creacin de grficos de presentacin. Matlab tambin incluye
funciones de bajo nivel que permiten personalizar completamente la apariencia de los grficos
as como construir interfaces graficas de usuario para las aplicaciones.
Interfaces Externas:
Las interfaces externas son un conjunto de libreras que permiten la programacin en lenguaje C
y FORTRAN de programas que interacten con matlab. Estas libreras proveen facilidades para
realizar llamadas de rutinas desde Matlab.
La ayuda de MATLAB es bastante til; para acceder a la misma basta teclear help. Es
recomendable usarlo para obtener una informacin ms precisa sobre la sintaxis y
diversas posiblidades de uso de los comandos.
Generalidades.
Los clculos que no se asignan a una variable en concreto se asignan a la variable de
respuesta por defecto que es ans (del ingls, answer):
>>2+3
ans =
5
Las operaciones se evalan por orden de prioridad: primero las potencias, despus las
multiplicaciones y divisiones y, finalmente, las sumas y restas. Las operaciones de
igual prioridad se evalan de izquierda a derecha:
>>2/4*3
ans =
1.5000
>>2/(4*3)
ans =
0.1667
Se pueden utilizar las funciones matemticas habituales. As, por ejemplo, la funcin
coseno,
>>cos(pi) % pi es una variable con valor predeterminado 3.14159...
ans =
-1
o la funcin exponencial
>>exp(1)
ans =
2.7183
pero...
>>eps=7
eps =
7
Otro ejemplo de funcin matemtica: la raz cuadrada; como puede verse, trabajar
con complejos no da ningn tipo de problema. La unidad imaginaria se representa en
MATLAB como i o j, variables con dicho valor como predeterminado:
>>sqrt(-4)
ans =
0+ 2.0000i
Size
1x1
1x1
1x1
Bytes
8
8
8
Class
double array
double array
double array
1x1
double array
Vectores y matrices.
Para definir un vector fila, basta introducir sus coordenadas entre corchetes:
>>v=[1 2 3]
% Vector de 3 coordenadas
v=
1 2 3
>>w=[4 5 6];
A las coordenadas de un vector se accede sin ms que escribir el nombre del vector y,
entre parntesis, su ndice:
>>vect2(3)
ans =
4
o,
>>vect1(:)
ans=
0
2
4
6
8
10
12
14
16
18
20
Las matrices se escriben como los vectores, pero separando las filas mediante un
punto y coma; as una matriz 3x3:
>>M=[1 2 3;4 5 6;7 8 9]
M =
1 2 3
4 5 6
7 8 9
>>M'
ans
1 4
2 5
3 6
>>mat=[v;w;0 0 1]
mat
1 2
4 5
0 0
=
3
6
1
A los elementos de una matriz se accede sin ms que escribir el nombre de la matriz y,
entre parntesis, los respectivos ndices:
>>mat(1,3)
mat
ans =
3
ans =
2
5
0
>>mat(2,:)
% Su segunda fila
ans =
4 5 6
7
2
5
8
3
ans =
4 6
0 1
=
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
la matriz nula,
>>zeros(3)
ans
0 0
0 0
0 0
=
0
0
0
1 1 1 1
1 1 1 1
Existen comandos que permiten crear de forma sencilla matrices. Por ejemplo:
>>diag(v)
ans
1 0
0 2
0 0
=
0
0
3
=
0
0
9
=
0
1
0
1
0
0
1
0
0
0
0
1
0 0 0 1 0
>>tril(M) % Matriz formada por la parte triangular inferior de M.
ans
1 0
4 5
7 8
=
0
0
9
=
3
6
9
Las operaciones habituales entre arrays (suma, resta y producto escalar de vectores;
suma, resta, producto y potencia de matrices) se representan con los operadores
habituales:
>>v,w
v
1
w
4
=
2 3
=
5 6
>>z=v*w'
z =
32
>>Z=w'*v
Z
4
5
6
=
8 12
10 15
12 18
>>v*w
=
3
6
1
>>mat^2
ans =
9 12 18
24 33 48
0 0 1
% ans(i)=v(i)*w(i)
ans =
4 10 18
>>w./v
ans =
4.0000 2.5000 2.0000
>>mat.^2 % Matriz cuyos elementos son los de mat elevados
% al cuadrado: ans(i,j)=mat(i,j)^2
ans =
1 4 9
16 25 36
0 0 1
Variables lgicas.
Tambin existen variables lgicas que toman los valores 0 (falso) o 1 (verdadero) . Por ejemplo:
>>abs(v)>=2
ans =
0 1 1
>>vector=v(abs(v)>=2) % Vector formado por la coordenadas de v que
% verifican la desigualdad
Polinomios.
Se puede trabajar con polinomios: basta tener en cuenta que un polinomio no es ms
que un vector. El orden de los coeficientes es de mayor a menor grado, por ejemplo:
>>p=[1 0 2 0 3]
% Polinomio x^4+2*x^2+3
p =
1 0 2 0 3
>>q=[2 1 0]
% Polinomio 2*x^2+x
q =
2 1 0
ans =
6
>>pro=conv(p,q)
pro =
2 1 4 2 6 3 0
>>deconv(pro,p)
ans =
2 1 0
>>roots(pro)
ans =
0
0.6050+1.1688i
0.6050-1.1688i
-0.6050+1.1688i
-0.6050-1.1688i
-0.5000
>>poly([i -i 1/2 pi])
ans =
1.0000 -3.6416 2.5708 -3.6416 1.5708
Derivadas y primitivas.
Dentro del mdulo (toolbox) de matemtica simblica, se utiliza el programa de
clculo simblico MAPLE. Con estas herramientas, se puede trabajar con funciones,
>>f='sin(x)'
f =
sin(x)
calcular derivadas,
>>diff(f)
ans =
cos(x)
>>diff(f,2)
% Derivada segunda de f
ans =
-sin(x)
o encontrar primitivas.
>>int('log(x)') % Primitiva de la funcin logaritmo
ans =
x*log(x)-x
>>diff('x*log(x)-x') % Comprobacin
ans =
log(x)
Grficas de funciones.
MATLAB tiene un gran potencial de herramientas grficas. Se pueden dibujar los
valores de un vector frente a otro (de la misma longitud):
>>x=pi*(-1:0.1:1);
>>y=x.*sin(x);
>>plot(x,y)
% Por defecto une los puntos (x(i),y(i)) mediante una
poligonal
Como se ve, con pocos puntos la grfica tiene un aspecto demasiado lineal a trozos.
Para "engaar" al ojo, basta tomar ms puntos.
>>x=pi*(-1:0.01:1);
>>y=x.*sin(x);
>>plot(x,y)
>>hold on
anteriores
>>fplot('cos(x)',[0 2*pi])
cos(x)
>>hold off
anteriores
>>fplot('x^2*sin(1/x)',[-0.05 0.05])
Tambin puede usarse el verstil comando ezplot (se lee como easy plot) que
permite dibujar funciones,
>>ezplot('exp(x)')
% Dibuja la funcin exponencial en un intervalo
adecuado a la funcin
curvas en paramtricas,
>>ezplot('sin(t)','cos(t)',[0 pi])
e implcitas
>>ezplot('x^2 - y^2 - 1')
Para escribir un programa con MATLAB habr que crear un fichero que tenga
extensin .m y contenga las instrucciones. Esto se puede hacer con cualquier editor de
textos, pero tiene algunas ventajas usar el editor propio de MATLAB llamado medit.
MATLAB trabaja con memoria dinmica, por lo que no es necesario declarar las
variables que se van a usar. Por esta misma razn, habr que tener especial cuidado y
cerciorarse de que entre las variables del espacio de trabajo no hay ninguna que se
llame igual que las de nuestro programa (proveniente, por ejemplo, de un programa
previamente ejecutado en la misma sesin), porque esto podra provocar conflictos. A
menudo, es conveniente reservar memoria para las variables (por ejemplo, si se van a
utilizar matrices muy grandes); para ello, basta con asignarles cualquier valor. Del
mismo modo, si se est usando mucha memoria, puede ser conveniente liberar parte
de ella borrando (clear) variables que no se vayan a usar ms.
Un programa escrito en MATLAB admite la mayora de las estructuras de
programacin al uso y su sintaxis es bastante estndar. En los siguientes ejemplos se
muestra la sintaxis de algunas de estas estructuras (if, for, while,...).
Ejemplo 1: Calcular la suma de los n primeros trminos de la sucesin 1, 2x, 3x^2,
4x^3, ...
n=input('Cuntos trminos quieres sumar?
x=input('Dame el valor del numero x ');
suma=1;
for i=2:n
suma=suma+i*x^(i-1);
end
disp('El valor pedido es')
disp(suma)
');
Ejemplo 3: Escribir un nmero natural en una base dada (menor que diez).
n=input('Dame el nmero que quieres cambiar de base ');
base=input('En qu base quieres expresarlo? ');
i=1;
while n>0
c(i)=rem(n,base);
n=fix(n/base);
% Parte entera de n/base
i=i+1;
end
disp('La expresin en la base dada es:')
i=i-1;
disp(c(i:-1:1))
Es conveniente que el fichero que contenga la funcin se llame como ella; as, la
funcin anterior debera guardarse en el fichero fun.m; por ejemplo, si se desea
programar una funcin que calcule, mediante el algoritmo de Euclides, el mximo
comn divisor de dos nmeros naturales, basta escribir un fichero euclides.m cuyo
contenido sea:
function m=euclides(a,b)
% Clculo del mximo comn divisor de dos nmeros naturales
% mediante el algoritmo de Euclides
if a<b
c=b;
b=a;
a=c;
end
while b>0
c=rem(a,b);
a=b;
b=c;
end
m=a;
Nociones preliminares
Antes de empezar ...
La elaboracin de un programa para Matlab es muy sencilla. Basta abrir un documento de texto
(se puede hacer con cualquier editor, Matlab trae uno incorporado), escribir las instrucciones tal
como se pondran en la ventana de comandos y guardar el documento con la extensin .m (por
ejemplo: miprog.m). Matlab reconoce automticamente los ficheros que tienen extensin .m: si
en la ventana de comandos se introduce
miprog
las rdenes almacenadas en el fichero miprog.m se ejecutarn, una tras otra. A ese recorrido a
travs de las instrucciones se le conoce con el nombre de flujo. Los comandos de un programa se
denominan tambin sentencias.
El hecho de guardar una serie de instrucciones (el cdigo) en un fichero tiene de por s algunas
ventajas: evita el repetir las rdenes en la ventana de comandos. Pero la potencia de un programa
se pone de manifiesto si en l se contienen instrucciones que controlan qu sentencias se ejecutan
en cada circunstancia. As, un programa puede "decidir", llegado a un punto, ejecutar unos
comandos u otros en funcin del valor que tome una variable, por poner un caso.
Control de flujo
Al proceso de toma de decisiones se le llama control del flujo
Antes de ponerse a escribir el programa, sobre todo si es un poco largo o complejo, es til trazar
un esquema, en lenguaje corriente, de lo que se quiere hacer. A eso se le denomina un diagrama
de flujo. Si lo que se pretende est claro, escribir el programa se reduce a traducir el diagrama de
flujo del castellano al lenguaje de Matlab.
Diagrama de flujo.
En un diagrama de flujo ha de buscarse la claridad, la concisin, el rigor. Con un buen diagrama
de flujo, gran parte del trabajo est hecho. Puede ser tentador comenzar a escribir directamente el
programa en el editor, con la esperanza de hacerlo todo bien a la primera. Suele ser ms eficaz,
sin embargo, escribir antes el diagrama de flujo, para luego intentar pasarlo al lenguaje
informtico elegido.
Condiciones
Son las preguntas bsicas a las que se puede responder s o no
Para implementar el control del flujo, son muy tiles unas expresiones que permiten comparar
dos variables entre s o una variable con un valor fijo. En un programa, a veces es necesario
preguntarse: es x mayor que y? Pues si x es mayor que y, entonces ..., y si no, ... ; o bien: caso
de que la variable x sea menor que cero, hacer tal cosa.
Las condiciones se construyen con operadores relacionales, como son los siguientes:
>
<
==
~=
mayor que
menor que
igual que
diferente que
Ramificaciones
Dependiendo de una condicin, el programa decide el curso que seguir
El resultado de una condicin permite tomar una decisin, es decir, si la condicin es verdadera
se ejecutan determinadas sentencias. El diagrama de flujo se ramifica:
If - end
Ledo en lenguaje corriente: si la longitud del vector x es menor que 8, se realiza el ajuste lineal
indicado en la instruccin fprintf('el nmero menor que 8\n'). Caso contrario (si la
longitud del vector x es mayor o igual a 8) esa instruccin no se ejecuta (y el programa sigue en
la instruccin que venga despus de end).
If else- end
if (condicin)
sentencias A
else
sentencias B
end
Ejemplo
x=5;
if rem(x,2)==0
fprintf('el nmero es par\n')
else
fprintf('el nmero es impar\n')
end
Una vez se hayan ejecutado las sentencias que correspondan (las sentencias A si la
condicin es verdadera, las sentencias B en caso contrario) el programa contina con las
instrucciones que vengan despus de end.
If elseif- end
Es de sealar que las ramificaciones se pueden anidar (una condicin dentro de otra: dentro de
las sentencias A o de las sentencias B en el anterior diagrama de flujo). El cdigo
if (condicin 1)
sentencias A
else if
sentencias B
else %cuando no cumple las condiciones 1 y 2
sentencias C
end
Ejemplo
x=5;
if x<3
fprintf('el nmero menor que 3\n')
elseif x>=3 && x<5
fprintf('el nmero es mayor o igual a 3\n')
fprintf('pero menor que 5\n')
else % cuando no se cumple las condiciones A y B
fprintf('el nmero es mayor o igual a 5\n')
end
Switch -end
Otra posibilidad de ramificacin mltiple, anloga a un conjunto de if,..,elseif, la ofrece la
construccin switch. La sintaxis es:
switch variable
case valor1,
sentencias A
case valor2,
sentencias B
case ...
...
end
(Como antes, lo escrito en cursiva debe sustituirse por las expresiones adecuadas). Las palabras
clave son switch, case, end.
La ramificacin switch opera de la siguiente manera. Al llegar a la expresin switch
variable, si variable tiene el valor valor1 se ejecutan las sentencias A; si
variabletoma el valor valor2, las sentencias B; y as sucesivamente. Es
importante notar que la variable slo debe tomar unos pocos valores: valor1, valor2, etc.
para que el programa se ramifique en unas pocas ramas. No tiene sentido intentar una
ramificacin switch con una variable que pueda tomar un nmero infinito de valores.
Ejemplo
switch lower(method)
case {'linear','bilinear'}
disp('Method is linear')
case 'cubic'
disp('Method is cubic')
case 'nearest'
disp('Method is nearest')
otherwise
disp('Unknown method.')
end
Ejemplo
myNumber = input ('Introduce un nmero: ')
switch myNumber
case -1
disp ('uno negativa');
case 0
disp ('cero');
case 1
disp ('uno positivo');
otherwise
disp ('otro valor');
end
Bucles
Varias secuencias que se ejecutan repetidas veces? Un bucle
Hay ocasiones en las que es necesario repetir el mismo conjunto de instrucciones muchas veces,
cambiando algunos detalles. Pongamos un caso. Sea un vector x(i) con n componentes; se
quiere construir la "media mvil" de x con tres elementos, que consiste en ir tomando la media
aritmtica de cada tres puntos consecutivos.
Es decir: desde i=2 hasta n-1, media(i-1)=(x(i)+x(i-1)+x(i+1))/3.
(Detalles: se empieza a contar en i=2 porque para el primer elemento de x no existe el
elemento anterior; y se acaba en n-1 por anloga razn; adems, el primer componente de
media es el correspondiente a i=2, de ah que se asigne el resultado a media(i-1)).
Eso es lo que se consigue con un bucle for, cuya sintaxis es:
for contador=inicio:paso:fin,
sentencias
end
Las palabras claves son for y end. Este bucle pone en marcha una variable llamada
contador que va desde inicio hasta fin de paso en paso. Cada vez que las
sentencias se ejecutan, contador aumenta en un valor paso (que si se omite, se le
asigna automticamente el valor 1). Cuando contador llega al valor fin, el bucle se acaba y
el programa contina con las sentencias que haya ms all de end.
While - end
while(condicin),
sentencias
end
Este bucle ejecuta las sentencias mientras la condicin sea verdadera.
Es posible sustituir la condicin por una variable. En efecto: una variable que toma el valor
cero corresponde a una condicin falsa. Si la variable toma un valor diferente de cero, es
equivalente a una condicin verdadera. As, se puede escribir
Ejemplo
x=10;
while(x)
%sentencias
x=x-1;
fprintf('el nmero x es igual a \n')
x
end
Ejemplo
eps = 1;
while (1+eps) > 1
eps = eps/2;
end
eps = eps*2
Para = 10, la "condicin" es verdadera puesto que es diferente de cero. Ntese que el
contador x hay que modificarlo manualmente (lnea x=x-1) puesto que, al revs que lo que
ocurre con el bucle for, este no gestiona ningn contador. En cuanto x tome el valor cero, la
"condicin" es falsa y el bucle acaba.
Atencin: es fcil caer en bucles infinitos. En el ejemplo anterior, si falta la lnea x=x-1 y las
sentencias no modifican el valor de x, la "condicin" siempre ser cierta (pues x=10) y
el programa nunca saldr del bucle: ejecutar una y otra vez las sentencias. El programa se
"cuelga", y hay que interrumpirlo desde el teclado apretando las teclas Ctrl+C.
Estilo
El programa debe resultar de fcil lectura. As, pasado el tiempo, es ms sencillo revisarlo.
Los nombres de las variables, en la medida de lo posible, deben ser autoexplicativos. La
siguiente porcin de cdigo, escrita de dos maneras equivalentes, lo muestra. Por qu llamar x
o N a una variable? Los nombres abstractos restan claridad al programa.
N=10;
x=rand(1,N);
y=zeros(1,N);
for i=1:N,
y(i)=sum(x(1:i));
end
num_pts=10;
prob=rand(1,num_pts);
prob_acum=zeros(1,num_pts);
for indice=1:num_pts,
prob_acum(indice)=sum(prob(1:indice));
end
Ambos cdigos son equivalentes y se ejecutarn igual de rpido (los nombres largos de las
variables no influyen en la velocidad de ejecucin).
Introducir comentarios en el programa. Los comentarios son lneas que no se ejecutan, en las
que se escriben aclaraciones explicativas. Para que una lnea no se ejecute, basta escribir al
principio de ella el smbolo %. As:
Suele ser bueno definir las variables al principio. Ello evita tener que buscarlas a lo largo
del cdigo para cambiar su valor cuando sea necesario. Adems, si es posible, es mejor definir
los vectores y matrices al principio con su dimensin adecuada. En el caso de que haya que ir
rellenando los valores de un vector, el programa va ms rpido si se define el vector vaco al
principio (con el comando ones o zeros) que ir aadiendo componentes al vector conforme
se van calculando.
Para ver dnde empiezan y dnde acaban los bucles y ramificaciones, es costumbre indentar
(introducir una sangra) en las lneas contenidas en ellos. Eso resulta de especial ayuda en los
bucles y condiciones anidados.
Ejercicios y soluciones
Los problemas ms interesantes suelen ser los que uno se encuentra en la vida real ...
A. Ejercicios
Escribir una funcin que devuelva el valor absoluto del argumento. (Nota.- Ya existe en
Matlab: abs(x)).
Escribir una funcin que devuelva el radio (distancia al origen), recibiendo como
argumento las coordenadas cartesianas (x,y).
Escribir un programa que, tras pedir al usuario un nmero, le informe de si es par, impar
o no entero.
Escribir un programa que calcule las N primeras fracciones del tipo 1/i, tras pedir N al
usuario.
Escribir un programa que calcule los cuadrados de los nmeros enteros, hasta que el
cuadrado sea mayor o igual que 100.
B. Proyectos
Realizar una criba de nmeros primos, esto es, elaborar un programa que calcule en el
menor tiempo posible la mayor cantidad de nmeros primos consecutivos partiendo de los ms
pequeos.
EJEMPLOS DE APLICACIN
Ejemplo Clculo del psilon de la mquina.
%Prctica 1.7: Clculo del psilon de la mquina.
x=1;
while 1+x>1
x=x/2;
end
x=2*x;
%3.3f
%3.3f \n',normf,norm(A,'fro'));
end
Ejemplo Regla de los trapecios.
function area=trapecios(a,b,m)
% Prctica 7.1: Regla de los trapecios.
global fname
fname=input('Dame la funcin f(x) entre comillas ');
if nargin < 1
a=input('Dame el extremo izquierdo del intervalo ');
b=input('Dame el extremo derecho del intervalo ');
end
if nargin < 3
m=input('Dame el nmero de subintervalos ');
end
h=(b-a)/m;
x=a:h:b;
sum=0;
for i=2:m
sum=sum+f(x(i));
end
area=(h/2)*(f(a)+f(b)+2*sum);
function y=f(u)
global fname
x=u;
y=eval(fname);
p(2,1:n-1)=p1;
g(2)=n-1;
r=1;
cont=1;
while any(r)
[q,r]=deconv(p(cont,1:g(cont)),p(cont+1,1:g(cont+1)));
aux=find(abs(r)<prec);
m=length(aux);
r(aux)=zeros(1,m);
ind=1;
while abs(r(ind))==0 & ind<length(r)
ind=ind+1;
end
g(cont+2)=length(r)-ind+1;
p(cont+2,1:g(cont+2))=-r(ind:length(r));
cont=cont+1;
end
p=p(1:cont,:);
g=g(1:cont);
for i=1:cont
sa(i)=polyval(p(i,1:g(i)),a);
sb(i)=polyval(p(i,1:g(i)),b);
end
sa=sa(find(sa));
sb=sb(find(sb));
ca=0;
cb=0;
for i=1:length(sa)-1
if sa(i)*sa(i+1)<-eps
ca=ca+1;
end
end
for i=1:length(sb)-1
if sb(i)*sb(i+1)<-eps
cb=cb+1;
end
end
c=ca-cb;