Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tabla de contenido
1. Introducción.........................................................................................................3
1.1 MATLAB por primera vez ...........................................................................4
1.2 Uso elemental de MATLAB.........................................................................5
1.3 La ayuda en MATLAB ................................................................................7
1.4 Definición de Variables................................................................................8
1.5 Exhibición de resultados ..............................................................................9
1.6 Guardar el trabajo ......................................................................................10
1.7 Ejercicios ...................................................................................................10
2 Arreglos y matrices............................................................................................11
2.1 Construir arreglos de números....................................................................12
2.2 Acceder a los números en los arreglos ........................................................18
2.3 Operaciones con matrices...........................................................................21
2.4 Operaciones con arreglos ...........................................................................24
2.5 Ejercicios ...................................................................................................27
3 Programas (scripts) y funciones .........................................................................29
3.1 Scripts........................................................................................................29
3.2 Functions ...................................................................................................30
3.3 Trabajar con y mejorar scripts ....................................................................31
3.4 Funciones de funciones ..............................................................................33
3.5 Ejercicios ...................................................................................................36
4 Control de flujo de programa .............................................................................37
4.1 Ejemplos ....................................................................................................37
4.2 Ejercicios ...................................................................................................38
5 Métodos numéricos............................................................................................43
5.1 Mínimos cuadrados, modelo lineal. ............................................................43
5.2 Promedio y desviación estándar activo .......................................................47
5.3 Algoritmo simplex .....................................................................................48
5.4 Método indirecto de solución de ecuaciones simultáneas............................51
5.5 Raíces de polinomios (Método de Laguerre) ..............................................53
5.6 Runge Kutta...............................................................................................56
5.7 Descomposición de LU ..............................................................................59
5.8 Interpolación suave (splines) ......................................................................62
6 Gráficos.............................................................................................................65
6.1 Dos dimensiones ........................................................................................65
6.2 Tres dimensiones .......................................................................................68
6.3 Guardar imágenes ......................................................................................69
6.4 Ejercicios ...................................................................................................69
7 Prácticas de buena programación .......................................................................71
7.1 Favorecer vectores en lugar de bucles.........................................................71
7.2 Evitar que los arreglos crezcan mientras se corre el programa. ...................72
7.3 Escribir MEX-File cuando los bucles son inevitables .................................72
7.4 Otras consideraciones.................................................................................73
8 GUIs..................................................................................................................76
8.1 Ejemplo de script para FFT ........................................................................76
8.2 Ejemplo de function para FFT ....................................................................77
MATLAB para novatos 2
2010
El material aquí contenido esta pensado para estudiantes que desconocen MATLAB, pero
que les gustaría introducirse en el de manera autodidáctica. También puede ser de utilidad
para estudiantes de computación y métodos numéricos ya que los ejemplos y el interés
principal es en el control de las acciones de la maquina por medio de la sintaxis de
MATLAB.
1. Introducción
MATLAB es un software para computación en ingeniería y ciencias. Nos ofrece un
poderoso lenguaje de programación, posibilidad de realizar y manipular gráficas con
facilidad, además de reunir conocimiento acumulado en estas áreas de manera
estructurada y útil.
*
UNAM-Querétaro, CFATA. rquintero@fata.unam.mx
MATLAB para novatos 4
probar lo que en otros lenguajes seria código muy elaborado o que requiere de demasiado
tiempo.
MATLAB permite obtener una respuesta numérica a una expresión algebraica, de manera
similar a una calculadora, también permite obtener una aproximación numéricas a
problemas donde la substitución no es posible. Lo que consideramos como la solución
enfrenta dos dificultades; que MATLAB entienda una cosa diferente de lo que estamos
pensando en virtud de la falta de dominio de la herramienta y que el procedimiento
emprendido sea adecuado para alcanzar la solución. Esta escrito, espero, ayude a
aminorar el primer problema, el segundo se logra con el dominio de los métodos
numéricos y de la experiencia. No se espera que MATLAB pueda resolver un problema
que no se pueda resolver con papel, lápiz y tiempo. En general es más exitoso si antes de
expresar el problema en MATLAB se ha expresado en papel y lápiz.
prompt
Start
Command History (elipse rojo), lista las acciones solicitadas en command window, de la
más reciente a la más antigua y se pueden pasar al Workspace navegando por medio de la
flecha en el teclado (arriba y abajo) o haciendo un doble clic en el comando deseado.
ans =
15
>>
La multiplicación de dos números se realiza y el resultado se guarda en la variable ans.
El prompt indica que esta listo para nuevas instrucciones.
>> 3^3
MATLAB para novatos 6
ans =
27
>>
La potencia es igualmente evidente, el resultado se escribe en la variable ans,
substituyendo cualquier valor o contenido que tuviera anteriormente.
>> 1/0
Warning: Divide by zero.
ans =
Inf
>>
Aquí Inf es la manera de representar ∞, que indica un número más grande que
cualquiera que puede ser escrito y que en este caso resulto de intentar dividir el número
uno entre cero.
>> cos(pi/4)
ans =
0.7071
>>
Aquí la función trigonométrica está en radianes, pi representa a ; número de veces que
el diámetro del círculo se requiere para formar el perímetro del círculo. La misma función
trigonométrica en grados donde el círculo tiene 360 grados se escribe cosd.
>> exp(i*pi/4)
ans =
0.7071 + 0.7071i
>>
Aquí i (también pude ser 1i, “uno-i” que evita confusiones con la variable i)
representa a 1 ; unidad de los números imaginarios. i puede ser también una variable,
únicamente si no ha sido empleado como variable, entonces toma la representación de los
números imaginarios. En cuanto a la notación exp(x) es la representación de e x , donde
e es el número de Euler que es aproximadamente 2.718281828.
>> 0/0
Warning: Divide by zero.
ans =
NaN
>>
MATLAB para novatos 7
ans =
1.4803e-016
>>
Aquí la respuesta algebraica esperada es cero, la aritmética de punto flotante realiza por
aproximaciones los cálculos y en su lugar aparece un número muy pequeño, 1.4803 x 10-
16
(1.4803e-016=1.4803E-016); Los cálculos en la computadora producen errores que
con la ventaja del punto flotante (notación exponencial) es muy pequeño. eps representa
al valor del error máximo aritmético en mi máquina, que es 2.2204 x 10-16; cualquier
numero mas pequeño que eps es aceptable. Dicho de otra manera el siguiente número
mayor que uno y distinguible de uno en mi máquina es 1+eps.
>> eps
ans =
2.2204e-016
>>
Algunas
log(x) palabras
es logaritmoreservadas
natural deenxMATLAB
log(x)
log10(x)es logaritmo natural
es el logaritmo de 10
base x de x
log10(x) es el logaritmo base 10
atan(x) es el ángulo en radianes cuya de x tangente es x
ángulo
atan(x) es el seno
sinh(x) en radianes
hiperbólico decuya
x tangente es x
sqrt(x) es
sinh(x) raízelcuadrada
seno hiperbólico
de x de x
sqrt(x) raíz cuadrada de x
To get started, select MATLAB Help or Demos from the Help menu.
>>
El texto en azul es una liga directa a la ayuda en MATLAB, que abre una ventana como
la mostrada en la figura 1.2.
a =
2.7183
>>
Aquí a tiene el valor de la constante de Euler.
>> c=a*b
??? Undefined function or variable 'b'.
MATLAB para novatos 9
>>
Aquí intentamos guardar en la variable c el resultado de multiplicar el número de Euler
(a) por el contenido de b, como no habíamos definido previamente el valor de b nos lo
indica y no realiza nada, queda en espera una instrucción valida. La multiplicación a*b
tiene la notación correcta, (a)(b) no es aceptable como multiplicación, como tampoco
lo es ab ni a.b, estos dos últimos casos corresponden a otras variables, ab y la
componente b del objeto a.
z =
21
>>
>> P= pi
P =
3.1416
>> format long
>> P
P =
3.141592653589793
>> format rat
>> P
P =
355/113
>> format
>>
MATLAB para novatos 10
1.7 Ejercicios
1. Evaluar las siguientes expresiones en MATLAB.
e
a) A ee
1
b) B cos 1
3
c) C log e
7
d) determinar que número es primo {0,1,2,3,4,5,6,7,8,9,10,97,99}
Respuestas:
a) A=3.8143e+006
b) B=1.9106 [rad]
c) C=0.1718
e) [2, 3, 5, 7, 97]
MATLAB para novatos 11
2 Arreglos y matrices
En el centro de MATLAB se posicionan las matrices, el acrónimo del nombre se
desprende de MATrix LABoratory, y se espera un uso intensivo de matrices y vectores.
Un array es un grupo de números que en MATLAB se especifica con índices, cada
elemento del grupo se identifica con uno o varios índices, los índices siempre son enteros
que empiezan con el número uno. La cantidad de índices necesarios para especificar a un
elemento forma las dimensiones del array.
Para el caso de dos dimensiones, la función del índice es la de representar la posición del
renglón y la columna. La estructura de cada índice esta definida como (i,j), donde i
denota la posición del renglón y j la posición de la columna:
(i, j )
Renglón Columna
Columna
R a11 a12 a13 a1n
e a
n 21
a22 a23 a2n
g a31 a32 a33 a3n
l
ó am1 am 2 am 3 amn
n
rows son los renglones, líneas horizontales y las columns son las columnas, líneas
verticales. Por otro lado, los vectores son arreglos numéricos de una sola dimensión, y
pueden ser vectores renglón o vectores columna. Conocer la aritmética de matrices es
fundamental para aprovechar las ventajas de MATLAB.
MATLAB para novatos 12
R a11
e a Columna
n 21
g a 31
l a11 a12 a13 a1n
ó a m1
n
MATLAB no hace distinción entre un escalar; una matriz con un renglón y una columna,
y un arreglo de números de múltiples índices. En la manera de escribir las expresiones es
que se respeta la manera de hacer el algebra de matrices o el algebra de arreglos. Una
matriz de dos dimensiones representa los coeficientes de sistema de ecuaciones lineales,
un arreglo de dos dimensiones puede representar la manera de agrupar información por
conveniencia, MATLAB no sabe si el conjunto de números es una matriz o un arreglo, la
aritmética de matrices esta bien definida, la aritmética de arreglos es arbitraria
dependiendo de cómo se arreglaron los números y que se quiera hacer con ellos; se debe
tener cuidado en lo que le pedimos hacer a MATLAB.
A =
1 2 3
4 5 6
7 8 9
>> B=[1 ;4 ; 7 ]
B =
1
4
7
>> C=[1 2 3]
C =
1 2 3
D =
5
Después de haber definido esas variables, el usuario puede revisar ciertas propiedades
directamente en la ventana de Work Space. Sin embargo, existen diferentes funciones en
Matlab que le permiten al usuario obtener información del grupo de datos que se está
manejando. Algunas veces, esta información es importante para separar un cierto grupo
de datos o tener un control en el número de ciclos de operaciones matemáticas recursivas
basado en la dimensiones del array. Por ejemplo, el comando size proporciona el número
de renglones y columnas que contiene una variable en particular. Estos parámetros
pueden ser almacenados con variables alfanuméricas y tenerlos presentes en la memoria
de la sesión. La función está dada como:
n =
m =
>> length(B)
>> ndims(A)
2
El número dos indica que el arreglo de datos esta representado en dos dimensiones.
Cuando se trata de un arreglo de tres dimensiones el resultado numérico es tres.
Una de las ventajas de Matlab es que no hay necesidad de realizar programas para poder
extraer o identificar cierto grupo de datos numéricos en un array, basta usar
adecuadamente las funciones definidas en su biblioteca. Esto le permite al usuario
identificar y separar propiedades en un array para después poderlos manejar por
separado. Por ejemplo, la función find nos permite encontrar datos numéricos con ciertas
propiedades matemáticas. Supongamos que por alguna razón estamos interesados en
identificar aquellos datos numéricos que son mayores que 7 en el arreglo definido en la
matriz A. La función debe ser declarada como:
row =
3
3
col =
2
3
También se pueden emplear las relaciones lógicas para identificar elementos en un array.
MATLAB para novatos 15
== idéntico a
˜= diferente de
< menor que
> mayor que
<= menor o igual que
>= mayor o igual que
>> E=[A B]
E =
1 2 3 1
4 5 6 4
7 8 9 7
El resultado de la variable E será una matriz que contiene tres renglones y cuatro
columnas. Note que la operación requiere de agrupar ambas variables separadas por un
espacio entre ellas. Esta misma acción se logra, como se comento al inicio de esta
sección, cuando las variables son separadas por una coma. Como regla, el usuario tiene
que memorizar que la función de espacio y coma son equivalentes en un array. Ahora,
supongamos que deseamos agrupar el vector renglón de la variable C con la matriz de
datos A. La única posibilidad de hacer esto es anexar la variable C es en el primer
renglón o el último renglón. La función, entonces, esta dada como:
>> F=[A;C]
F =
1 2 3
4 5 6
MATLAB para novatos 16
7 8 9
1 2 3
F =
1 2 3
4 5 6
7 0 9
1 2 3
Note que en la estructura se declara primero el array a ser modificado, en este caso el
array esta representado con la variable F. Después hay que indicar la posición del índice
a ser sustituido y que en este caso corresponde al tercer renglón y segunda columna (3,2).
Finalmente usando el símbolo igual se relaciona con el nuevo dato a ser almacenado
dentro del array y que en este caso particular es un cero.
Cuando se desee eliminar todo un renglón en el array, la función está dada como:
>> F(:,2)=[]
F =
1 3
4 6
7 9
1 3
La operación indica que se tomarán todas las columnas del segundo renglón para ser
eliminadas []. Se puede incluir mas de una instrucción en un renglón, separado por comas
MATLAB para novatos 17
(en caso de querer ver el resultado en el Comman Windows) o punto y coma (en caso de
no desearlo).
El usuario puede darse cuenta que el lenguaje y la estructura de Matlab esta basado en
una estructura lógica y fácil de entender. Por otro lado, existen diferentes operaciones que
son útiles cuando se manejan arreglos de matrices. Una operación básica cuando se
trabaja con arreglos matriciales consiste en obtener la transpuesta de una matriz, la cual
se construye escribiendo los renglones en las columnas. Si los números de la matriz son
reales, la transpuesta de A se escribe como A’. Esta operación es muy útil para acceder a
los números de la matriz, por ejemplo para construir matrices a partir de otras.
V =
1 2 3 1
4 5 6 4
7 8 9 7
1 4 7 1
3 6 9 3
H =
1 4 7 1 3
2 5 8 4 6
3 6 9 7 9
1 4 7 1 3
>>
La construcción de matrices grandes se puede realizar con la ayuda de los comandos
mostrados en el siguiente recuadro. Se deja al lector, como ejercicio, leer la ayuda en
línea y definir matrices con ciertas dimensiones. Esto le ayudará para resolver los
problemas mostrados al final de la sección.
Otra función relacionada con el operador dos puntos (:), y muy útil en MATLAB, es que
puede generar secuencias numéricas como:
>> T=1:10
MATLAB para novatos 18
T =
1 2 3 4 5 6 7 8 9 10
>>
En este caso se genera un vector renglón desde 1 hasta 10. El tamaño de paso entre cada
digito es por norma 1. Pero si se desea modificar el tamaño de paso la función debe ser
dada como:
>>TT= -3:-.5:-6
TT =
>>
En este caso el vector renglón formado empieza en -3 y termina en -6. El tamaño de paso
de -0.5 esta representado entre los operadores dos puntos (:). De aquí que el formato
general para definir un vector está dado como:
el resultado produce un vector renglón o vacío si el número final es menor que el número
inicial. Esta función es útil cuando se desean declarar nuevos vectores para relacionarlos
con otros valores de una función matemática previamente calculada. Al final, ambos
vectores son concatenados para graficarlos. La función linspace realiza una función
similar y se recomienda al lector tenerla presente.
>> G=E(2,:)
G =
4 5 6 4
La estructura indica que primero se debe declarar la nueva variable, que en este caso es
G. El símbolo igual representa que la operación será guardad en esta nueva variable y el
grupo de datos se tomará del arreglo original representado por la variable E. Después, se
tiene que indicar mediante un índice para referirse a todas las columnas del segundo
renglón. En este caso, el número dos en el índice usado indica que nos referiremos al
segundo renglón y el símbolo dos puntos (:) se refiere a todas las columnas. La estructura
para extraer toda una columna es similar a la anterior con la diferencia de que ahora el
índice puede ser declarado como (:,2). En este caso se extraerán todos los renglones de la
segunda columna y almacenarlo en la misma variable G.
MATLAB para novatos 19
>> G=E(:,2)
G =
2
5
8
El acceso a los números de un arreglo puede involucrar ciertos sectores dentro del
arreglo. En otras palabras, no requerimos de extraer todo un renglón o una columna. Para
ejemplificar este caso, definamos una nueva matriz usando la función rand. Cabe resaltar
que cada vez que se ejecuta esta función, Matlab proporcionará diferentes números
porque la variable rand esta relacionada con números aleatorios entre 0 y 1.
>> A=rand(2,5)
A =
El arreglo se compone de dos renglones y cinco columnas. Ahora bien, si se desea extraer
un valor almacenado en el arreglo, esto puede ser expresado de dos maneras. La primera
estructura está dada como:
>> ele1=A(1,3)
ele1 =
0.8913
ele2 =
0.8913
>>
En el primer formato A(1,3) representa al primer elemento de la tercera columna. Que
también se puede llamar A(5), quinto elemento del listado, la numeración es consecutiva
agotando los elementos de la primer columna se sigue con el resto de las columnas.
Por otro lado es posible extraer una parte del arreglo de la siguiente manera:
mat1 =
0.8913 0.8214
0.7621 0.4447
MATLAB para novatos 20
>>
Los elementos que se seleccionan para formar mat1 son los primeros dos elementos de
las columnas 3 y 5.
También se puede obtener una matriz nueva a partir de los elementos de otra matriz, por
ejemplo, tomar todos los elementos de la columna y formar una nueva matriz con las
columnas 2 1 2 4 5 y 5.
mat2 =
>>
Aquí end indica el ultimo elemento disponible, así que 1:end es una manera compacta
de decir que se tiene que considerar desde el primer elemento hasta el ultimo, equivalente
a solo escribir dos puntos (:).
Por otro lado cuando se requiere agregar un nuevo elemento al array. Se puede hacer de
la siguiente manera:
>> mat2(3,1)=8
mat2 =
>>
El elemento que se agrega requiere de tener un renglón extra, lo que no es problema en
principio, pero puede crear problemas cuando se requiere que el tamaño del arreglo este
cambiando de tamaño constantemente, ya que puede hacer el cómputo mucho más lento.
>> F=find(mat2>.6)
F =
1
3
4
7
13
16
En este caso F representa al índice único que identifica a los elementos de la matriz mat2 que son mayores
que 0.6. La siguiente instrucción identifica estos elementos de la matriz. También se podría escribir [a b]
= find(mat2>.6)para identificar los dos índices que etiquetan a los números referidos.
>> mat3=mat2(F)
mat3 =
MATLAB para novatos 21
0.6068
8.0000
0.9501
0.6068
0.8214
0.8214
>>
A =
1
2
3
B =
4
5
6
>>
+ Adición de matrices. A+B suma A y B. A y B deben tener el mismo tamaño, a menos
que una de las matrices sea un escalar, un escalar se puede sumar a una matriz de
cualquier tamaño.
C ij Aij Bij
>> C=A+B
C =
5
7
9
>>
- Sustracción de matrices. A-B resta B de A. A y B deben tener el mismo tamaño, a
menos que una de las matrices sea un escalar, un escalar se puede sumar a una matriz de
cualquier tamaño.
C ij Aij Bij
>> C=A-B
C =
MATLAB para novatos 22
-3
-3
-3
>>
* Multiplicación de matrices. C = A*B es el producto algebraico lineal de las matrices
A y B. Mas precisamente,
n
Cij Aik Bkj
k 1
Para matrices no escalares A y B, el número de columnas de A debe ser igual al número
de renglones de B. Un escalar puede multiplicar matrices de cualquier tamaño.
>> C=A*B
??? Error using ==> mtimes
Inner matrix dimensions must agree.
1 4
2 5 ?
3 6
>> C=A*B'
C =
4 5 6
8 10 12
12 15 18
1 4 5 6
24 5 6 8 10 12
3 12 15 18
>> C=A'*B
C =
32
>>
4
1 2 35 32
6
/ Diagonal o división derecha de matrices. B/A es aproximadamente lo mismo que
B*inv(A). De manera mas precisa es, B/A = (A'\B')'. Esta operación no tienen razón de
existir, se tiene por completes pero no representa ninguna operación o concepto
fundamental.
matriz con varias columnas de ese tipo, entonces X = A\B es la solución de la ecuación
AX = B calculada por eliminación de Gauss. Una advertencia aparece si A esta mal
escalada o es casi singular.
A =
1 2 3
1 5 6
1 3 9
>> B=[32;65;73]
B =
32
65
73
>> X=A\B
X =
4
5
6
>>
F=3*ones(3)
F =
3 3 3
MATLAB para novatos 24
3 3 3
3 3 3
>> F^2
ans =
27 27 27
27 27 27
27 27 27
>>
>> G=A+i*A
G =
>> G'
ans =
>>
x =
1
2
3
y =
MATLAB para novatos 25
4
5
6
>>
.+ Adición de arreglos. A+B suma A y B. La suma de los elementos de las matrices es
idéntica a la suma de matrices.
c =
4
10
18
>> x.*y'
??? Error using ==> times
Matrix dimensions must agree.
>> x'.*y
??? Error using ==> times
Matrix dimensions must agree.
>>
./ División derecha de arreglos. A./B forma la matriz cuyos elementos se forman de
A(i,j)/B(i,j). A y B deben tener el mismo tamaño, a menos que alguno sea un escalar
A =
1 2 3
4 5 6
7 8 9
>> E=2*ones(3)
E =
2 2 2
2 2 2
2 2 2
>> P=A./E
P =
>>
>> F=3*ones(3)
F =
3 3 3
3 3 3
3 3 3
>> T=F.^2
T =
9 9 9
9 9 9
9 9 9
>>
>> G=A+i*A
G =
>> GG=G.'
GG =
>>
MATLAB para novatos 27
exp(A). Exponencial de un arreglo. Esta función produce una matriz donde cada
elemento se obtiene de exp(aij).
2.5 Ejercicios
1. Construir el siguiente arreglo:
8 2 0 0 0 0 0 0 0 - 1
2 8 2 0 0 0 0 0 0 0
0 2 8 2 0 0 0 0 0 0
0 0 2 8 2 0 0 0 0 0
0 0 0 2 8 2 0 0 0 0
A
0 0 0 0 2 8 2 0 0 0
0 0 0 0 0 2 8 2 0 0
0 0 0 0 0 0 2 8 2 0
0 0 0 0 0 0 0 2 8 2
- 1 0 0 0 0 0 0 0 2 8
1 2 3 4 5 11 1
2
1
3
1
4
1
5
1 1
0 1 2 3 4 2
1
1
1
2
1
3 4
D 0 0 1 2 3 , E 13 1
2
1
1
1
2
1
3 .
1 1 1 1 1
0 0 0 1 2 4 3 2 1 2
0 0 0 0 1 15 1 1 1 1
4 3 2 1
3. Si A es una matriz mágica (magic) de 4x4, construir una instrucción que le permita
suma los elementos de la diagonal principal y de la antidiagonal.
Respuestas:
1. A=diag(ones(10,1)*8,0)+diag(ones(9,1)*2,1)+…
MATLAB para novatos 28
diag(ones(9,1)*2,-1)+diag(-1,9)+diag(-1,-9)
note que eye(10)*8= diag(ones(10,1)*8,0)
B=toeplitz([8 2 zeros(7,1)' -1],[8 2 zeros(7,1)' -1])
B=toeplitz([8 2 0 0 0 0 0 0 0 -1])
D=toeplitz(1:5,zeros(5,1))'
E=toeplitz(1./(1:5),1./(1:5))
3. sum(diag(magic(4)))
A=(magic(4)), sum(diag(A(4:-1:1,:)))
4. sortrows([rand(52,1),(1:52)'])
MATLAB para novatos 29
Los archivos no son compilados, solo se escribe el nombre frente al prompt o por el
editor y las acciones se ejecutan.
3.1 Scripts
Si abro el editor de archivos y escribo:
y lo guardo con el nombre tarea1, que se guardara como tarea1.m. Entonces podría
ejecutarlo desde el editor de archivos presionado el acceso directo Save and run o podría
ejecutarlo escribiendo tarea1 frente al prompt.
>> tarea1
x =
0.8913
y =
0.7779
>>
†
C:\Program Files\MATLAB\R2006a\work
MATLAB para novatos 30
3.2 Functions
Las funciones aumentan las posibilidades de MATLAB, se construyen de manera similar
a los scripts, solo que la primera instrucción es:
las variables sal1, etc son las salidas de la función y las variables ent1, etc son las
entradas de la función. Se pueden emplear tantas variables como se necesiten, incluso
ninguna variable, y pueden tener el nombre que les guste. El nombre que emplee en la
función debe ser el mismo del nombre empleado para guardar el archivo m.
% Esta function calcula la ley de los cosenos, requiere los valores de dos
% lados del triangulo (B, C) y el ángulo entre ellos (a) en radianes
% La respuesta es la longitud del otro lado del triangulo (A)
%
% el formato es: [respuesta]=leycoseno(B,C,a)
function [A]=leycoseno (B, C, a);
A=sqrt(B^2+C^2-2*B*C*cos(a));
Como en el caso de los scripts, escribir help y el nombre en el prompt despliega los
comentarios iniciales que escribimos.
>> leycoseno(1,1,pi/2)
ans =
MATLAB para novatos 31
1.4142
>>
Una propiedad interesante de las funciones es que disponen de su espacio privado para
variables, de tal manera que no puede ver las variables del espacio de trabajo de donde se
llamo la función, y libera todo el espacio de memoria que empleó cuando termina,
además cada función emplea su propio espacio privado.
Para el caso de funciones, es posible agregar sub-funciones dentro del mismo archivo,
esto no es posible en los scripts. La función principal puede llamar tantas sub-funciones
como necesite.
Un tipo de función que se puede usar es la función anónima, es un tipo de función para el
que no se requiere de escribir un m-file, la sintaxis es:
f = @(arglist) expression.
Como ejemplo veamos la construcción de la raíz cuadrática mayor, donde los argumentos
son tres a, b, y c. y la raíz mayor es:
b b 2 4ac
x max
2a
f =
@(a,b,c) (-b+sqrt(b^2-4*a*c))/2/a
>> x=f(1,-(1e8+1e-8),1)
x =
100000000
programa se pueden revisar las variables en el Workspace para juzgar la fuente de error, y
se puede continuar después de revisar. El acceso directo que esta indicado por el círculo
amarillo se activa al correr el script y puede emplearse para avanzar un paso a la vez la
ejecución del programa.
En la figura 3.1 y dentro del circulo rosa se encuentra un indicador de sintaxis, el color en
la figura es que se tiene una advertencia, en este caso un error que esta mas adelante del
script, si se corrige, el color del recuadro cambia a verde. La posición del cursor esta
señalada en la esquina inferior derecha, rectángulo gris, esta referencia es conveniente
cuando aparecen errores de ejecución e indican en que lugar esta el error. La flecha verde
indica las pestañas de los scripts que están abiertos en el editor y cualquiera de ellos
puede editarse, solo seleccionándolo.
Una capacidad muy provechosa para mejorar el script es profiling, con ella se puede
averiguar que tiempo se pasa la computadora en cada función del script y juzgar si es
posible mejorar o substituir alguna sección de líneas por otra alternativa, como por
ejemplo crear una función. profile on, inicia esta posibilidad, al terminar el script se
dice profile report, esto nos da el reporte y cuando no se requiere se deshabilita
con profile off.
MATLAB para novatos 33
Para encontrar las raíces de la función f x 5 3x 4 13x 3 91x 2 196 x 120 , se puede
definir la función f por medio de una funciona anónima y evaluarla con fzero como en
el siguiente ejemplo, (este polinomio tiene raíces -3, -1, 5, -2-i2 y -2+i2).
>> z = fzero(f,6)
z =
x =
3.5529
fenx =
-1.5039e+003
Para determinar el mínimo de una función de dos dimensiones se puede usar la función
anónima y fminsearch como en el siguiente ejemplo tomado de la ayuda de
MATLAB.
z 100( y x 2 ) 2 (1 x) 2
MATLAB para novatos 34
x = -2:.01:2;
y = -2:.01:4;
[X,Y] = meshgrid(x,y);
Z=100*(Y-X.^2).^2+(1-X).^2;
A=find(Z>100);
Z(A)=100;
surf(X,Y,Z)
Figura 3.2 Script para graficar la función limitada en z a 100, (véase sección 5.2), sin
importar que en esta escala se percibe una región con posibles mínimos, si se limita el
crecimiento de z fácilmente se ve que el mínimo esta en (1,1) como lo indica
fminsearch.
x =
1.0000 1.0000
fval =
8.1777e-010
2 ( x) 2
f exp
2 2
Q =
0.6827
El caso de ecuaciones diferenciales en general requiere de definir una función con las
ecuaciones a resolver, (Simulink permite un mejor control de la simulación y lo
recomiendo)
d2 f df
2 2
1 5 f 3 .05t 3 5 cos(1.5t )
dt dt
Que podemos reescribir con las funciones y(1)=f y y(2)=f’ que es la manera habitual de
trabajar con ecuaciones diferenciales, escribiendo un sistema de ecuaciones diferenciales
de primer orden.
MATLAB para novatos 35
y1 f
df dy1
y2
dt dt
dy 2 3 .05t 3 5 cos(1.5t ) y 2 5 y1
dt 2
function dy = derivada1(t,y)
dy=zeros(2,1);
dy(1)= y(2);
dy(2)= (3+0.05*t^3+5*cos(1.5*t)-y(2)-5*(y(1)))/2;
clear all
options = odeset('RelTol',1e-7,'AbsTol',[1e-7 1e-7]);
[t,y]=ode45(@derivada1,[0 10],[1.3 8], options);
figure(3)
subplot 131
plot(t,y(:,1));
title('1');xlabel('Time [s]'); ylabel('f [a.u.]');
subplot 132
plot(t,y(:,2));
title('2');xlabel('Time [s]'); ylabel('df/dt [a.u.]');
subplot 133
plot(t(1:536),diff(y(:,2))./diff(t));
title('3');xlabel('Time [s]'); ylabel('d(df/dt)/dt [a.u.]');
3.5 Ejercicios
1. Encontrar las primeras seis raíces de la función de Bessel de orden 1.
2. Encontrar la solución de la ecuación diferencial con condiciones iniciales y(0)=0,
dy
1 en el intervalo de z (0,20] y comparar con besselj(1,z).
dz 0
d2y dy
z2 2
z ( z 2 1) y 0
dz dz
Respuesta
1. 3.8317, 7.0156, 10.1735, 13.3237, 16.4706, 19.6159;
f=@(x) besselj(1,x); z = fzero(f,4)
2. Crear el archivo derivada2.m
function dy = derivada2(t,y)
dy=zeros(2,1);
dy(1)= y(2);
dy(2)= (-(t^2-1)*y(1)-t*y(2))/t^2;
y resolver con ode45
[t,y]=ode45(@derivada2,[0.0001 20],[0 1])
La comparación entre ambas debe ser igual.
MATLAB para novatos 37
Decisiones de control
if, else elseif
switch, case, otherwise
Bucles
for, while, continue, break
Acciones cuando hay error
try, catch
Finalizar el programa
return
4.1 Ejemplos
Del número x, indicar si es un número negativo, en caso de serlo; si es real no entero
dividirlo entre 2 y si es entero obtener su factorial.
if x < 0
disp('es un numero negativo')
elseif rem(x,1) == 0
A = factorial(x)
else
A = x/2
end
switch x
case -1
disp('uno negativo');
case 0
disp('cero');
case 1
disp('uno positivo');
otherwise
disp('otra cosa');
end
MATLAB para novatos 38
A=[1 2]
done = false;
while ~done
B = input('introduzca datos congruentes: ');
try
C=A*B;
done = true;
catch
disp('Los datos no son congruentes!')
end
end
4.2 Ejercicios
1.- Hacer un script que genere la siguiente expresión:
Los primeros 12 números de la serie de Fibonacci son:
0 1 1 2 3 5 8 13 21 34 55 89
2.- Recorra una serie de 200 números aleatorios y graficar las dos columnas, una con los
números y la otra con el promedio de los números hasta ese momento.
MATLAB para novatos 39
3.- Hacer el código que permita graficar la siguiente función para x entre -12 y 12:
0 x 10
sin( x ) 10 x 0
f ( x) 2
exp( ( x 8) ) 0 x 10
0 x 10
4.- ¡Dibujar un helecho!
Este se puede realizar haciendo una transformación repetida de un punto en el plano (x1,
x2) por medio de la transformación que toma al punto xi y lo transporta a un nuevo
punto x f Axi b , si x es un vector columna de dos elementos, las coordenadas en el
plano, A es una matriz de 2x2 y b es un vector columna de dos elementos.
a) Tomar un punto arbitrario xi =[0.5;0.5]
b) Obtener un numero aleatorio R entre 0 y 1
Si el numero aleatorio esta entre 0 y 0.85 obtener un nuevo punto x f por medio de la
transformación x f Axi b , donde A1=[.85 .04;-.04 .85];b1=[0;1.6];
Si el numero aleatorio esta entre 0.85 y 0.92 obtener un nuevo punto x f por medio de la
transformación x f Axi b , donde A2=[.20 -.26;.23 .22];b2=[0;1.6];
Si el numero aleatorio esta entre .92 y .99 obtener un nuevo punto x f por medio de la
transformación x f Axi b , donde A3=[-.15 .28;.26 .24];b3=[0;.44];
Si el numero aleatorio esta entre .99 y 1 obtener un nuevo punto x f por medio de la
transformación x f Axi , donde A4=[0 0;0 .16];
c) graficar las coordenadas del punto sin borrar las coordinas de punto anterior
d) regresar al inciso “b” y repetir 10000 veces.
Posibles soluciones:
1.
N=input('numero de elementos de la serie a mostrar: ');
x=zeros(N,1);
x(1)=0;
x(2)=1;
for ii=3:N
x(ii)=x(ii-2)+x(ii-1);
end
fprintf('Los primeros %g números de la serie de Fibonacci son:\n',N)
disp(int2str(x'))
2.
a=zeros (200,2);
a(1,1)=rand(1);
a(1,2)=a(1,1)
for ii=2:200
a(ii,1)=rand(1);
a(ii,2)=(a(ii-1,2)*(ii-1)+a(ii,1))/ii;
end
plot(a)
3.
x = linspace(-12,12,1000)';
f=zeros(length (x),1);
ind1=find(x>=-10 & x<0);
MATLAB para novatos 41
f(ind1)=sin(x(ind1));
ind2=find(x>0 & x<=10);
f(ind2)=exp(-(x(ind2)-8).^2);
plot(x,f)
3bis.
x=linspace(-12,12,1000);
N=length (x)
for j=1:N
if x(j)>=-10 && x(j)<=0
f(j)=sin(x(j));
elseif x(j)>0 && x(j)<=10
f(j)= exp(-(x(j)-8)^2);
else
f(j)=0;
end
end
plot (x,f)
4.
function []=fern2()
tic
x=[0.5;0.5];
h=plot (x(1),x(2),'.');
set(h,'markersize',1,'color','green','erasemode','none');
set(gcf,'color','white','menubar','none','numbertitle','off','name','He
lecho')
axis([-3 3 0 10])
axis off
drawnow
p=[.85 .92 .99 1.00];
A1=[.85 .04;-.04 .85];b1=[0;1.6];
A2=[.20 -.26;.23 .22];b2=[0;1.6];
A3=[-.15 .28;.26 .24];b3=[0;.44];
A4=[0 0;0 .16];
for m=1:10000
r=rand;
if r<p(1)
x=A1*x+b1;
elseif r<p(2)
x=A2*x+b2;
elseif r<p(3)
x=A3*x+b3;
else
x=A4*x;
end
set(h,'xdata',x(1),'ydata',x(2));
drawnow
end
toc
5.
tic
a=0;
x=[0;0];
plot (x(1),x(2),'.')
hold on
for m=1:10000
MATLAB para novatos 42
end
plot (x(1),x(2),'g')
end
toc
MATLAB para novatos 43
5 Métodos numéricos
En esta sección se presentarán algunos ejemplos comunes a los cursos de métodos
numéricos, se puede saltar esta sección en la primera lectura o se pueden ver los ejemplos
de manera arbitraria, la intención es comentar el código y considerarlo como una manera
de ver una posible solución a un problema simple. MATLAB tiene soluciones para todos
estos problemas de manera mucho mas eficiente y elegante, aquí solo se intenta emplear
a MATLAB como el medio ejecutor de las soluciones, controlar a MATLAB a que haga
lo que deseamos como medio de aumentar nuestro control de las instrucciones básicas de
MATLAB.
Tenemos una colección de puntos P(xi,yi) que se encuentra dispersos en el plano XY.
Podemos decir que cada punto representa el resultado de un experimento, encuesta,
censo, etc. Queremos encontrar una representación lineal que mejor se aproxime a
nuestros puntos obtenidos.
Para eso queremos que la distancia D entre el modelo y el punto experimental sea muy
pequeña.
El modelo lineal para y* la podemos definir como una función del tipo:
y* mxi b
MATLAB para novatos 44
Entonces: D yi mxi b
Pero queremos que esta distancia D sea pesada de igual manera sin importar si es positiva
o negativa así que queremos que esto se cumpla para cada uno de los puntos por lo que
debemos agregar la suma de todos los puntos P(xi,yi).
n
R D 2 ( yi mxi b) 2
i 1
Ahora para obtener los parámetros del modelo m y b que mejor se ajustan a los puntos,
queremos que el error sea minimizado, para lo que obtenemos las primeras derivadas para
igualarlas a cero, de esta forma minimizamos la distancia de los puntos a la función f y
determinar nuestras constantes m y b para el modelo lineal.
n
R
2 ( y i mxi b)xi
m i 1
n n n
2
yi xi m xi b xi
i 1 i 1 i 1
n
R
2 ( y i mxi b)
b i 1
n n
yi m xi nb
i 1 i 1
Donde n es el número de puntos que tenemos. A continuación resolvemos el sistema para
encontrar m y b a partir de los puntos tabulados.
n
b n
n x i yi
n i 1
n ni 1
x xi2 m xi yi
i 1
i
i 1
i 1
n n n
n ( yi xi ) xi y i
i 1 i 1 i 1
m 2
n
n
n xi2 xi
i 1 i 1
n n n n
xi2 yi xi ( yi xi )
i 1 i 1 i 1 i 1
b 2
n n
2
n x xi
i
i 1 i 1
La calidad del ajuste se puede estimar por medio del coeficiente de correlación:
2
n 1 n n
( yi xi ) xi y i
i 1 n i 1 i 1
r2
n 2 1 n n 2 1 n 2
2
x x y y
i 1 i n i 1 i i 1 i n i 1 i
r=(sum(x.*y)-sum(x)*sum(y)/n)^2/(sum(x.^2)-sum(x)^2/n)/(sum(y.^2)-
sum(y)^2/n);
n,r,m,b
%graficamos esta función lineal en la misma ventana para comprarla
%con los puntos.
f=m*x+b;
hold on
plot(x,f,'red')
MATLAB para novatos 47
1 n 1 1 n 2
n 1 ( xi x n 1 ) 2
xi xn21 (n 1)( xn1 ) 2
n 1 i 1 n 1 i 1
Substituyendo la suma de los cuadrados con el valor de σn.
1
n1
n 1
n n2 nxn2 xn21 (n 1)( xn1 ) 2
xdev=zeros(100,1);
xproa=zeros(100,1);
xdeva=zeros(100,1);
%
%se inicializan los promedios y las desviaciones
xpro(1)=xx(1);
xdev(1)=0;
xproa(1)=xx(1);
xdeva(1)=0;
%
%de acuerdo a las ecuaciones del texto, se calcula el promedio y la
%desviación por los dos métodos, el que requiere todos los números y
%que emplea solo el último.
for m=2:100
xpro(m)=sum(xx(1:m))/m;
xdev(m)=sqrt(1/m*sum((xx(1:m)-xpro(m)).^2));
xproa(m)=((m-1)*xproa(m-1)+xx(m))/m;
xdeva(m)=sqrt(1/(m)*((m-1)*(xdeva(m-1)^2+xproa(m-1)^2)+xx(m)^2-
(m)*xproa(m)^2));
end
%
%gráfica simple de las cuatro curvas, deben ser idénticas por pares.
plot(x,xpro,x,xdev)
hold on
plot (x,xproa,x,xdeva,'r')
X es el número de productos A.
Y es el número de productos B.
Arreglar la función objetivo para obtener el máximo número para F y modificar las
desigualdades agregando dos nuevas variables S1 y S2.
MATLAB para novatos 49
F 5 X 7Y 0
F
2 X 4Y S1 100
3 X 3Y S 2 90 1 5 7 0 0 X 0
X, Y, S1 y S2 >=0
0 2
4 1 0 Y 100
0 3 3 0 1 S1 90
S 2
F F
1 X 190
1 1.5 0 1.75 0 X 175 1 0 0 1
0 0.5 1 0.25 0 Y 25 0 0 1 0.5 1 / 3 Y 20
0 1.5 0 0.75 1 S1 15 0 1 0 0.5 2 / 3 S1 10
S 2 S 2
clear all
A=[1 -5 -7 0 0 0;0 2 6.5 1 0 100;0 3 3 0 1 90];
m=length(A(:,1));
falta =0;
while sum(A(1,:)<0)>0
[val,ind]=min (A(1,:));% columna pivote
[val2,ind2]=min (A(:,ind)/val);% valor pivote & renglón pivote
if falta ==1
ind=5-ind;% columna
ind2=5-ind2;% renglón
A x ij j bi para n 1,2,, n
j 1
Que al sacar xi de la suma, se pude usar para calcular a partir de una aproximación
anterior xj, una aproximación posterior de xi.
n
Aii xi Aij x j bi , n 1,2,, n
j 1
j i
4 1 1 x1 12
1 4 2 x 1
2
1 2 4 x3 5
function [x,m]=gaussSeidel1(x,maxiter,epsilon)
%Soluciona Ax=b por el método de Gauss-Seidel.
%
%USO: [x,m]=gaussSeidel1(x,maxiter,epsilon)
%Ejemplo: [A,m]=gaussSeidel1([0;0;0],100,1e-7)
%INPUT:
%x=valor inicial arbitrario del vector solución
%maxiter=numero máximo de iteraciones (si no se escribe es 500)
%epsilon=tolerancia en el error (si no se escribe es 1e-7)
%OUTPUT:
%x=vector solución
%m=número iteraciones para alcanzar la solución
if nargin<3;
epsilon=1e-7;
end
if nargin<2;
maxiter=500;
end
for m=1:maxiter
xOld=x;
x=func(x);
dx=norm (x-xOld);
if dx<epsilon;
return;
end
end
error('Sin resultado después de muchas iteraciones')
function [x]=func(x)
A=[4 -1 1;-1 4 -2;1 -2 4];%cambiar de acuerdo al problema
b=[12;-1;5]; %cambiar de acuerdo al problema
for m=1:length (b)
T=A*x;
TT=T(m)-A(m,m)*x(m);
x(m)=1/A(m,m)*(b(m)-TT);
end
MATLAB para novatos 53
Método de Laguerre
Propone un polinomio especial, que de manera interactiva, puede aproximar a cualquier
polinomio (algebraicamente es un caso particular, la computadora lo hace un caso
general).
Pn ( x) ( x r )( x q ) n 1 7
Derivando el polinomio dos veces
Pn ( x) 1 n 1
8
Pn ( x ) x r x q
2
Pn ( x ) Pn ( x) 1 n 1
9
Pn ( x) Pn ( x) ( x r ) ( x q) 2
2
De donde se puede definir
Pn ( x ) Pn ( x)
G ( x )
2
G( x) y H ( x) 10
Pn ( x) Pn ( x)
Y se obtiene la formula de Laguerre, despejando (x-q) de 8 y substituyendo en 9 y
resolviendo para (x-r).
n
xr 11
G ( x) (n 1) nH ( x) G 2 ( x)
El procedimiento es:
1.- Proponer un valor de prueba x como primera raíz del polinomio
MATLAB para novatos 54
if abs(G+F)>=abs(G -F);
dr=n/(G+F);
else dr=n/(G-F);
end
r=r-dr;
if abs(dr)<tol;
return;
end
end
error('Demasiadas iteraciones en Laguerre')
function b=disminucion_gradopolinomio(a,r)
% Disminución del grado del polinomio
% a(1)*xˆn + a(2)*xˆ(n-1) + ... + a(n+1)
%= (x - r)[b(1)*xˆ(n-1) + b(2)*xˆ(n-2) + ...+ b(n)].
n=length(a)-1;
b=zeros(n,1);
b(1)=a(1);
for i = 2:n;
b(i)=a(i)+r*b(i-1);
end
MATLAB para novatos 56
1
y ( x h) y ( x ) ( K 1 2 K 2 2 K 3 K 4 ) RK-cuarto orden
6
Ejemplo
MATLAB para novatos 57
Un ejemplo para ilustrar este método se puede obtener del siguiente caso:
El movimiento newtoniano en coordenadas polares es:
a (r r 2 )eˆr (r 2r)rˆ
r GM
r r 2
Vo=velocidad inicial r2
θ
2r
H=altura inicial
r
R=Radio de la tierra
Figura 1. Esquema de un objeto de masa mucho menor que la tierra que se desplaza por
efecto de la atracción gravitatoria.
function [B]=ruku()
[t,Y,h]=CI();
y=Y(1,:);
for m= 2:length(t);
K1=h*yprima(t(m-1),y);
K2=h*yprima(t(m-1)+h/2,y+K1/2);
K3=h*yprima(t(m-1)+h/2,y+K2/2);
K4=h*yprima(t(m-1)+h,y+K3);
y=y+(K1+2*K2+2*K3+K4)/6;
Y(m,:)=y;
end
B=[t' Y];
function [t,y,h]=CI()
tini=0;%CAMBIAR t INICIAL
tfin=1200;%CAMBIAR t FINAL
h=50;%CAMBIAR PASO
t=tini:h:tfin;
y=zeros(length(t),4);%CAMBIAR COLUMNAS CON VARIABLES
y(1,:)=[7.1501e6 0 0 9.3704e-004];%CAMBIAR Y INICIAL
function [yp]=yprima(t,y)
yp=zeros(1,4);
yp(1)=y(2);
yp(2)=y(1)*y(4)^2-3.9860e14/y(1)^2;
yp(3)=y(4);
yp(4)=-2*y(2)*y(4)/y(1);
MATLAB para novatos 59
5.7 Descomposición de LU
Es un método muy utilizado en programación para resolver sistemas de ecuaciones
lineales, tiene la gran ventaja de ser un método fácil y rápido.
El cual representan el sistema lineal Ax=b, y que se puede escribir LUx=b, ya que
podemos representar a A como un producto de una cierta matriz triangular inferior (L) y
otra matriz triangular superior (U), de la forma:
[ L][U]=[A]
Donde
1 0 0 0 u11 u12 u13 u1n
l 0 0 0 u u23 u2 n
21 1 22
L l31 l32 1 0 U 0 0 u33 u3n
lm1 lm 2 lm3 1 0 0 0 umn
Observe que los elementos de la diagonal principal de L siempre son iguales a 1 (si la
matriz A es cuadrada), y siempre tiene elementos iguales a cero en la parte triangular
superior de la matriz.
U siempre tiene elementos iguales a cero en su parte triangular inferior. Los demás
valores de los elementos de las matrices L y U se obtienen mediante la eliminación de
gauss.
elementos de las posiciones a21, a31, de la matriz A, sean ceros, esto lo podemos lograr
sustrayendo un múltiplo adecuado de las filas de A
Por lo tanto en la matriz triangular inferior L, asignamos en la posición L21 el valor del
coeficiente m21 que se utilizó para hacer cero el elemento de la posición a21, y en L31
asignamos de igual manera el valor de m31,
1 0 0 0
m 0
21 1 0
L m31 l32 1 0
lm1 lm 2 lm3 1
Y así sucesivamente para los demás elementos de L, hasta escalonar A y obtener todos
los valores de la matriz triangular inferior L.
Donde conocemos los valores de [L] y del vector [b], y se obtienen los valores de [z]
haciendo una sustitución hacia adelante.
1 0 0 0 z1 b1
l 0 z b
21 1
0
2 2
l31 l32 1 0 z3 b3
lm1 lm 2 lm3 1 z n bn
Posteriormente podemos conocer el valor de [x], por medio de una sustitución hacia
atrás, de [U][x]=[z] ya que se conoce a [z] y a [U].
MATLAB para novatos 61
for i = k+1:n
L(i,k) = A(i, k) / A(k, k);%Se guardan de manera ordenada
%en L los coeficientes con los que vamos a escalonar la
%matriz A
for j = k+1:n
A(i, j)= A(i, j) - L(i, k)*A(k, j);%Se escalona la matriz A
end
end
for j = k:n
U(k, j) = A(k, j);%Al terminar la matriz A, pasa a ser la
matriz U
end
end
MATLAB para novatos 62
2
k 3( x xi ) k 3( x xi 1 ) 2 y yi
f i 1, i i 1 ( xi 1 xi ) i ( xi 1 xi ) i 1
6 ( xi 1 xi ) 6 ( xi 1 xi ) ( xi 1 xi )
y y y yi 1
ki 1 ( xi 1 xi ) 2ki ( xi 1 xi 1 ) ki 1 ( xi xi 1 ) 6 i 1 i i
( xi 1 xi ) ( xi xi 1 )
3
MATLAB para novatos 63
function z=interpol
% x=[-5 -4 -3 -2 -1 0 1 2 3 4 5];
% y=[0 .01 .05 .25 .7 1 .7 .25 .05 .01 0];
x=[1 2.5 3 5 8];
y=[1 2 2 0 0];
%
%Plantear la matriz tri diagonal
[a,b,c,d]=coeficientes(x,y);
a, b, c, d
%
%Resolver por LU la matriz tri diagonal
[k]=seconder(a,b,c,d);
k=[0;k;0];
%
% gráfica de la solución
m=length(x);
mmm=0;
fx=zeros((x(m)-x(1))/.1,1);
f=zeros((x(m)-x(1))/.1,1);
for n=1:m-1
xx=x(n):.1:x(n+1);
mm=length(xx);
fx(mmm+1:mmm+mm)=xx;
f(mmm+1:mmm+mm)=k(n)/6*((xx-x(n+1)).^3/(x(n)-x(n+1))-(xx-
x(n+1))*(x(n)-x(n+1)))...
-k(n+1)/6*((xx-x(n)).^3/(x(n)-x(n+1))-(xx-x(n))*(x(n)-
x(n+1)))...
+(y(n)*(xx-x(n+1))-y(n+1)*(xx-x(n)))/(x(n)-x(n+1));
mmm=mmm+mm;
end
MATLAB para novatos 64
plot (x,y,'*')
hold on
plot (fx,f)
for n=2:m%Forwardsubstitution
d(n)=d(n)-a(n-1)*d(n-1);
end
d(m)=d(m)/b(m);%Backsubstitution
for n=m-1:-1:1
d(n)=(d(n)-c(n)*d(n+1))/b(n);
end
k=d;
MATLAB para novatos 65
6 Gráficos
Las capacidades de trabajar los gráficos es una de las razones por lo que muchas personas
se acercan a MATLAB, los aspectos mas básicos son muy simples, pero además se
pueden hacer cosas espectaculares. En general no se requiere de programas adicionales, y
lleva los resultados hasta archivos de la mayor calidad. A estas alturas del partido espero
que no se tenga dudad de las ventajas de MATLAB, gráficos es un premio adicional.
>>figure1=figure
% Definir tamaño de letra en el margen y rejillas
axes('FontSize',20,'XGrid','on','YGrid','on','Parent',figure1)
box('on');
hold('all');
% Grafica la función de gauss, con ejes x de 0 a 6 y y de 0 a 0.41
x=0:.01:6; plot(x,1/(1*sqrt(2*pi))*exp(-(x-3).^2./2))
axis([0 6 0 0.41]);
% Definir leyenda en x con tamaño 20
xlabel('x','FontSize',20);
% Definir leyenda en y con tamaño 20
ylabel('f(x)','FontSize',20);
% Definir el titulo
title('Gauss');
% Definir caja de texto para el símbolo en x=.7 y y=.75 de uno
annotation(figure1,'textbox','Position',[.7 .75 .1 .1],'FontSize',
20,'String',{'\mu=3 \sigma=1'});
% Crear caja de texto para la función f(x) en latex
text('Interpreter','latex',...
'String','$$f(x)=\frac{1}{\sigma\sqrt{2 \pi}}exp(-{\frac{(x-
\mu)^2}{2\sigma^2}})$$',...
'Position',[1 .05],...
'FontSize',16)
MATLAB para novatos 66
No desesperar, no se requiere de recordar nada de esto para que nos salga bien la figura.
Si se escribe las coordenada x y y se pide que se grafiquen con plot aparece la figura
6.2.
>>x=0:.01:6; plot(x,1/(1*sqrt(2*pi))*exp(-(x-3).^2./2))
En la figura 6 se indica dentro del círculo rojo el acceso directo para Show Plot Tools,
que es la entrada al paraíso de las graficas. El círculo azul muestra el acceso directo a los
datos de la grafica, se puede ver las coordenadas de los puntos que forman la grafica.
MATLAB para novatos 67
Figura 6.3. Diversa opciones de edición para los gráficos, en la parte inferior de las
figuras se muestran las posibilidades. A) edición de los ejes, leyendas, límites y escalas;
además del titulo y de las rejillas. B) edición de la apariencia del trazo, etiquetas, líneas
marcadores y colores. C) edición de una caja de texto, en este caso nombre del eje
vertical, color, tamaño y formato.
Otra maravilla de la edición es que en las cajas de texto, nombres de ejes, leyendas, etc se
pueden mezclar caracteres, por ejemplo
\surd √ \nabla
Más aún, se pude escribir ecuaciones complejas como las ilustradas en la figura 6.1.
text('Interpreter','latex','String','$$f(x)=\frac{1}{\sigma\sqrt{2 \pi}}exp(-{\frac{(x-\mu)^2}{2\sigma^2}})$$')
Si se desea que un trazo permanezca al hacer un nuevo trazo la instrucción es hold on.
>> t = (-pi:pi/100:pi);
>> plot(t,sin(t),'r')
>> hold on
>> plot(t,cos(t),'k')
>>
>> x = 0:pi/50:pi;
>> y = 2*x;
>> [X,Y] = meshgrid(x,y);
>> surf(X,Y,sin(X.^2+Y))
Cuando las curvas son paramétricas, la secuencia de puntos construye una curva, se pude
usar plot3. La cuarta instrucción mantiene el aspecto de cubo.
>> t = 0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t)
>> grid on
>> axis square
>> ezplot('x^2-y^4')
>> ezsurf('real(atan(x+i*y))')
>> ezcontour('sqrt(x^2 + y^2)')
>> ezmesh(' x.*exp(-x.^2-y.^2)')
>> ezplot3('s/2','2*s^2','3*s^3')
>> ezpolar('1+cos(t)')
6.4 Ejercicios
1. Graficar un orbital atómico tipo f para el átomo de hidrogeno
2. Graficar 4 funciones en una sola hoja con dinámica de interferencia
Soluciones:
1.
t = 0:pi/50:pi;%definición del libro
f = 0:pi/80:2*pi;%def del libro
[T,F] = meshgrid(t,f); %construcción de puntos completos
Y=(5*cos(T).^2-1).*sin(T).*exp(-1i*F);%L=3,M=1
[x,y,z] = sph2cart(F,pi/2-T,abs(Y.^2));% recordar que matlab y el libro
definen los ángulos de manera diferente, T=F y F=90-T
mesh(x,y,z)
2.
%iNTERFEROMETRO DE LUZ BLANCA
%
%Un pulso es fijo y el orto de mueve de 4 unidades de tiempo a -4
unidades
%de tiempo
%la fase dentro del pulso se mantiene
%
%tic
clear all
uni=8;%unidades de tiempo
num=100;%numero de puntosa calcular 100 es rapido, 1000 es preciso
pul=1;%1/ancho del pulso, .000001 es sin pulso casi
for delta=1:num;
t=linspace(0,10,1000);
e1=1*exp(-pul*(t-5).^2).*1.*cos(10*(1*t-5));
e2=1*exp(-pul*(t-9+(delta-1)*uni/num).^2).*1.*cos(10*(1*t-9+(delta-
1)*uni/num));
Int=(e1+e2).^2;% exponente 2, 4 o 6 para primero, segundo y tercer
orden
Int2(delta)= norm(Int,1);
MATLAB para novatos 70
%end
%toc
figure (1)
subplot (2,2,1)
plot (t,e1)
subplot (2,2,2)
plot (t,e2)
subplot (2,2,3)
plot (t,Int)
subplot (2,2,4)
plot (Int2)
end
plot (linspace(0,uni,num),Int2)
MATLAB para novatos 71
Las líneas más importantes para mantener la eficiencia se pueden agrupar en:
1. Favorecer vectores en lugar de bucles.
2. Evitar que los arreglos crezcan mientras se corre el programa.
3. Escribir MEX-File cuando los bucles son inevitables
4. Evitar el uso innecesario de scripts y cambios innecesarios de variables
5. Si solo se hace calculo real, evitar usar funciones para números complejos cuando
existen alternativas para números reales.
6. Usar los operadores lógicos correctamente
Para las personas que aprendieron a programar con ciclos repetitivos (bucles) es natural
buscar como implementarlos en MATLAB y es muy simple pero en general puede ser
ineficiente.
En el siguiente ejemplo se generan 100 índices m sobre los que se construye las variables
t, y.
for m = 1:100
t(m) = 3*pi*(m-1)/100;
y(m) = sin(t(m));
end
t = 0:pi/100:3*pi;
y = sin(t);
La primera línea genera el vector renglón t que contiene valores desde 0 hasta 3π, en
incrementos de π/100. La segunda línea genera para cada valor de t un valor de y, esto es
un vector renglón con los mismos elementos que t. En mi computadora la versión
vectorial es 19 veces más rápida que la del bucle.
tic
x = 0;
for k = 2:10000
x(k) = x(k-1) + 5;
end
toc
tic
x = zeros(1, 10000);
for k = 2:10000
x(k) = x(k-1) + 5;
end
toc
Este simple cambio permite que la segunda versión sea 730 veces más rápida.
El la sección 9 daremos algunos puntos para acelerar los programas que pueden
incorporarse a la base del conocimiento en niveles posteriores, cuando MATLAB es mas
familiar y se desea explotarlo mas eficientemente.
Esta primera alternativa solo recuerda el ultimo número, y sin menosprecio a que guarde
los números, es muy rápida, si se trata de editar, sólo tiene el último número graficado
function []=espiral()
tic
x=[0;1];
%guarda el manejador de la gráfica en h
MATLAB para novatos 73
h=plot (x(1),x(2),'.');
%define en la grafica el color a graficar y no borra los datos
set(h,'markersize',1,'color','red','erasemode','none');
%define el color del fondo, el titulo de la garfica
set(gcf,'color','white','menubar','none','numbertitle','off','name','es
piral')
axis([-3 3 -2 2])
%borra los ejes de la figura
axis off
drawnow
%espiral simple de 1000 puntos
for m=1:1000
x(1)=exp(-2*m/1000)*sin(m*6*pi/1000);
x(2)=exp(-2*m/1000)*cos(m*6*pi/1000);
set(h,'xdata',x(1),'ydata',x(2));
drawnow
end
toc
Esta segunda alternativa es muy lenta, recuerda cada uno de los números que se han
graficado y como la gráfica tiene toda la información es muy lenta al hacer espacio, es
como crecer el arreglo mientras esta corriendo el programa.
function []=espiral2()
tic
x=[0;0];
plot (x(1),x(2),'.')
axis([-3 3 -2 2])
hold on
for m=1:1000
x(1)=exp(-2*m/1000)*sin(m*6*pi/1000);
x(2)=exp(-2*m/1000)*cos(m*6*pi/1000);
plot (x(1),x(2),'.')
drawnow
end
toc
Si solo se trabaja con números reales, existen funciones para números reales que mejoran
la eficiencia de los cálculos, cuando existe un uso masivo de ellas.
log reallog
pow realpow
sqrt realsqrt
La ejecución de funciones es mas eficiente que la ejecución de scripts, estas ultimas son
leídas y ejecutadas una línea a la vez, mientras que las funciones permanecen en memoria
después de ser usadas la primera vez.
MATLAB para novatos 74
7.6 Archivos
Ahora presentaremos tres temas; como guardar archivos mientras corre el programa,
como leer archivos mientras se corre el programa y finalmente como extraer datos de un
archivo .fig.
Suponiendo que se tiene una matriz R con la información que se desea guardar, en este
caso tres vectores de la misma longitud. Como esta instrucción se tomo de otro programa
y solo tiene el fin de ilustrar el procedimiento no se espera que tenga sentido o que corra
si se incluye en un script de matlab, tendría que modificarse esta matriz por una que
estuviera bien definida.
R=[real(t), real(y(:,4)+y(:,3)+y(:,1)+V1), real(V1./RS)];
m=m+1;
fname=strcat('C:\Users\bigcheese\Documents\test4\','data',num2str(m));
save (fname,'R','-ASCII')
fname=strcat('C:\Users\bigcheese\Documents\test4\','data',num2str(m));
R=load (fname,'-ASCII');
aa=max(R(:,1));
a = load('seno.fig', '-mat')
>> x=a.hgS_070000.children(1,1).children(1,1).properties.XData;
MATLAB para novatos 75
>> y=a.hgS_070000.children(1,1).children(1,1).properties.YData;
7.7 Ejercicios
1. Construir un arreglo de coordenadas en tres dimensiones de 5 unidades en cada
dimensión sin emplear bucles. Crear una alternativa al programa
clear all
Lx=50;
Ly=50;
Lz=50;
A=zeros([Lx*Ly*Lz,3]);
for indicex=1:Lx
for indicey=1:Ly
for indicez=1:Lz
A(indicez+(indicey-1)*Ly+(indicex-1)*Lz*Ly,:)=[indicex
indicey indicez];
end
end
end
Posible Solución
Lx=50;Ly=50;Lz=50;
X=[repmat(1:Lx,Ly*Lz,1)];
Y=[repmat(1:Ly,Lz,Lx)];
Z=[repmat(1:Lz,1,Lx*Ly)];
INDX=[X(:),Y(:),Z(:)];
MATLAB para novatos 76
8 GUIs
La idea de darle datos de entrada a un programa y esperar por la respuesta es la noción
secuencial más común de programar. La utilidad del programa para otros existe cuando
es amigable con el usuario, cuando indica qué es razonable proponer al programa, los
botones, menús y valores predeterminados son muy útiles y cambian el estilo del
programar a activado por eventos. GUI es el acrónimo de Graphics User Interface,
Interfase gráfica para el usuario.
Usualmente el proceso es, pensar en construir el programa activado por eventos, pero
construir las partes secuenciales del programa y probarlas antes de iniciar la construcción
del GUI. Las correcciones posteriores son poco económicas, al grado de que es mejor
iniciar de cero que corregir una estructura terminada.
explicar el programa…
MATLAB para novatos 77
3. Agregar los objetos que se deseen, ver figura 8.2 rectángulo rojo. Como ejemplo
hagamos el ejercicio para FFT. Los rectángulos negros indican los textos dinámicos, que
cambian en la ejecución del programa. El rectángulo verde indican los textos estáticos,
que no se modifican durante la ejecución del programa. El rectángulo púrpura indica una
barra deslizable, el rectángulo azul un botón y los rectángulos amarillo las regiones de las
graficas.
Figura 8.2 pantalla de la figura donde se distribuyen los objetos que controlan la
ejecución del programa. El rectángulo rojo indica el acceso directo a los objetos.
En la figura 8.2 para cada objeto que se agregó, se selecciona con el botón derecho
properties inspector para modificar tag (leyendas que aparecen en el programa) y string
(leyenda que aparecen en la figura). Para nuestro ejemplo se han agregado y modificado
las leyendas como se ve en la tabal 8.1.
4.- Al terminar se salva con un nombre significativo y se generan dos archivos, *.fig y
*.m. El archivo fig tiene toda la información del desplegado de los objetos, el archivo
m tiene la programación de los eventos, véase la figura 8.3.
Figura 8.3 archivos *.fig y *.m generados al salvar el desplegado de los objetos en la
figura. La ilustración de la derecha es después de presionar el botón START y haber
terminado de programar el archivo *.m. La ilustración de la derecha muestra un código
generado por guide al que hay que agregar lo que cada acción en los objetos realizara.
Para concluir el programa solo es necesario agregar las funciones deseadas. Las
modificaciones se agregan en las acciones de los objetos. En este programa solo es
necesario decir lo que sucede al presionar el botón START, y la manera en que se
interrelacionan el control deslizable y el texto dinámico que definen a la variable M.
Adicionalmente es necesario poner atención en el intercambio de datos dentro de la GUI,
de los textos dinámicos al botón START y del este botón a las graficas.
o=angle(Y(2:M/2))*2/N;
f=(1:(M-2)/(M-4):M/2)/dt/M;
plot(handles.axisoscilo,t,y)
grid (handles.axisoscilo,'on')
xlabel(handles.axisoscilo,'tiempo')
ylabel(handles.axisoscilo,'funcion')
plot(handles.axisespectro,f,r)
grid (handles.axisespectro,'on')
xlabel(handles.axisespectro,'frecuencia')
ylabel(handles.axisespectro,'amplitud')
Estas líneas leen el valor que se introduce como texto, lo compara con los valores
posibles para slider, si esta contenido escribe el número y lo transfiere a slider, de no ser,
escribe error.
9 Conexión con C
El propósito principal de esta sección son los MEX-files, que permiten manejar
subrutinas en C o FORTRAN dentro de MATLAB, aunque también es posible prepara
material de MATLAB para ser usado por otros programas e incluso preparar aplicaciones
autocontenidas como se hizo al final de la sección anterior.
Las diferencias con los archivos m son: estos son dependientes de la plataforma en que
serán usados (mexw32 y mexw64 en Windows), el manejo de la memoria es
responsabilidad del programador y no tiene documentación así que esta tiene que ser
manejada de diferente manera.
Como siempre, es necesario decir que MATLAB es altamente eficiente, y los archivos
MEX no necesariamente son una alternativa de velocidad, pero si la subrutina que desea
usar en MATLAB ya esta diseñada y es muy eficiente, se puede usar por este método
como las subrutinas disponibles en www.netlib.com.
yp =
MATLAB para novatos 82
#include <math.h>
#include "mex.h"
/* Input Arguments */
#defineT_IN prhs[0]
#defineY_IN prhs[1]
/* Output Arguments */
#defineYP_OUT plhs[0]
#if !defined(MAX)
#defineMAX(A, B) ((A) > (B) ? (A) : (B))
#endif
#if !defined(MIN)
#defineMIN(A, B) ((A) < (B) ? (A) : (B))
#endif
r1 = sqrt((y[0]+mu)*(y[0]+mu) + y[2]*y[2]);
r2 = sqrt((y[0]-mus)*(y[0]-mus) + y[2]*y[2]);
yp[0] = y[1];
MATLAB para novatos 83
yp[1] = 2*y[3]+y[0]-mus*(y[0]+mu)/(r1*r1*r1)-mu*(y[0]-mus)/(r2*r2*r2);
yp[2] = y[3];
yp[3] = -2*y[1] + y[2] - mus*y[2]/(r1*r1*r1) - mu*y[2]/(r2*r2*r2);
return;
}
{
double *yp;
double *t,*y;
unsigned int m,n;
if (nrhs != 2) {
mexErrMsgTxt("Two input arguments required.");
} else if (nlhs > 1) {
mexErrMsgTxt("Too many output arguments.");
}
m = mxGetM(Y_IN);
n = mxGetN(Y_IN);
if (!mxIsDouble(Y_IN) || mxIsComplex(Y_IN) ||
(MAX(m,n) != 4) || (MIN(m,n) != 1)) {
mexErrMsgTxt("YPRIME requires that Y be a 4 x 1 vector.");
}
t = mxGetPr(T_IN);
y = mxGetPr(Y_IN);
}
MATLAB para novatos 84
>>mex yprime.c
>> yprime(1,1:4)
ans =
>>
Para los formatos definidos para crear un archivo c para
convertirlo a archivo mex véase la ayuda de MATLAB en
External Interfaces.
MATLAB para novatos 85
10 Simulink
Aquí se presenta una visión superficial que puede permitir iniciarse en el modulo de
Simulink, que básicamente es en modulo para la solución numérica de ecuaciones, hasta
sistemas de ecuaciones diferenciales. Oficialmente permite la simulación dinámica de
sistemas, que pueden ser lineales y nolineales.
b b 2 4ac 1 3
Por ejemplo y la raíz cuadrática mayor con a=b=c=1 da y i .
2a 2 2
y =
MATLAB para novatos 86
-0.5000 + 0.8660i
En Simulink, vea la figura 10.2, se ve de esta manera, donde los objetos se toman de la
biblioteca de Simulink, ver la figura 10.3. Los objetos son claros en cuanto a que tienen
entradas y salidas, las entradas son los argumentos y las salidas son los resultados. Para
este tipo de ejemplos los grupos de la biblioteca mas empleados son las funciones
matemáticas (Math Operations), las señales empleadas como fuentes (Sources) y los
exhibidores (Sinks).
Los objetos se conectan entre sus puertos y para ejecutar la secuencia se presiona el botón
encerrado en el círculo verde en la figura 10.2.
d2 f df
2 2 1 5 f 3 .05t 3 5 cos(1.5t )
dt dt
df
con las condiciones iniciales f(0)=1.3 y 8.
dt 0
La figura 10.4 muestra este ejemplo. Es interesante notar el ambiente grafico de trabajo
en Simulink, donde las jerarquías se definen por medio de flechas y los operadores por
medio de cajas que realizan las funciones deseadas. El operador derivada se muestra con
la etiqueta “integrator”, la manera de trabajar en Simulink es despejar la derivada de
orden mayor que en la figura 9.4 se encuentra a la derecha del cuadro rojo e igualarla a
g(t) y a las derivadas de orden menor.
Figura 10.4 Editor de Simulink donde se muestra el ejemplo de una ecuación diferencial
simple.
Los osciloscopios son receptores de datos, en esta simulación para 10 segundos, círculo
verde en la figura 10.4 y el botón para dar inicio a la simulación se encuentra señalado en
la figura 10.4 por medio del círculo azul.
MATLAB para novatos 88
V1 V V dV
I fuente1 I L1 1 2 C1 1
R1 R3 dt
V2 V V dV
I fuente 2 I L 2 2 1 C2 2
R2 R3 dt
V1 dI L1
L1 dt
V2 dI L 2
L2 dt
10.6 Programa para el sistema de ecuaciones, los módulos se describen en la figura 10.7
MATLAB para novatos 89
En las figuras 10.6 y 10.7 se presenta la información que describe a las ecuaciones, en
este caso se hizo uso extensivo de subsystem. Este modulo esta en la biblioteca de
Simulink y al agregarlo al proyecto solo incluye un conector de entrada y un conector de
salida, se pueden agregar más y construir la estructura tan elaborada como sea necesario.
11 SimMechanics
l g
m
b=coeficiente que se
opone a la velocidad
Figura 11.1 Esquema del péndulo simplificado.
Con las consideraciones de que el punto de apoyo de la cuerda no se desplaza, que el
alambre que sostiene la masa no tiene peso, ni cambia de longitud, ni frena al péndulo por
fricción, que la masa es puntual y que la única fuente de fricción es la rotula con el
apoyo. Estas consideraciones en general se omiten en SimMechanics y se puede hacer
una simulación menos idealizada.
1 0 0
I r 0 1 0 r eye(3)
0 0 1
Figura 11.4 Simulación del mecanismo, con los controles se puede modificar la
visualización, iniciarla y generar película del proceso.
La figura 11.2 presenta los iconos interconectados que simulan un pendulo simplificado.
k g