Programaciòn en Matlab
Programaciòn en Matlab
PROGRAMACIÓN EN MATLAB
Expresiones lógicas.
MATLAB es capaz de respondernos si ciertas expresiones son verdaderas o falsas. Por
ejemplo, podemos formar estas expresiones comparando dos números. Si la
comparación es cierta, MATLAB nos responderá con un uno y si es falsa con un cero.
3<4
ans=
4<3
ans=
La siguiente tabla nos muestra el formato de las comparaciones que podemos realizar
con MATLAB.
menor que
mayor que
Si comparamos dos matrices del mismo orden, MATLAB nos responde con la matriz
que resulta al comparar elementos con mismos índices.
[1 2; 2 4] >= [1 2; 3 4]
ans=
1 1
0 1
Si comparamos una matriz con un número, el resultado es una matriz que muestra el
valor lógico de la comparación de cada elemento de la matriz con dicho número.
[1 2; 3 4] >= 2
ans=
0 1
1 1
Ejercicio: Pregunta a MATLAB si es mayor que el número .
Ejercicio: Compara dos cadenas de caracteres de la misma longitud, por ejemplo 'hola'
y 'majo'. Explica el resultado.
Ejercicio: Considera el vector x=[1 2 4 5 7 9 11]. >Qué se obtiene al escribir x(x 5)?
Explica el resultado.
Para los valores lógicos hay definidas tres operaciones fundamentales que en
informática reciben los nombres AND, OR y NOT:
[p&q;p|q; p]
ans=
1 0 0 0
1 1 1 0
0 0 1 1
3>2 | 1<0
ans=
Veamos seguidamente funciones definidas para los valores lógicos. La instrucción any
aplicada a un vector devuelve el valor uno si algún elemento del vector vale uno y cero
en caso contrario. La instrucción all aplicada a un vector devuelve el valor uno cuando
todos los elementos del vector valen uno y devuelve cero en caso contrario.
any([1 0 0 1])
ans=
Si se aplica el comando any o all a una matriz, MATLAB devuelve un vector fila que
resulta de efectuar a cada uno de los vectores columnas la operación any o all,
respectivamente.
El comando exist responde si una variable está definida en el Workspace. Notemos que
el argumento de exist debe ser una cadena con el nombre de la variable.
a=2; exist('a')
ans=
Ejercicio: Define las matrices h y a mediante las instrucciones h=['hola' 33]; a=[3
'adios' 3];. Pregunta si se trata de una cadena o de una variable numérica. Observa el
resultado que se muestra por pantalla al teclear h, a.
Bucles.
Es habitual que al resolver cierto problema tengamos que repetir varias veces un cierto
número de instrucciones, como ocurre, por ejemplo, al programar el método de Newton
para aproximar raíces. Para realizar esta operación de forma cómoda los lenguajes de
programación disponen de ciertas estructuras que reciben el nombre de bucles. En
MATLAB, una de las principales instrucciones para generar bucles es for end. El
formato de la misma es:
for =
Bloque de instrucciones
end
for i=[1 2; 3 4]
ans=
2 4 6
Señalemos que, tras el bucle, la variable utilizada como , en nuestro caso i, toma el
último valor que se le ha asignado durante el bucle. En nuestro ejemplo la variable i ya
no sería la unidad imaginaria.
i
i=
Aunque hemos visto que var puede ser una matriz, lo habitual es que no sea más que un
contador del número de iteraciones. En esta situación escribimos:
for i=1:n
z(1)=1; z(2)=1;
for n=2:99
z(n+1)=z(n)+z(n-1);
end
, con y .
Solución:
for i=2:1/h
t(i)=t(i-1)+h;
y(i)=(1+h)*y(i-1);
end
plot(t,y,t,exp(t))
MATLAB permite anidar varias instrucciones for. Al escribir end se cierra el útimo
bucle definido. Para mayor claridad a la hora de escribir el programa conviene variar el
margen para observar claramente qué end corresponde a cada for. Como ejemplo de
anidamiento de bucles representamos, en una gráfica, 9nueve circunferencias de radio
unidad con centros en los puntos (-1,-1), (-1,0), (-1,1), (0,-1), (0,0), (0,1), (1,-1), (1,0),
(1,1), mediante el siguiente programa:
t=0:0.1:2*pi;
k=1;
for i=-1:1
for j=-1:1
X(:,k)=(cos(t)+i)';
Y(:,k)=(sin(t)+j)';
k=k+1;
end
end
plot(X,Y)
Ejercicio: Crea, usando dos bucles for anidados, la matriz H=(h ) de orden 10 10
Otra forma de crear bucles es mediante la instrucción while... end, cuya estructura es:
while valor-lógico
Bloque de instrucciones
end
.
Figura 3.1: Diagrama de flujo de la instrucción while
Observamos que en la pantalla aparecen ``holas'' sin parar y nunca termina por aparecer
el símbolo `` ''. Ello es debido a que hemos creado un bucle infinito en el que
continuamente se ejecuta el bloque de instrucciones, ya que valor-lógico siempre es
uno. Para detener la ejecución de esta instrucción pulsamos + o
+ .
Como ejemplo de la orden while calculamos el primer factorial mayor que 1000.
n=1;
n=n+1;
end
Solución:
z=1; z1=1;
while z<=1e6
z2=z;
z=z+z1;
z1=z2;
end
Decisiones.
En MATLAB la instrucción que sirve para tomar decisiones es if. Su formato es
if valor-lógico 1
Bloque de instrucciones 1
elseif valor-lógico 2
Bloque de instrucciones 2
elseif valor-lógico n
Bloque de instrucciones n
else
Bloque de instrucciones final
end
x(1)=0;j=0;
for i=1:748
if rem(748,i)==0
j=j+1;
x(j)=i;
end
end
Ejercicio: Calcula todos los divisores de 687.
Solución:
i=1;
for j=2:200
if all(rem(j*ones(1,j-2),2:(j-1)) =0)
x(i)=j;
i=i+1;
end
end
Archivos .m
Llegados a este punto somos capaces de hacer pequeños programas, pero cada vez que
deseemos repetir alguno de ellos tendremos que escribirlo de nuevo. Si el programa
tiene cierto tamaño, la tarea puede ser ardua. Por estos motivos, MATLAB permite que
se puedan almacenar los programas en ficheros de textos y, posteriormente, ser
llamados para su ejecución.
Veamos un ejemplo, para ello abrimos un editor de texto (por ejemplo, el Bloc de Notas
de Windows) y escribimos el siguiente programa que calcula el n-ésimo término de la
sucesión de Fibonacci:
f1=1; f2=1;
for i=3:n
f3=f2+f1;
f1=f2;
f2=f3;
end
Guardaremos este archivo en la unidad de disco flexible (A:) con el nombre fibo.m. Es
necesario escribir el nombre del programa terminado en .m para que MATLAB
reconozca que se trata de un programa escrito en su ``lenguaje''. Además, para ejecutar
los ficheros .m es necesario que éstos se encuentren en nuestro directorio de trabajo o en
otros directorios que han de especificarse previamente a MATLAB. Para cambiar el
directorio de trabajo a la unidad A: escribimos
!A:
El signo ``!'' al inicio de la línea sirve para indicar que lo que siguen son órdenes del
sistema operativo.
Una vez efectuadas estas operaciones, al escribir la orden fibo se ejecutan todas las
instrucciones escritas en dicho archivo.
n=10;
fibo
f2
f2=
55
function f2=fibo(n)
55
El programa que hemos creado queda almacenado en el disco y puede que cuando lo
volvamos a utilizar no recordemos exactamente para qué servía. Para evitar este
problema es útil añadir ciertos comentarios en el archivo. Dichos comentarios se sitúan
en líneas precedidas por el signo ``%''.
function f2=fibo(n)
% Este programa calcula el término n-ésimo de la % sucesión de
Fibonacci.
% fibo(n) devuelve el término n de la sucesión de
% Fibonacci.
f3=f2+f1;
f1=f2;
f2=f3;
end
Las primeras líneas de comentario, hasta la primera línea en blanco o hasta que
comienzan las instrucciones, se pueden examinar desde MATLAB sin tener que abrir el
archivo con el editor. Para ello basta utilizar la orden help.
help fibo
NOTA: Puede ser que en vez de vocales acentuadas aparezcan otros caracteres.
type fibo
Ejercicio: Examina con type los programas de las instrucciones linspace, logspace,
mean y sum.
Ejercicio: Haz un fichero .m que contenga un programa que calcule los números
primos menores que una cantidad dada.
Ejercicio: Repite el programa anterior para matrices normales. Recuerda que una matriz
se dice normal si , donde es la transpuesta conjugada.
disp(f2)
function juego
% Programa-juego para averiguar un número aleatorio entre
% uno y diez.
% al=número aleatorio.
% ne=número escogido.
al=0;
while al==0
al=ceil(10*rand(1,1));
end
ne=0;
while(ne =al)
ne=input('escriba un número entre 1 y 10>>');
if ne>al
b='mayor';
elseif ne<al
b='menor';
else
b='igual';
end
function [r,nit]=raiz(x,pre)
if nargin==1
pre=1e-2;
end
r=x;
r1=0;
nit=0;
while abs(r-r1)>pre
r1=r;
r=(r*r+x)/(2*r);
nit=nit+1;
end
[r,nit]=raiz(3,1e-10)
ya visto en la sección 1.2, para que cuando no haya argumentos de salida represente una
gráfica, si hay uno, dé por salida una matriz en la cual una columna esté formada por los
valores de y la otra por los valores y si hay dos argumentos de salida, en uno
Órdenes de ruptura.
Puede ser que al ejecutar un programa, si se da una determinada circunstancia,
queramos parar la ejecución del mismo definitivamente o hasta que pase cierto intervalo
de tiempo. Las órdenes break, error, return y pause permiten realizar esto, bajo
diferentes circunstancias y con los resultados que se detallan.
La orden break para la ejecución de todos los ficheros .m que se estén ejecutando en
y equivale a
Como muestra implementamos el método de Euler con paso fijo para el problema de
valores iniciales
Donde es una función cualquiera. Recordemos que el método de Euler nos suministra
la sucesión definida por recurrencia
y(it+1)=y(it)+h*feval(fun,t(it),y(it));
t(it+1)=t(it)+h;
it=it+1;
end
eval('a=2');
es equivalente a
a=2;
y si a la variable fun se le asigna una cadena con el nombre de una función, por ejemplo
'atan2', entonces
eval([fun '(3,a)']);
es equivalente a
feval(fun,3,a);
Archivos de datos.
Los resultados que se obtienen al ejecutar una determinada instrucción o programa son
perdidos al acabar la sesión de MATLAB. Si queremos almacenarlos en un archivo,
para después utilizarlos en otras sesiones necesitaremos usar la instrucción save. Por
ejemplo, al teclear
A=rand(3,3)
save alea.mat A
load alea.mat
Ejercicio: Genera una matriz mágica y guardala en un archivo .mat. Una vez realizadas
estas operaciones borra el WorKspace y vuelve a recuperar la matriz anterior.
Si se teclea
save espacio.mat
Sin determinar las variables a almacenar, en el archivo espacio.mat se guardan todas las
variables del Workspace.
Los ficheros .mat son un tipo particular de archivos que sólo pueden ser leídos por
MATLAB. Para almacenar la matriz A en un fichero de texto, tecleamos la instrucción