Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Basico Matlab
Manual Basico Matlab
PREPARADA POR:
BIBIANA LPEZ RODRGUEZ
MAURICIO OSORIO LEMA
INTRODUCCIN
En el desarrollo de Mtodos Numricos, es indispensable el uso del computador.
sta es tal vez, la herramienta ms importante de la cual disponemos para realizar
grandes clculos en poco tiempo. Sin embargo, el computador por s slo no
puede realizar nada; necesita de un buen programa y de un buen programador
para poder trabajar para nosotros.
Dentro de los programas con los que se cuenta actualmente para trabajar en
matemticas aplicadas e ingeniera, est MATLAB (MATrix LABoratory), que ha
venido incrementando su popularidad en los ltimos aos, debido a su gran
versatilidad, pues cuenta con una gran cantidad de funciones que pueden ser
usadas por los trabajadores de diversas reas y, adems es por si mismo un
lenguaje de programacin que permite crear nuevas y mejores aplicaciones.
En
Figura 1
3.2 El Editor/Debugger
Es la ventana en la que se crean los programas de MATLAB. Se obtiene al hacer clic
en File New - M file. En MATLAB tienen particular importancia los ya citados ficherosM (o M-files). Son ficheros de texto ASCII, con la extensin *.m, que contienen conjuntos
de comandos o definicin de funciones. La importancia de estos ficheros-M es que al
teclear su nombre en la lnea de comandos y pulsar Intro, se ejecutan uno tras otro todos
los comandos contenidos en dicho fichero. El poder guardar instrucciones y grandes
matrices en un fichero permite ahorrar mucho trabajo de tecleado.
figura 2
Aunque los ficheros *.m se pueden crear con cualquier editor de ficheros ASCII tal como
Notepad, MATLAB dispone de un editor que permite tanto crear y modificar estos
ficheros, como ejecutarlos paso a paso para ver si contienen errores (proceso de Debug o
depuracin). La Figura muestra la ventana principal del Editor/Debugger, en la que se ha
tecleado un fichero-M llamado Prueba1.m, que contiene un comentario y seis
sentencias. El Editor muestra con diferentes colores los diferentes tipos o elementos
constitutivos de los comandos (en verde los comentarios, en rojo las cadenas de
caracteres, etc.). El Editor se preocupa tambin de que las comillas o parntesis que se
abren, no se queden sin el correspondiente elemento de cierre. Colocando el cursor antes
o despus de una apertura o cierre de corchete o parntesis y pulsando las teclas () o
(), el Editor muestra con qu cierre o apertura de corchete o parntesis se empareja el
elemento considerado; si no se empareja con ninguno, aparece con una rayita de
tachado.
Seleccionando varias lneas y haciendo clic con el botn derecho aparece un men
contextual que permite entre otras cosas comentar con el carcter % todas las lneas
seleccionadas.
La ejecucin se comienza eligiendo el comando Run en el men Debug, pulsando la tecla
F5, haciendo clic en el botn Continue ( ) de la barra de herramientas del Editor o
tecleando el nombre del fichero en la lnea de comandos de la Command Window. Los
puntos rojos que aparecen en el margen izquierdo son breakpoints (puntos en los que se
detiene la ejecucin del programa); la flecha verde indica la sentencia en que est
detenida la ejecucin (antes de ejecutar dicha sentencia); cuando el cursor se coloca
sobre una variable (en este caso sobre la matriz A) aparece una pequea ventana con
los valores numricos de esa variable.
Puede apreciarse los botones que corresponden al Debugger. El significado de estos
botones, que aparece al colocar el cursor sobre cada uno de ellos, es el siguiente:
Set/Clear Breakpoint. Coloca o borra un breakpoint en la lnea en que est el cursor.
Clear All Breakpoints. Elimina todos los breakpoints que haya en el fichero.
Step. Avanzar un paso sin entrar en las funciones de usuario que se llamen en esa lnea.
Step In. Avanzar un paso, y si en ese paso hay una llamada a una funcin cuyo fichero *.m
est accesible, entra en dicha funcin.
Step Out. Salir de la funcin que se est ejecutando en ese momento.
Continue. Continuar la ejecucin hasta el siguiente breakpoint.
Quit Debugging. Terminar la ejecucin del Debugger.
El Debugger es un programa que hay que conocer muy bien, pues es muy til para
detectar y corregir errores. Es tambin enormemente til para aprender mtodos
numricos y tcnicas de programacin. Para aprender a manejar el Debugger lo mejor es
practicar.
Cuando se est ejecutando un programa con el Debugger, en cualquier
puede ir a la lnea de comandos de MATLAB y teclear una expresin
resultado. Tambin se puede seleccionar con el ratn una sub-expresin
lnea vista en el Editor/Debugger, hacer clic con el botn derecho y
momento se
para ver su
en cualquier
en el men
contextual que se abre elegir Evaluate Selection. El resultado de evaluar esa subexpresin aparece en la lnea de comandos de MATLAB.
4. programacin en MATLAB:
Como se mencion en el numeral anterior, los programas de MATLAB se crean en la
ventana Editor/Debugger, la cual se puede obtener al hacer clic en File New - M file.
Como ya se ha dicho varias veces, MATLAB es una aplicacin que se puede programar
muy fcilmente. De todas formas, como lenguaje de programacin pronto ver que no
tiene tantas posibilidades como otros lenguajes (ni tan complicadas...). Se comenzar
viendo las bifurcaciones y bucles, y la lectura y escritura interactiva de variables, que son
los elementos bsicos de cualquier programa de una cierta complejidad.
donde la opcin por defecto else puede ser omitida: si no est presente no se hace nada
en caso de que no se cumpla ninguna de las condiciones que se han chequeado.
Una observacin muy importante: la condicin del if puede ser una condicin matricial, del
tipo A==B, donde A y B son matrices del mismo tamao. Para que se considere que la
condicin se cumple, es necesario que sean iguales dos a dos todos los elementos de las
matrices A y B (aij=bij, 1im, 1jn). Basta que haya dos elementos aij y bij diferentes
para que las matrices ya no sean iguales, y por tanto las sentencias del if no se ejecuten.
Anlogamente, una condicin en la forma A~=B exige que todos los elementos sean
diferentes dos a dos (aijbij, 1im, 1jn). Bastara que hubiera dos elementos aij y bij
iguales para que la condicin no se cumpliese. En resumen:
if A==B exige que todos los elementos sean iguales dos a dos
if A~=B exige que todos los elementos sean diferentes dos a dos
o bien,
for i=vectorValores
sentencias
end
donde vectorValores es un vector con los distintos valores que tomar la variable i. En el
siguiente ejemplo se presenta el caso ms general para la variable del bucle (valor_inicial:
incremento: valor_final); el bucle se ejecuta por primera vez con i=n, y luego i se va
reduciendo de 0.2 en 0.2 hasta que llega a ser menor que 1, en cuyo caso el bucle se
termina:
for i=n:-0.2:1
sentencias
end
Una ltima forma de inters del bucle for es la siguiente (A es una matriz):
for i=A
sentencias
end
donde condicion puede ser una expresin vectorial o matricial. Las sentencias se siguen
ejecutando mientras haya elementos distintos de cero en condicion, es decir, mientras
haya algn o algunos elementos true. El bucle se termina cuando todos los elementos de
condicion son false (es decir, cero).
4.1.4 SENTENCIA BREAK
Al igual que en C/C++/Java, la sentencia break hace que se termine la ejecucin del
bucle ms interno de los que comprenden a dicha sentencia.
4.1.5
OTRAS SENTENCIAS:
En MATLAB, existen otras sentencias como switch, continue, try que no son muy
utilizadas y, por lo tanto, omitimos su explicacin.
En este caso el texto tecleado como respuesta se lee y se devuelve sin evaluar, con lo
que se almacena en la cadena nombre. As pues, en este caso, si se teclea una frmula,
se almacena como texto sin evaluarse.
Ejectense las sentencias anteriores en MATLAB y obsrvese la diferencia entre las dos
formas de imprimir la matriz A.
10
Como ya se ha dicho, los ficheros de comandos o scripts son ficheros con un nombre
tal como file1.m que contienen una sucesin de comandos anloga a la que se tecleara
en el uso interactivo del programa. Dichos comandos se ejecutan sucesivamente cuando
se teclea el nombre del fichero que los contiene (sin la extensin), es decir cuando se
teclea file1 con el ejemplo considerado. Cuando se ejecuta desde la lnea de comandos,
las variables creadas por file1 pertenecen al espacio de trabajo base de MATLAB. Por el
contrario, si se ejecuta desde una funcin, las variables que crea pertenecen al espacio
de trabajo de la funcin.
11
En los ficheros de comandos conviene poner los puntos y coma (;) al final de cada
sentencia, para evitar una salida de resultados demasiado cuantiosa. Un fichero *.m
puede llamar a otros ficheros *.m, e incluso se puede llamar a s mismo de modo
recursivo. Las variables definidas por los ficheros de comandos son variables del espacio
de trabajo desde el que se ejecuta el fichero, esto es variables con el mismo carcter que
las que se crean interactivamente en MATLAB si el fichero se ha ejecutado desde la lnea
de comandos. Al terminar la ejecucin del script, dichas variables permanecen en
memoria.
Donde name es el nombre de la funcin. Entre corchetes y separados por comas van los
valores de retorno (siempre que haya ms de uno), y entre parntesis tambin
separados por comas los argumentos. Puede haber funciones sin valor de retorno y
tambin sin argumentos. Recurdese que los argumentos son los datos de la funcin y
los valores de retorno sus resultados. Si no hay valores de retorno se omiten los
corchetes y el signo igual (=); si slo hay un valor de retorno no hace falta poner
corchetes. Tampoco hace falta poner parntesis si no hay argumentos.
Una diferencia importante con C/C++/Java es que en MATLAB una funcin no modifica
nunca los argumentos que recibe. Los resultados de una funcin de MATLAB se obtienen
siempre a travs de los valores de retorno, que pueden ser mltiples y matriciales. Tanto
el nmero de argumentos como el de valores de retorno no tienen que ser fijos,
dependiendo de cmo el usuario llama a la funcin.
Las variables definidas dentro de una funcin son variables 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. Se puede
decir que pertenecen al propio espacio de trabajo de la funcin y no son vistas desde
otros espacios de trabajo. Para que la funcin tenga acceso a variables que no han sido
pasadas como argumentos es necesario declarar dichas variables como variables
globales, tanto en el programa principal como en las distintas funciones que deben
acceder a su valor. Es frecuente utilizar el convenio de usar para las variables globales
nombres largos (ms de 5 letras) y con maysculas.
Por razones de eficiencia, los argumentos que recibe una funcin de MATLAB no se
copian a variables locales si no son modificados por dicha funcin (en trminos de C/C++
se dira que se pasan por referencia). Esto tiene importantes consecuencias en trminos
de eficiencia y ahorro de tiempo de clculo. Sin embargo, si dentro de la funcin se
realizan modificaciones sobre los argumentos recibidos, antes se sacan copias de dichos
argumentos a variables locales y se modifican las copias (dirase que en este caso los
argumentos se pasan por valor).
Dentro de la funcin, los valores de retorno deben ser calculados en algn momento (no
hay sentencia return, como en C/C++/Java). De todas formas, no hace falta calcular
12
siempre todos los posibles valores de retorno de la funcin, sino slo los que el usuario
espera obtener en la sentencia de llamada a la funcin. En cualquier funcin existen dos
variables definidas de modo automtico, llamadas nargin y nargout, que representan
respectivamente el nmero de argumentos y el nmero de valores de retorno con los que
la funcin ha sido llamada. Dentro de la funcin, estas variables pueden ser utilizadas
como el programador desee.
La ejecucin de una funcin termina cuando se llega a su ltima sentencia ejecutable. Si
se quiere forzar el que una funcin termine de ejecutarse se puede utilizar la sentencia
return, que devuelve inmediatamente el control al entorno de llamada.
Tambin las funciones creadas por el usuario pueden tener su help, anlogo al que tienen
las propias funciones de MATLAB. Esto se consigue de la siguiente forma: las primeras
lneas de comentarios de cada fichero de funcin son muy importantes, pues permiten
construir un help sobre esa funcin. En otras palabras, cuando se teclea en la ventana de
comandos de MATLAB:
>> help mi_func
el programa responde escribiendo las primeras lneas del fichero mi_func.m que
comienzan por el carcter (%), es decir, que son comentarios.
De estas lneas, tiene una importancia particular la primera lnea de comentarios (llamada
en ocasiones lnea H1). En ella hay que intentar poner la informacin ms relevante sobre
esa funcin.
La razn es que existe una funcin, llamada lookfor que busca una determinada palabra
en cada primera lnea de comentario de todas las funciones *.m.
4.4
Ejemplo:
Lea f, a, b, M, e
u f(a)
v f(b)
c (a+b)/2
si signo(u) = signo(v) pare, si no
xnew c
iter iter +1
mientras xnew-xold< e
w f(c)
si signo(w) signo(u) entonces
bc
vw
else
13
ac
uw
xold xnew
iter iter +1
si iter M
imprima se ha excedido el nmero mximo de iteraciones
termine
termine
4.4.1
En forma de scripts:
end
En este caso, debemos usar instrucciones input, para pedirle al usuario que ingrese los
datos necesarios: La funcin (f) a la que se le desea encontrar la raz, y el intervalo [a b]
donde se sabe que debe estar la raz.
Si guardamos este programa con el nombre biseccion.m, se puede ejecutar desde la
ventana de comandos, simplemente digitando:
>> biseccion
despus de oprimir <enter> se empezar a ejecutar la primera lnea del programa:
En forma de funcin:
Si queremos que el programa funcione como una funcin, podemos modificar las cuatro
primeras lneas del programa anterior, por una sola lnea:
>> raiz =
0.0000
fraiz =
1
Tambin se podra simplemente escribir f(x) (en lugar de feval(f,x)), para evaluar una funcin llamada f , en
un punto x, sin embargo esta notacin podra confundirse con la de componente, empleada para vectores.
15
0.0000
Obsrvese que no es necesario nombrar las variables de salida con el mismo nombre
asignado en el cdigo.
4.4.3
Otra modificacin:
16
A partir de este momento la matriz A est disponible para hacer cualquier tipo de
operacin con ella (adems de valores numricos, en la definicin de una matriz o vector
se pueden utilizar expresiones y funciones matemticas). Por ejemplo, una sencilla
operacin con A es hallar su matriz traspuesta. En MATLAB el apstrofo (') es el smbolo
de trasposicin matricial. Para calcular A (traspuesta de A) basta teclear lo siguiente (se
aade a continuacin la respuesta del programa):
A'
ans =
1 4 7
2 5 8
3 6 9
17
B =
1 4 7
2 5 8
3 6 9
Ahora ya estn definidas las matrices A y B, y es posible seguir operando con ellas. Por
ejemplo, se puede hacer el producto B*A (deber resultar una matriz simtrica):
B*A
ans =
66 78 90
78 93 108
90 108 126
De forma anloga a las matrices, es posible definir un vector fila x en la forma siguiente
(si los tres nmeros estn separados por blancos o comas, el resultado ser un vector
fila):
x=[10 20 30] % vector fila
x =
10 20 30
18
MATLAB considera comentarios todo lo que va desde el carcter tanto por ciento (%)
hasta el final de la lnea. Por el contrario, si los nmeros estn separados por intros o
puntos y coma (;) se obtendr un vector columna:
y=[11; 12; 13] % vector columna
y =
11
12
13
MATLAB tiene en cuenta la diferencia entre vectores fila y vectores columna. Por ejemplo,
si se intenta sumar los vectores x e y se obtendr el siguiente mensaje de error:
x+y
??? Error using ==> +
Matrix dimensions must agree.
MATLAB puede operar con matrices por medio de operadores y por medio de
funciones. Se han visto ya los operadores suma (+), producto (*) y transpuesta ('), as
como la funcin invertir inv( ).
Los operadores matriciales de MATLAB son los siguientes:
+
adicin o suma
sustraccin o resta
*
multiplicacin
'
traspuesta
^
potenciacin
\
divisin-izquierda
/
divisin-derecha
.*
producto elemento a elemento
./ y .\ divisin elemento a elemento
.^
elevar a una potencia elemento a elemento
Estos operadores se aplican tambin a las variables o valores escalares, aunque con
algunas diferencias. Todos estos operadores son coherentes con las correspondientes
operaciones matriciales: no se puede por ejemplo sumar matrices que no sean del mismo
tamao. Si los operadores no se usan de modo correcto se obtiene un mensaje de error.
Los operadores anteriores se pueden aplicar tambin de modo mixto, es decir con un
operando escalar y otro matricial. En este caso la operacin con el escalar se aplica a
cada uno de los elementos de la matriz. Considrese el siguiente ejemplo:
A=[1 2; 3 4]
A =
1 2
3 4
A*2
ans =
2 4
19
6 8
A-4
ans =
-3 -2
-1 0
Existen en MATLAB varias funciones orientadas a definir con gran facilidad matrices de
tipos particulares. Algunas de estas funciones son las siguientes:
eye(4) forma la matriz unidad de tamao (4x4)
zeros(3,5) forma una matriz de ceros de tamao (3x5)
zeros(4) dem de tamao (4x4)
ones(3) forma una matriz de unos de tamao (3x3)
ones(2,4) idem de tamao (2x4)
linspace(x1,x2,n) genera un vector con n valores igualmente espaciados entre x1 y x2
rand(3) forma una matriz de nmeros aleatorios entre 0 y 1, con distribucin uniforme,
de tamao (3x3)
magic(4) crea una matriz (4x4) con los nmeros 1, 2, ... 4*4, con la propiedad de que
todas las filas y columnas suman lo mismo.
MATLAB ofrece tambin la posibilidad de crear una matriz a partir de matrices previas ya
definidas, por varios posibles caminos:
recibiendo alguna de sus propiedades (como por ejemplo el tamao),
por composicin de varias submatrices ms pequeas,
modificndola de alguna forma.
A continuacin se describen algunas de las funciones que crean una nueva matriz a partir
de otra o de otras, comenzando por dos funciones auxiliares:
[m,n]=size(A) devuelve el nmero de filas y de columnas de la matriz A. Si la matriz es
cuadrada basta recoger el primer valor de retorno
n=length(x) calcula el nmero de elementos de un vector x
zeros(size(A)) forma una matriz de ceros del mismo tamao que una matriz A
previamente creada
ones(size(A)) dem con unos
A=diag(x) forma una matriz diagonal A cuyos elementos diagonales son los elementos de
un vector ya existente x
x=diag(A) forma un vector x a partir de los elementos de la diagonal de una matriz ya
existente A
diag(diag(A)) crea una matriz diagonal a partir de la diagonal de la matriz A
triu(A) forma una matriz triangular superior a partir de una matriz A (no tiene por qu ser
cuadrada)
tril(A) dem con una matriz triangular inferior
Un caso especialmente interesante es el de crear una nueva matriz componiendo como
submatrices otras matrices definidas previamente. A modo de ejemplo, ejectense las
siguientes lneas de comandos y obsrvense los resultados obtenidos:
A=rand(3)
B=diag(diag(A))
C=[A, eye(3); zeros(3), B]
20
En cierta forma se podra decir que el operador (:) representa un rango: en este caso, los
nmeros enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este operador
puede tambin utilizarse con otros valores enteros y reales, positivos o negativos. En este
caso el incremento va entre el valor inferior y el superior, en las formas que se muestran a
continuacin:
x=1:2:10
x =
1 3 5 7 9
x=1:1.5:10
x =
1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000
x=10:-1:1
x =
10 9 8 7 6 5 4 3 2 1
Puede verse que, por defecto, este operador produce vectores fila. Si se desea obtener
un vector columna basta trasponer el resultado. El siguiente ejemplo genera una tabla de
funciones seno y coseno. Ejectese y obsrvese el resultado (recurdese que con (;)
despus de un comando el resultado no aparece en pantalla).
x=[0.0:pi/50:2*pi]';
y=sin(x); z=cos(x);
[x y z]
21
4 36 29 13 18 11
Recurdese que MATLAB accede a los elementos de una matriz por medio de los ndices
de fila y de columna encerrados entre parntesis y separados por una coma. Por ejemplo:
A(2,3)
ans =
7
Los dos puntos aislados representan "todos los elementos". Por ejemplo, el siguiente
comando extrae todos los elementos de la 3 fila:
A(3, :)
ans =
31 9 2 22 27 20
Para acceder a la ltima fila o columna puede utilizarse la palabra end, en lugar del
nmero correspondiente. Por ejemplo, para extraer la sexta fila (la ltima) de la matriz:
A(end, :)
ans =
4 36 29 13 18 11
En los ejemplos anteriores se han extrado filas y no columnas por motivos del espacio
ocupado por el resultado en la hoja de papel. Es evidente que todo lo que se dice para
filas vale para columnas y viceversa: basta cambiar el orden de los ndices. El operador
dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a
continuacin se va a definir una matriz identidad B de tamao 6x6 y se van a reemplazar
filas de B por filas de A. Obsrvese que la siguiente secuencia de comandos sustituye las
filas 2, 4 y 5 de B por las filas 1, 2 y 3 de A,
B=eye(size(A));
B([2 4 5],:)=A(1:3,:)
B =
1 0 0 0 0 0
35 1 6 26 19 24
0 0 1 0 0 0
3 32 7 21 23 25
22
31 9 2 22 27 20
0 0 0 0 0 1
Obsrvese que por haber utilizado parntesis en vez de corchetes los valores
generados por el operador (:) afectan a los ndices del vector y no al valor de sus
elementos.
Para invertir el orden de las columnas de una matriz se puede hacer lo siguiente:
A=magic(3)
A =
8 1 6
3 5 7
4 9 2
A(:,3:-1:1)
ans =
6 1 8
7 5 3
2 9 4
aunque hubiera sido ms fcil utilizar la funcin fliplr(A), que es especfica para ello.
Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A
una detrs de otra.
6.2 EJEMPLO
Para nuestro estudio de solucin de sistemas de ecuaciones utilizando mtodos iterativos
(Jacobi, Gauss-Seidel y SOR) tendremos en cuenta las siguientes funciones internas de
MATLAB
Normas de matrices:
norm(A) norma sub-2, es decir, mximo valor singular de A, max(svd(A)).
norm(A,2) lo mismo que norm(A)
norm(A,1) norma sub-1 de A, mxima suma de valores absolutos por columnas, es decir:
max(sum(abs((A))))
norm(A,inf) norma sub- de A, mxima suma de valores absolutos por filas, es decir:
max(sum(abs((A))))
Normas de vectores:
norm(x,p) norma sub-p, es decir sum(abs(x)^p)^(1/p).
norm(x) norma eucldea; equivale al mdulo o norm(x,2).
23
xi
( k +1)
(k )
bi ai , j x j
j =1
j i
=
a i ,i
o equivalentemente
Algoritmo de Jacobi
Lea A, b, xold, tol, nmax
dist = tol+1
cont = 1
Mientras dist>tol y cont nmax
Para i = 1 hasta n
bi ai , j xold i
j =1
j i
xnewi =
a i ,i
24
fin
dist = xnew xold
cont=cont+1
xold=xnew
fin
si dist tol
imprima la aproximacin a la solucin del sistema es
muestre xold
muestre cont
si no
imprima se excede el nmero de iteraciones, la aproximacin es
muestre xold
fin
El correspondiente cdigo en MATLAB es (utilizando funciones)
function jacobi(A,b,xold,tol,nmax)
if det(A)==0
disp('el sistema no tiene solucin unica')
return
end
dist=tol+1;
cont=1;
n=length(b);
xnew=zeros(n,1);
while cont<=nmax & dist>tol
for i=1:n
xnew(i)=(b(i)-A(i,[1:i-1,i+1:n])*
xold([1:i-1,i+1:n]))/A(i,i);
end
dist=norm(xnew-xold,2);
cont=cont+1;
xold=xnew;
end
if error <= tol
disp('la aproximacin a la solucin del sistema es ')
disp(xold)
disp(cont)
else
disp('se
exceden
el
numero
de
iteraciones,
aproximacin a la solucin del sistema es ')
disp(xold)
end
la
Para este algoritmo y cdigo no hay forma de analizar convergencia del mtodo. Si
analizamos el mtodo de Jacobi desde el punto de vista matricial podemos construir la
matriz de iteracin dentro del algoritmo (y cdigo) y si la matriz de iteracin tiene radio
25
espectral menor que uno que realice las iteraciones, en caso contrario que muestre un
mensaje en el que diga que el mtodo diverge.
Recordemos que la iteracin en los mtodos iterativos de Jacobi, Gauss Seidel y SOR
estn dados por
x ( k +1) = ( I M 1 A) x ( k ) + M 1b ,
para Jacobi M = diagonal (A) con la condicin de que a i ,i 0 para todo i.
Usando las instrucciones internas de Matlab, M est dado por
M=diag(diag(A))
Y el algoritmo para jacobi ser
Algoritmo de Jacobi
Lea A, b, xold, tol, nmax
para i=1 hasta n
si ai,i=0
Muestre no se puede calcular M-1 , termine
fin
fin
M=diagonal(A)
Bj=I-M-1A
bj=M-1b
si max(abs(eig(Bj)))1
muestre el mtodo de Jacobi no converge , termine
fin
dist = tol+1
cont = 1
Mientras dist>tol y cont nmax
xnew=Bj*xold+bj
dist = xnew xold
cont=cont+1
xold=xnew
fin
si dist tol
imprima la aproximacin a la solucin del sistema es
muestre xold
muestre cont
si no
imprima se excede el nmero de iteraciones, la aproximacin es
muestre xold
fin
El correspondiente codigo en MATLAB es (utilizando funciones)
function jacobim(A,b,xold,tol,nmax)
if det(A)==0
disp('el sistema no tiene solucin unica')
26
return
end
n=length(b);
for i=1:n
if A(i,i)==0
disp('no se puede calcular la inversa de M')
return
end
end
M=diag(diag(A));
Bj=eye(n)-inv(M)*A;
bj=inv(M)*b;
if max(abs(eig(Bj)))>=1
disp('el mtodo de Jacobi no converge')
return
end
error=tol+1;
cont=1;
while cont<=nmax & error>tol
xnew=Bj*xold+bj;
error=norm(x0-x1);
cont=cont+1;
xold=xnew;
end
if error <= tol
disp('la aproximacin a la solucin del sistema es ')
disp(xold)
disp(cont)
else
disp('se
exceden
el
numero
de
iteraciones,
aproximacin a la solucin del sistema es ')
disp(xold)
end
la
7. Graficacin En MATLAB:
Otra de las caractersticas importantes de MATLAB, que lo hacen ms til que otros
lenguajes de programacin, es su capacidad de graficar en dos y tres dimensiones. A
estas alturas, despus de ver cmo funciona este programa, a nadie le puede resultar
extrao que los grficos 2-D y 3-D de MATLAB estn fundamentalmente orientados a la
representacin grfica de vectores (y matrices). En el caso ms sencillo los argumentos
bsicos de la funcin plot van a ser vectores. Cuando una matriz aparezca como
argumento, se considerar como un conjunto de vectores columna (en algunos casos
tambin de vectores fila).
MATLAB utiliza un tipo especial de ventanas para realizar las operaciones grficas.
Ciertos comandos abren una ventana (figure) nueva y otros dibujan sobre la ventana
27
>> x = 0:0.001:2*pi;
>> y = sin(x);
>> plot(x,y)
Existen adems otras funciones orientadas a aadir ttulos al grfico, a cada uno de los
ejes, a dibujar una cuadrcula auxiliar, a introducir texto, etc. Estas funciones son las
siguientes:
title('ttulo')
aade un ttulo al dibujo
xlabel('tal')
aade una etiqueta al eje de abscisas. Con xlabel off desaparece
ylabel('cual') aade una etiqueta al eje de ordenadas. Con ylabel off desaparece
text(x,y,'texto') introduce 'texto' en el lugar especificado por las coordenadas x e y. Si x e
y son vectores, el texto se repite por cada par de elementos. Si texto es tambin un
vector de cadenas de texto de la misma dimensin, cada elemento se escribe en las
coordenadas correspondientes.
gtext('texto') introduce texto con ayuda del ratn: el cursor cambia de forma y se espera
un clic para introducir el texto en esa posicin.
legend() define rtulos para las distintas lneas o ejes utilizados en la figura.
7.2.
MATLAB tiene posibilidades de realizar varios tipos de grficos 3D. Para darse una
idea de ello, lo mejor es verlo en la pantalla. La primera forma de grfico 3D es la funcin
plot3, que es el anlogo tridimensional de la funcin plot. Esta funcin dibuja puntos
cuyas coordenadas estn contenidas en 3 vectores, bien unindolos mediante una lnea
28
Ahora se ver cmo se representa una funcin de dos variables. Para ello se va a definir
una funcin de este tipo en un fichero llamado test3d.m. La frmula ser la siguiente:
z = 3(1 x ) e x
2
( y +1)2
2
2
x
2 2 1
10 x 3 y 5 e x y e ( x +1) y
3
x=[-3:0.4:3]; y=x;
close
subplot(2,2,1)
figure(gcf),fi=[0:pi/20:6*pi];
plot3(cos(fi),sin(fi),fi,'r')
[X,Y]=meshgrid(x,y);
Z=test3d(X,Y);
subplot(2,2,2)
figure(gcf), mesh(Z)
subplot(2,2,3)
figure(gcf), surf(Z)
subplot(2,2,4)
figure(gcf), contour3(Z,16)
8.
Hoy en da, con la proliferacin de programas tipo Windows, en los que el usuario
encuentra un ambiente amigable y fcil de usar, en el que puede ingresar sus datos en
cajas de texto y ejecutar cdigos con slo hacer clic en un botn, MATLAB no poda
quedarse atrs.
Las ltimas versiones de MATLAB, en especial despus de la versin 6.0, se han
preocupado por incorporar herramientas fciles de usar, con las que el usuario pueda
crear interfaces grficas para sus programas, como lo hara un programador de Visual
Basic. Claro est, todava falta avanzar mucho en este campo y no es la ms grande
preocupacin de los desarrolladores de MATLAB.
MATLAB posee herramientas que permiten crear interfaces grficas, de manera similar a
como se hace en Visual Basic, pero con muchas menos posibilidades. Estas son las
llamadas GUI (Guide User Interface) y podemos acceder a ellas digitando la instruccin
guide en la ventana de comandos. Encontraremos 12 herramientas (muchas menos de
las 32 con las que cuenta Visual Basic) con las que podemos crear nuestra interfaz:
Push Button, Toggle Button, Radio Button, CheckBox, Edit Text, Static Text, Slider,
Frame, ListBox, Popup Menu, Axes. As mismo, encontraremos un formulario en blanco
sobre el cual podemos empezar a construir el nuestro.
Todas las anteriores tienen su equivalente en Visual Basic (Edit Text = Textbox, Static
Text = Label, etc), sin embargo, MATLAB posee una herramienta que permite desarrollar
grficos en nuestra interfaz: Axes. Esta ltima no tiene equivalente en Visual Basic.
En general, programar una interfaz grfica de MATLAB es un poco ms complicado que
programarla en Visual Basic, sin embargo, la mejor forma de aprenderlo es practicando.
Para ello se puede usar el Help, que en sus ltimas versiones tiene guas paso a paso
para crear GUIs.
30