Clase 02
Clase 02
Clase 02
Rubén Agapito
Verano 2017
b
Índice general
Prefacio iii
Referencias 43
i
ii
Prefacio
Los contenidos de estos apuntes de clase están bajo constante supervisión. Si existe alguna sugeren-
cia o error, por favor mandar un correo electrónico al autor: [email protected]
Rubén Agapito
San Miguel, febrero de 2017
Lima, Perú.
iii
iv Prefacio
Justificación del Curso
1
Cuando resolvemos un problema en Ciencias e Ingeniería un modelo matemático es establecido pri-
mero, luego, una solución a este modelo puede ser obtenido. Métodos numéricos y analíticos serán
presentados en este libro para resolver esta clase de problemas.
Sección 1.1
1.1.1
¿Por qué debemos aprender a usar un software matemático?
Sabemos que una derivación manual de soluciones a problemas matemáticos es una habilidad útil
cuando los problemas no son tan complicados. Sin embargo, para una gran variedad de problemas,
una solución manual es a veces tan laboriosa o incluso imposible. Por lo tanto, computadoras deben
ser empleadas para resolver estos problemas. Existen básicamente dos maneras de resolver estos
problemas en una computadora. La primera es implementar algoritmos numéricos existentes usando
lenguajes de programación como C o Fortran. La otra es usar lenguajes matemáticos específicos con
una buena reputación, como Matlab, Mathematica y Maple.
Algoritmos numéricos únicamente pueden ser usados para manipular problemas que involucren
data numérica, mientras que problemas simbólicos como resolver x3 + ax + c = d, donde a, c, d no
son números sino variables simbólicas, no pueden resolverse con algoritmos numéricos. Un lenguaje
matemático con capacidades de cálculo simbólico debe ser usado en su lugar.
Cuando enfrentemos un problema, soluciones analíticas son exploradas primero, y si estas son
difíciles de conseguir, soluciones numéricas son obtenidas.
Presentamos ahora algunos ejemplos que ilustren la necesidad de usar un lenguaje matemático
como Matlab.
Ejemplo 1
sen x d4 f (x)
Si una función f (x) está dada por f (x) = , ¿cómo obtenemos manualmente ?
x2 + 4x + 3 dx4
Solución. Podemos derivar sucesivamente cuatro veces a la función f como se ha aprendido en
los cursos de cálculo. Sin embargo, el procedimiento es más conveniente realizarlo en una compu-
tadora. La implementación en un script de Matlab es la siguiente:
1
2 Justificación del Curso
syms x
f = sin ( x ) /( x ^2+4* x +3) ;
y = diff (f ,x ,4) ;
y = simplify ( y ) ;
pretty ( y )
2 3 4 5 6
(1581 sin(x) − 2448 cos(x) − 4080 x cos(x) − 296 x cos(x) + 1040 x cos(x) + 552 x cos(x) + 112 x
7 2 3 4 5 6
cos(x) + 8 x cos(x) − 3120 x sin(x) − 3120 x sin(x) − 1094 x sin(x) − 32 x sin(x) + 72 x
7 8 2 5
sin(x) + 16 x sin(x) + x sin(x) − 5640 x cos(x) + 192 x sin(x))/(x + 4 x + 3)
d4 f ( x) ¡
= 1581 sin( x) − 2448 cos( x) − 4080 x2 cos( x) − 296 x3 cos( x) + 1040 x4 cos( x) + 552 x5 cos( x)
d x4
+ 112 x6 cos( x) + 8 x7 cos( x) − 3120 x2 sin( x) − 3120 x3 sin( x) − 1094 x4 sin( x) − 32 x5 sin( x)
¢5
+ 72 x6 sin( x) + 16 x7 sin( x) + x8 sin( x) − 5640 x cos( x) + 192 x sin( x) / x2 + 4 x + 3 .
¢¡
Es obvio que una derivación manual podría ser un trabajo tedioso y laborioso. Es más, un leve
error en la manipulación podría dar resultados desastrosos en la respuesta final. Si usamos un
lenguaje matemático el trabajo tedioso y posiblemente no confiable puede ser evitado. Por ejemplo,
en Matlab podemos calcular exactamente d50 f (x) / dx50 , y puede ser obtenido en aproximadamen-
te ¡un segundo!. Cabe señalar que el cálculo de esta derivada no es visualizado completamente
en Matlab, debido a que el output excede la cantidad máxima de 25000 caracteres. En caso sea
necesario obtener la respuesta completa añadimos las siguientes líneas a nuestro script:
Ejemplo 2
Solución. En la primera línea del siguiente script se resuelve numéricamente el problema, sin
1.1. SOLUCIONES EN COMPUTADORA A PROBLEMAS MATEMÁTICOS 3
ans =
-1.5052 + 0.0030i
-1.5052 - 0.0030i
-1.5000 + 0.0060i
-1.5000 - 0.0060i
-1.4948 + 0.0030i
-1.4948 - 0.0030i
la cual no es confiable, ya que se tuvo éxito en la respuesta simbólica, la cual indica que la solución
es real con multiplicidad algebraica cinco:
ans =
-3/2
-3/2
-3/2
-3/2
-3/2
-3/2
a Ver https://en.wikipedia.org/wiki/Root-finding_algorithm#Finding_all_roots_at_once
Ejemplo 3
Para n = 25, un valor erróneo, det(H) = 0, es obtenido, inclusive si precisión doble es usado. Esto
es lo que conseguimos con el siguiente código:
d =
1/9903010146699347787886767841019251068...00000000
Aquí se tienen 3790 dígitos en el denominador, y no se han mostrado todos por motivos de espacio.
Como la variable d es simbólica, calculamos su valor numérico con el comando vpa, usando la
sintaxis vpa(d), obtenemos
ans =
1.0097939769690106521663398695661e-3790
Ejemplo 4
>> mu = 1000;
>> f = @ (t , x ) [ x (2) ; - mu *( x (1) ^2 -1) * x (2) -x (1) ]; % describir EDO como sistema
>> [t , x ] = ode15s (f ,[0 ,3000] ,[ -1;1]) ; % obtencion de la solucion numerica
>> plot (t , x (: ,1) ) , grid on % resolucion grafica
2.5
1.5
0.5
-0.5
-1
-1.5
-2
0 500 1000 1500 2000 2500 3000
Ejemplo 5
y obtenemos
Si las variables de decisión están restringidas a ser números enteros, debemos usar programa-
ción entera. En M ATLAB, la solución a este nuevo problema es fácilmente encontrada al compilar
las siguientes sentencias:
>> P . solver = ' intlinprog '; P . options = optimoptions ( ' intlinprog ') ;
>> P . intcon = 1:5; x = intlinprog ( P )
lo cual nos da
x =
19.0000
0
4.0000
10.0000
5.0000
En este libro nos concentraremos en presentar M ATLAB con sus aplicaciones en la resolución de
problemas de matemática aplicada.
Considerado como lenguaje de programación, M ATLAB tiene las siguientes ventajas:
1. Claridad y alta eficiencia. M ATLAB es un lenguaje altamente integrado. Unas pocas líneas de
código en M ATLAB equivalen a cientos de líneas de código fuente de otros lenguajes. Por lo tanto,
un programa en M ATLAB es más confiable y fácil de mantener.
2. Computación científica. El elemento básico en M ATLAB es una matriz compleja de precisión do-
ble. Manipulaciones matriciales pueden realizarse directamente. Funciones predefinidas en M AT-
LAB que implementan herramientas de cálculo numérico pueden ser usadas directamente. Tam-
bién, computación simbólica provista por la caja de herramientas Symbolic Math Toolbox puede
utilizarse para obtención de fórmulas, con el fin de resolver analíticamente un problema.
3. Funciones de graficación. M ATLAB puede ser utilizado para visualizar data experimental de
una manera muy fácil. Funciones implícitas también pueden ser graficadas con facilidad. Más
aún, creación de interface gráfica de usuario (GUI, de graphical user interface) y programación
orientada a objetos, también son posibles de llevar a cabo en M ATLAB.
4. Diversos toolboxes y blocksets. Existe una enorme cantidad de toolboxes (librerías creadas
para un fin específico) y Simulink blocksets (bloques gráficos que permiten entrada y/o salida
de data, que permiten realizar simulaciones) desarrollados por programadores experimentados e
investigadores.
9
10 Fundamentos de Programación en MATLAB y Visualización Científica
Sección 2.1
(1) eps. Es el error de tolerancia para operaciones punto flotante. El valor aproximado es 2.2204 ×
10−16 . También puede ser considerado, algunas veces, como la distancia entre dos números reales
punto flotante contigüos. Obsérvese que si el valor absoluto de un número punto flotante es menor
que eps, entonces en máquina será tratado como cero.
p
(2) i y j. Ambos representan −1. Si alguno de ellos fuese sobrescrito, su valor puede ser restaurado
con el comando i=sqrt(-1), o el comando clear i
(3) inf. Es la representación en M ATLAB de +∞. También puede ser escrito como Inf. Similarmente,
−∞ puede ser tipeado como -inf. Cuando 0 es usado en el denominador, el valor inf puede ser
generado.
(4) NaN. Significa not a number, lo cual es equivalente a una expresión indeterminada, como 0/0, ∞/∞,
∞ − ∞, 1∞ , 0 · ∞. Debemos tener cuidado con las otras dos expresiones indeterminadas, ya que en
M ATLAB se tiene 00 = 1 e ∞0 = 1.
(5) pi. Es la representación en máquina, en precisión doble, del número irracional π. Si deseamos
ver con cuántas cifras está almacenado en memoria este número, digitamos format long y luego
pi.
(6) realmax. Es el número real positivo punto flotante más grande que puede ser almacenado en
máquina. Su valor aproximado es 1.7977 × 10308 .
(7) realmin. Es el número real positivo punto flotante más pequeño que puede ser almacenado en
máquina. Su valor aproximado es 2.2251 × 10−308 .
declara que t ≤ 4 y x 6= 2. La función assumeAlso() también puede ser usada para poner más especifi-
caciones sobre variables simbólicas. Por ejemplo, si x es real y −1 ≤ x < 5, la declaración en M ATLAB
sería
En caso hayamos definido una variable simbólica, y luego queremos saber el tipo de restricciones
impuestas sobre ella, basta usar el comando assumptions().
La función de precisión aritmética variable (variable precision arithmetic) vpa() es usada para
exhibir el valor numérico de una variable simbólica con cualquier precisión. La sintaxis de la función
es vpa(A,n) o vpa(A), donde A es la variable simbólica y n el número de dígitos requerido, con el valor
por defecto de 32 dígitos decimales.
12 Fundamentos de Programación en MATLAB y Visualización Científica
Ejemplo 1
lo cual nos da
ans =
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482←-
5342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559←-
6446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104←-
5432664821339360726024914127
1) Strings. Variables tipo string son usadas para almacenar mensajes. El string debe estar entre
diéresis. Por ejemplo
a =
10 20 30 25 13
o también
>> b = [2
4
6
2.1. ELEMENTOS ESENCIALES DE MATLAB 13
8
10]
>> A = [1 2 3; 4 5 6; 7 8 9]
Además, podríamos construir la misma matriz por concatenación (esto es, uniendo) los vectores
que representan cada columna
En este punto de la sesión, una lista de todas las variables actualmente en memoria se consigue
con el comando who:
>> who
A a ans b
>> whos
A 3x3 72 double
a 1x5 40 double
ans 1x1 8 double
b 5x1 40 double
Para accesar a un elemento individual de un arreglo, usamos paréntesis. Por ejemplo, el cuarto
elemento del vector columna b puede ser exhibido como
>> b(4)
ans =
8
Para una matriz, A(m,n) selecciona el elemento de la fila m y columna n. Por ejemplo,
>> A(3,1)
ans =
7
Hay varias funciones predefinidas que pueden ser usadas para crear matrices. Por ejemplo, las
funciones ones y zeros crean arreglos rellenados con unos y ceros, respectivamente. Ambos tienen
14 Fundamentos de Programación en MATLAB y Visualización Científica
dos argumentos, el primero es para el número de filas y el segundo para el número de columnas.
Por ejemplo, creemos una matriz 2 × 3 de ceros:
>> C = zeros(2,3)
C =
0 0 0
0 0 0
Similarmente, la función ones puede ser usada para crear un vector fila de unos:
>> u = ones(1,4)
u =
1 1 1 1
3) Arreglos Celulares. A diferencia de una matriz, los elementos (células o celdas) de un arreglo
celular no tienen porqué ser solo del tipo numérico. Por ejemplo, en M ATLAB no es posible formar
la siguiente matriz:
dado que elementos del arreglo x tienen diferentes dimensiones. La entrada x(1,1) es de tipo
string y puede ser considerado como un arreglo de tamaño 1 × 4, mientras que la entrada x(1,2)
es de tipo numérico y es de tamaño 1 × 1. De allí se suscita el problema. Pero si ahora construimos
el siguiente ejemplo un poco más elaborado (nótese el uso de llaves en vez de paréntesis):
>> A = [1 3; 7.1 9]; x = { ' hola ' 55; ' mundo ' A }
obtenemos
'hola' [ 55]
'mundo' [2x2 double]
¿Cómo invocamos las celdas de este arreglo celular? Veamos algunos ejemplos:
4) Variables Estructuradas. Una estructura es una colección de data que representa una idea
simple u objeto. Dentro de una estructura tenemos una lista de campos (fields), y cada campo
es una subcolección de data. Entendamos este tipo de variable con el siguiente ejemplo. Primero
creamos una estructura de arreglo 1 × 1 llamada paciente en un script:
2.1. ELEMENTOS ESENCIALES DE MATLAB 15
paciente =
struct with fields:
Así, paciente es un arreglo que contiene una estructura con tres campos. Para expandier la es-
tructura de arreglo, añadimos índices luego del nombre de la estructura:
La estructura de arreglo paciente ahora es de tamaño 1 × 2. Observe que una vez que una estruc-
tura contenga más de un simple elemento, M ATLAB ya no exhibe los contenidos de cada campo
cuando invoquemos el nombre del arreglo, más bien muestra un resumen del tipo de información
que la estructura contiene
>> paciente
paciente =
1x2 struct array with fields:
nombre
cuenta
test
Podemos también usar la función fieldnames() para obtener esta información. La diferencia es
que obtendríamos un arreglo celular de strings con los nombres de todos los campos:
>> fieldnames(paciente)
ans =
3x1 cell array
'nombre'
'cuenta'
'test'
Si expandimos la estructura, M ATLAB rellenará cualquier campo no especificado con una matriz
vacía, de manera que todas las estructuras en el arreglo tengan el mismo número de campos.
Por ejemplo, si digitamos paciente(3).nombre = 'Juan Pistolas', expandimos la estructura
paciente a un arreglo 1 × 3, y los campos paciente(3).cuenta y paciente(3).test contendrán
arreglos vacíos.
Tomar en cuenta que el tamaño de los campos no tienen que ser igual para cada elemento en un
arreglo. Por ejemplo, en la estructura paciente el campo nombre tiene diferentes longitudes, y el
campo test puede contener matrices de diferentes tamaños.
16 Fundamentos de Programación en MATLAB y Visualización Científica
5) Clases y Objetos. M ATLAB permite el uso de clases en la programación, esto es, soporta progra-
mación orientada a objetos (OOP, Object Oriented Programming).2
Sección 2.2
Fundamentos de Programación
Un algoritmo3 es un conjunto de reglas que deben seguirse ordenadamente para resolver un proble-
ma dado. Cuando escribimos un algoritmo en papel, comúnmente usamos palabras del habla común
mezcladas con lenguaje técnico. El resultado de este proceso es llamado seudocódigo,4 y por la
estrecha relación entre ambos, usaremos algoritmo y seudocódigo como sinónimos.
Un lenguaje de programación (como C, C++, Java, Python, etc.) es un lenguaje formal que
nos permite controlar el comportamiento de una máquina, en especial, una computadora. Debemos
tener en cuenta que un seudocódigo es escrito independientemente del lenguaje de programación
que uno escoja. Cuando implementamos un seudocódigo en la computadora, vía algún lenguaje de
programación, obtenemos un programa. Un programa es así un conjunto de instrucciones que una
computadora puede interpretar y ejecutar. A diferencia del seudocódigo, un programa debe elaborar-
se cumpliendo ciertas reglas de sintaxis y de formato (determinadas por el lenguaje de programación
que se use), caso contrario, el programa no funcionará (o compilará) correctamente.
Ilustramos los conceptos mencionados en el siguiente ejemplo.
Deseamos encontrar una solución de la ecuación f (x) = 0, donde se sabe que f es continua en el
intervalo [a, b] y f (a) · f (b) < 0.5 De los varios algoritmos que existen presentamos el siguiente:
Algoritmo de Bisección
INPUT extremos a, b; tolerancia TOL; maximo numero de iteraciones N0 .
OUTPUT solucion aproximada r o mensaje de no exito.
Paso 1: Inicializar i = 1;
Poner F A = f (a)
Paso 2: Mientras que i ≤ N0 hacer Pasos 3-6.
Paso 3: Poner r = a + ( b − a)/2;
FR = f ( r )
Paso 4: Si FR = 0 o (b − a)/2 < TOL entonces
OUTPUT (r); (Procedimiento completado exitosamente)
PARAR.
Paso 5: Poner i = i + 1
Paso 6: Si F A · FR > 0 entonces (calculo de nuevo intervalo [a i , b i ])
poner a = r ;
F A = FR ;
sino
poner b = r (F A conserva su valor)
Paso 7: OUTPUT('Metodo no converge despues de N0 iteraciones');
(El procedimiento no tuvo exito).
PARAR.
2 Verhttps://www.cs.ubc.ca/~murphyk/Software/matlabTutorial/html/objectOriented.html
3 Léase http://es.wikipedia.org/wiki/Algoritmo para más información.
4 Léase http://es.wikipedia.org/wiki/Algoritmo#Pseudoc.C3.B3digo.
5 El requerimiento f (a) · f (b) < 0 implica que f evaluada en los extremos del intervalo [a, b] toma valores con signos
opuestos y como f es continua, la gráfica de la función debe pasar necesariamente por el eje X .
2.2. FUNDAMENTOS DE PROGRAMACIÓN 17
http://www.mathworks.com/help/matlab/index.html
pero en estas notas introduciremos el manejo de este lenguaje poco a poco resolviendo problemas.
6 Cuando profundicemos más en el curso nos daremos cuenta que este programa puede ser mejorado u optimizado, en
P ROBLEMA 1 (I NCREMENTO DEL A REA DE UNA E SFERA ): El área de la superficie de una es-
fera con radio r está dada por la fórmula
A(r) = 4π r 2 .
Las dos primeras fórmulas son exactas, mientras que la tercera es una aproximación que ignora
el término (δ r)2 .
Escribir un programa en que solicite (input) el radio de la esfera r (en kilómetros), el incremen-
to δ r (en milímetros), y exhiba (output) en pantalla el incremento en el área de la superficie (en
metros cuadrados). ¿Cuál es el incremento (∆ A) cuando el radio de un planeta esférico (r = 6367
km) se incrementa por unos pocos milímetros (δ r)? Explore la respuesta a esta pregunta usando
cada una de las tres fórmulas dadas arriba.
>> r = 6367;
Ponemos el punto y coma al final de la sentencia y luego presionamos E NTER para llevar a cabo esta
asignación en la memoria del computador (¿qué sucede si no hubiésemos puesto el punto y coma? 7 ).
Podemos ahora hallar el área de la esfera usando la variable r:
>> 4 * 3.1416 * r ^2
ans =
5.0943e+08
Si deseamos mostrar más dígitos podemos usar el comando format con el estilo long:8
7 R PTA : Después de presionar E NTER, aparte de almacenar la asignación en memoria también se mostrará nuevamente
esta línea en el prompt de M ATLAB. Además, obsérvese que no hemos tipeado una ecuación, sino una asignación, el signo
de igualdad en M ATLAB está dado por ==, y veremos más adelante cómo utilizarlo.
8 para conocer más variaciones de estilo, digitar doc format.
2.2. FUNDAMENTOS DE PROGRAMACIÓN 19
Observemos que M ATLAB utiliza internamente 16 dígitos para sus cálculos (en la mantisa de la
representación punto flotante de un número9 ), pero como en la respuesta final es común usar de 3 a
5 dígitos, regresamos al formato original usando format short.
Si deseamos usar el área calculada en operaciones posteriores, es preferible almacenar la res-
puesta en una variable10 , por ejemplo:
Para usar este programa hacemos clic izquierdo en el triángulo verde de la parte superior, eti-
quetado con R UN, o simplemente tipeamos el nombre del script en el Command Window
>> AreaSup
Ingrese radio r:
En caso quiera usarse otro valor para r, simplemente hay que invocar el programa de nuevo.
Pasamos a describir lo que hace cada línea.
subrayado, con un máximo de 64 caracteres. M ATLAB también es sensible a las letras mayúsculas, así que las variables
Area, area, arEa, son todas diferentes.
11 Brindaremos varios ejemplos más adelante para que la diferencia entre scripts y funciones quede más claro. Es posible
construir una función que no necesite input y no dé outputs, este tipo de función tiene sus fines, pero no la usaremos aquí.
12 Dependiendo de la configuración de M ATLAB que uno tenga, es posible que la ventana del Editor aparezca incrustada
en la ventana principal.
20 Fundamentos de Programación en MATLAB y Visualización Científica
Líneas 1-2: Cualquier código escrito a la izquierda del símbolo % es un comentario, y no son vistos
por el compilador a la hora de correr el programa. Los comentarios son útiles para hacer el
código más entendible.
Línea 3: El comando clc borra los contenidos del Command Window, es un acrónimo para clear
command window.
Línea 4: El comando input pide entrada de data al usuario. La sentencia entre signos de apóstrofe
es una data del tipo string,13 la cual aparecerá en pantalla al correr el programa. El radio
ingresado se almacenerá en la variable r.
Línea 6: Se exhibe en pantalla la sentencia indicada dentro de los apóstrofes, con los reemplazos de
%10.3f por el valor almacenado en r y %10.3e por el valor almacenado en A. El símbolo \n sig-
nifica E NTER o cambio de línea.
Expliquemos ahora el formato %10.3f. Primero recordemos que esta expresión será reemplazada por
el valor que tenga la variable r, la cual está representando un número real. El número 10 significa
que se reservarán 10 espacios en pantalla para el valor de r, incluyendo el punto decimal. El número
3 significa que se reservarán 3 espacios comenzando desde la derecha para la parte decimal del
valor de r. En caso el valor de r contenga más de 3 cifras decimales, M ATLAB utilizará redondeo
para forzar la exhibición a sólo tres cifras. Quedan entonces 6 espacios libres para exhibir la parte
entera de r. En caso la parte entera contenga más de 6 cifras, entonces se exhibirá TODA la parte
entera de r. Si la parte entera tiene menos de 6 cifras, entonces se usarán espacios en blanco (a la
izquierda del número) para completar los espacios que faltan. Por último, la letra f indica que se
usará notación decimal estándar.14 Otras opciones son %d (para valores enteros) y %e (para exhibir
valores en formato exponencial).
Se recomienda correr el programa para diversos valores de r para entender cómo funciona este
formato.
Ahora nos concentramos en cómo implementar en M ATLAB el incremento del área usando las
tres fórmulas dadas en (2.1a)–(2.1c).
delta_A1 = 4* pi *( r + delta_r ) ^2 - 4* pi * r ^2
delta_A2 = 4* pi *(2* r + delta_r ) * delta_r
delta_A3 = 8* pi * r * delta_r
Las operaciones usadas arriba son parte de las operaciones aritméticas usuales predefinidas en M AT-
LAB (Ver Tabla 2.1). ¿Cuál es el orden de operaciones que efectúa la computadora en la expresión?
4*pi*(r + delta_r)^2 - 4*pi*r^2? Para responder esto es importante recordar la jerarquía en el
orden de operaciones aritméticas (ver Tabla 2.2) que está implícito en las computadoras. El nivel 1
es el que se ejecuta primero, y así sucesivamente subiendo de nivel.
En adición a las operaciones aritméticas básicas existen varias funciones predefinidas en M AT-
LAB . La lista de las funciones más usuales puede ser invocada así
13 En caso necesitemos saber más sobre un comando determinado, por ejemplo input, podemos usar los comandos help o
doc. Por ejemplo, úsese help input.
14 Es útil observar que se pudo usar simplemente %f. El número 10.3, o el que elija el usuario, simplemente nos brinda
Símbolo Significado
+ Adición
- Sustracción
* Multiplicación
/ División
^ Exponenciación
Nivel Operaciones
1 Las expresiones dentro de todos los paréntesis son evaluadas, comenzando des-
de lo más interno hacia afuera.
2 Todas las expresiones exponenciales son evaluadas, comenzando de izquierda
a derecha.
3 Todas las multiplicaciones y divisiones son evaluadas, de izquierda a derecha.
4 Todas las adiciones y sustracciones son evaluadas, de izquierda a derecha.
¿Por qué la diferencia en los tres métodos? Es más, los métodos 1 y 2 deberían darnos la misma res-
puesta, ya que representan el mismo valor en aritmética exacta. Resulta que la computadora realiza
otro tipo de aritmética, llamada aritmética punto flotante o aritmética computacional, la cual conlleva
a errores, dado que no todo número real puede representarse exactamente en la computadora.
Tipos de Errores
Cuando usamos la computadora hay que tener en cuenta los tipos de errores que debemos minimizar,
con la finalidad de poder confiar en los resultados que nos dé la computadora. Son dos los tipos de
errores:
Error de redondeo: Ocurren debido a que las computadoras tienen una capacidad limitada para
representar exactamente un número. Por ejemplo, el número irracional π.
Error de truncación: Ocurren cuando formulaciones matemáticas exactas son sustituidas por
aproximaciones. Por ejemplo, en el script que calcula el incremento en el área de la superfi-
cie de una esfera, observamos que si bien el método 3 no es la fórmula exacta, nos brinda una
buena aproximación del incremento de área.
Aprenderemos más adelante cómo evitar la magnificación del error de redondeo en un programa.
En el siguiente problema ilustraremos el uso de una estructura condicional, la cual permite que
un bloque de código sea o no ejecutado, si cierta proposición que lo precede es verdadera o falsa.
R ≤ xc
Mínimo valor = f (R)
L ≤ xc ≤ R
Mínimo valor = f (x c )
xc ≤ L
Mínimo valor = f (L)
Dadas estas tres posibilidades, el siguiente seudocódigo identifica y procesa la alternativa correc-
ta
Si R < x c
Imprimir f (R ) y R
sino si L ≤ x c ≤ R
Imprimir f ( x c ) y x c
sino
Imprimir f (L) y L
fin
Símbolo Significado
< menor que
<= menor o igual que
== igual
> mayor que
>= mayor o igual que
~= no igual
En M ATLAB una proposición verdadera toma el valor 1, y una falsa el valor cero. Por ejemplo, sabe-
mos que 5<8 es verdadero, si almacenamos esto en una variable y luego invocamos su valor, veremos
que obtenemos 1:
>> a = 5 < 8;
>> a
a =
1
Cuando los operadores de relación son usados entre dos operandos numéricos siempre nos dan como
resultado un valor lógico, verdadero (1) o bien falso (0). Es importante mencionar ya desde ahora que
debemos tener cierto cuidado al usar los operadores == y ~= al comparar dos valores numéricos. Esto
se debe a los errores de redondeo al aproximar números reales. Estudiemos el siguiente ejemplo
>> x = 0;
>> y = sin(pi);
>> x == y
ans =
0
Esto nos dice que sen(π) 6= 0 según la computadora. ¿A qué se debe esto? Si mostramos en pantalla
el valor de sen(π), según M ATLAB, obtendremos 1.2246 × 10−16 , lo cual es muy pequeño y cercano
a cero, pero no es exactamente cero. Esto se debe a que la función seno no es evaluada en el valor
exacto de π sino en una aproximación decimal de este número en la computadora, con un número
máximo de cifras significativas. Recordar que al ser π un número irracional, no puede representarse
con un número finito de cifras decimales, ni como el cociente de dos enteros.
Ahora bien, dado que pedir igualdad exacta entre dos valores reales no es recomendable ¿cómo
verificar entonces una igualdad? Se sugiere mejor verificar una cercanía o distancia mínima. Por
ejemplo, podríamos asumir que x y y son iguales en la computadora si la distancia entre ellos es
menor que 10−14 . Esto lo digitamos así
A continuación presentamos los operadores booleanos o lógicos. Estos operan sobre uno o dos
operandos lógicos (proposiciones) y conducen a un resultado lógico. Existen cinco operadores binarios
lógicos: Y (& y &&), O inclusiva (| y ||), y O exclusiva (xor); y un operador lógico unitario: NO
(~), véase la Tabla 2.3. Observemos que existen dos versiones para los operadores Y y O inclusivo.
¿Cuándo es usada la versión con atajo en evaluación? Para responder esto debemos recordar la tabla
de verdad de estos operadores y tener en cuenta que este tipo de atajo solo se usa entre expresiones
2.2. FUNDAMENTOS DE PROGRAMACIÓN 25
Símbolo Operación
& Y lógico
&& Y lógico con atajo en evaluación
| O lógico inclusivo
|| O lógico inclusivo con atajo en evaluación
xor O lógico exclusivo
∼ NO lógico
Inputs Y O XOR NO
x y x&y x && y x|y x || y xor(x,y) ∼x
0 0 0 0 0 0 0 1
0 1 0 0 1 1 1 1
1 0 0 0 1 1 1 0
1 1 1 1 1 1 0 0
lógicas 1 × 1 ó escalares15 (véase la Tabla 2.4). Es claro que las versiones con atajo tienen la misma
tabla de verdad, pero la conveniencia radica en que a veces no necesitamos verificar el valor de verdad
de una expresión para obtener el resultado lógico de verdadero o falso.16 En la siguiente tabla se ha
puesto un signo de interrogación en los lugares donde la computadora no necesita averiguar el valor
de verdad de la segunda proposición:
x y x && y x y x||y
0 ? 0 0 0 0
0 ? 0 0 1 1
1 0 0 1 ? 1
1 1 1 1 ? 1
¿Qué se gana con esto? TIEMPO, y el tiempo de ejecución de un programa es primordial cuando
resolvemos problemas muy elaborados, sobre todo si nuestro programa tiene que realizar muchos
cálculos intermedios antes de obtener la respuesta final.
En la jerarquía de operaciones, los operadores lógicos son evaluados después de que todas las
operaciones aritméticas y todos los operadores relacionales han sido evaluados. Ver Tabla 2.5. Como
ocurre con las operaciones aritméticas, paréntesis pueden ser usados para cambiar el orden por
defecto en la evaluación.
Ahora mostraremos cómo implementar en Matlab el algoritmo mencionado al principio de la so-
lución de este problema. Primero pedimos al usuario los extremos del intervalo [L, R], los coeficientes
b y c de la función cuadrática, y calculamos el punto crítico x c = − b/2:
proposiciones x y y son verdaderas, en los demás casos es falso (0), mientras que para el conectivo O inclusivo el resultado
sólo es falso si ambas proposiciones son falsas.
26 Fundamentos de Programación en MATLAB y Visualización Científica
Nivel Operaciones
1 Todos los operadores aritméticos son evaluados en el orden previamente descrito.
2 Todos los operadores relacionales (==, ∼=, >, >=, <, <=) son evaluados, de
izquierda a derecha.
3 Todas los operadores de negación (∼) son evaluados.
4 Los operadores & y && son evaluados, de izquierda a derecha.
5 Los operadores |, || y xor son evaluados, de izquierda a derecha.
xc = -b /2;
fL = L ^2 + b * L + c ;
fR = R ^2 + b * R + c ;
fxc = xc ^2 + b * xc + c ;
if R < xc
fprintf ( ' Valor m í nimo f ( R ) = %5.2 f \ n ' , fR ) ;
fprintf ( ' alcanzado en R = %5.2 f \ n ',R ) ;
elseif L <= xc && xc <= R
fprintf ( ' Valor m í nimo f ( xc ) = %5.2 f \ n ' , fxc ) ;
fprintf ( ' alcanzado en xc = %5.2 f \ n ' , xc ) ;
else
fprintf ( ' Valor m í nimo f ( L ) = %5.2 f \ n ' , fL ) ;
fprintf ( ' alcanzado en L = %5.2 f \ n ',L ) ;
end
En este último bloque de código hemos visto cómo se utiliza la construcción if-elseif. En general,
toma la siguiente forma:
max(expresion1,expresion2)
es el más grande de los dos valores, obtenidos al evaluar las expresiones. La función min trabaja
de manera similar. Ambas funciones se pueden aplicar a una lista de dos o más expresiones.
• floor,ceil,round: Estas son funciones que son aplicadas a números reales para obtener valores
enteros cercanos. Así, para un número decimal x, tenemos que floor(x) nos da el mayor número
entero menor o igual que x, ceil(x) nos da el menor número entero mayor o igual que x, y round←-
(x) nos da el número entero más cercano a x. En caso x esté localizado exactamente entre dos
enteros, round(x) nos dará el mayor de los enteros. Por ejemplo, round(4.5) nos da 5.
• rem: Si x y y son enteros positivos, entonces rem(x,y) es el resto de dividir x por y. Por ejemplo,
rem(23,3) nos da 2. La función rem también puede aplicarse a números reales de cualquier signo.
2) Un elipsoide, tal como nuestro planeta Tierra, se obtiene al rotar una elipse alrededor de su eje
menor. Se sabe que el radio ecuatorial de la Tierra es aproximadamente 21 km más largo que su
radio polar. El área superficial de un elipsoide está dado por17
r 22 ³ cos γ ´¶
µ ¡ ¢
2
A(r 1 , r 2 ) = 2π r 1 + ln
sen(γ) 1 − sen(γ)
donde r 1 es el radio ecuatorial, r 2 es el radio polar, y
³r ´
2
γ = arc cos .
r1
Asumimos r 2 < r 1 . Escriba un script que lea los radios ecuatorial y polar y exhiba en pantalla
A(r 1 , r 2 ) y la aproximación
³ r + r ´2
1 2
4π .
2
Aplique el script a los datos terrestres (r 1 , r 2 ) = (6378.137, 6356.752). Exhiba suficientes dígitos
para mostrar la discrepancia entre la fórmula exacta y la aproximación.
4) Suponga que el valor de x es un entero positivo. Escriba una expresión booleana que es verdadera
si x es divisible por 2, 5 y 7.
5) Escriba un script que solicite números reales L y R e imprima el valor máximo de f (x) = cos(x)
en el intervalo [L, R]. Asuma L < R. Recuerde que el coseno alcanza un valor máximo de uno en
múltiplos enteros de 2π.
Decimos que q es simple si sus tres raíces son reales y distintas. Decimos que q es monótona si es
siempre creciente o bien siempre decreciente. Como ejemplo, consideremos
Bucle for: Es una construcción que permite repetir un bloque de código un número determinado de
veces. La repetición está controlada por los valores que toma el índice. Su forma más simple
es:
Es posible usar un bucle for dentro de otro. La necesidad de esto se verá más adelante.
Bucle while: Es una construcción que permite repetir un bloque de código un número indetermi-
nado de veces, hasta que se cumpla cierta condición. Toma la forma
while condición_es_verdadera
Bloque de código
end
30 Fundamentos de Programación en MATLAB y Visualización Científica
Cada vez que se repite el bloque de código el programa verifica si la condición sigue siendo
verdadera. Esto implica que dentro de este bloque debe existir alguna expresión que llegará a
cambiar el valor de verdad de la condición.
Ilustraremos el uso de estos tipos de bucle con los siguientes problemas resueltos.
N ≈ π n2
ya que las baldosas sin cortar casi cubren el disco. Escriba un script que solicite al usuario un
entero n y exhiba la aproximación del número π
N
ρn =
n2
Inicializar : N1 = 0
Repetir para filas 1 hasta la n
Calcular el n ú mero de baldosas sin cortar en la fila .
A ñ adir este n ú mero a N1 .
Poner ρ n = 4 N1 / n2 .
2.2. FUNDAMENTOS DE PROGRAMACIÓN 31
Dado que sabemos el número de veces que se va a repetir nuestro programa, utilizaremos un
bucle for. Refinamos nuestro seudocódigo así:
Ahora nos concentramos en cómo calcular el número de baldosas sin cortar en la fila k. En la Fig. 2.2
recordemos que el origen (0, 0) se encuentra en la esquina inferior izquierda. El punto (0, 1) (relativo
a la fila 1), se encuentra obviamente encima del origen. La recta horizontal que pasa por (0, 1), esto
es, y = 1, interseca a la circunferencia en el punto
³p ´
n 2 − 12 , 1 .
Supongamos que (h, 1) son las coordenadas del extremo superior derecho del último cuadradito de la
fila 1 que deseamos saber si es cortado o no por la circunferencia x2 + y2 = n2 . Recuérdese que h es
un número entero positivo. Para que este último cuadradito sea considerado como baldosa sin cortar,
debe suceder que p
h ≤ n 2 − 12 ,
Ahora pensemos en cómo calcular N1 . Antes del bucle for debemos inicializar N1 = 0. Para actuali-
zar este valor dentro del bucle for basta escribir
N1 = N1 + h
Esta sentencia se lee “el valor de N1 se actualiza con el valor que resulte de calcular N1 + h”. Es
importante recordar que el símbolo = no significa igualdad cuando programamos en M ATLAB.
Resumiendo, formamos el siguiente pedazo de código
32 Fundamentos de Programación en MATLAB y Visualización Científica
Aquí, la variable k, llamada índice del bucle, toma valores del 1 al 10:
>> k = 1:10
k =
1 2 3 4 5 6 7 8 9 10
Podemos cambiar el conjunto de valores que toma el índice proveyendo un incremento, por ejemplo
>> k = 1:2:10
k =
1 3 5 7 9
nombre_arreglo = valor_inicial:incremento:valor_final
Aquí, el incremento puede ser cualquier número real positivo y asumimos que el valor_inicial es
menor o igual que el valor_final. Estos valores pueden ser números decimales. Por ejemplo:
>> k = -2.35:1.4:4.5
k =
-2.3500 -0.9500 0.4500 1.8500 3.2500
Si el valor_inicial es mayor que el valor_final obtenemos un arreglo vacío. Por otro lado, es
posible también usar un decremento si deseamos un arreglo ordenado en forma decreciente:
nombre_arreglo = valor_inicial:decremento:valor_final
16 % c á lculo de la aproximaci ó n de pi
17 ro_n = 4* N1 / n ^2;
18
19 % Exhibici ó n del estimado y del error
20 clc
21 fprintf ( 'n = %12 d \ n ',n ) ;
22 fprintf ( ' ro_n = %12.8 f \ n ' , ro_n ) ;
23 fprintf ( ' error = %12.8 f \ n ' , abs (pi - ro_n ) ) ;
n = 10000
ro_n = 3.14119052
error = 0.00040213
n ³ 2π ´
An = sen ,
2 n
³π´
B n = n tan ,
n
respectivamente. Es obvio que para todo n
Usando la Fig. 2.3 para guiarnos, podemos deducir que el promedio de las dos áreas poligonales
A n + Bn
ρn =
2
es una aproximación de π, con error absoluto que satisface
¯ρ n − π¯ < B n − A n .
¯ ¯
(B m − A m ) ≤ δ.
n = 10;
for k = 1:8
A_n = (n /2) * sin (2* pi / n ) ;
B_n = n* tan ( pi / n ) ;
ro_n = ( A_n + B_n ) /2;
n = 10* n ;
end
Los valores de ensayo son n = 10, 102 , 103 , . . . , 108 . Si añadimos más líneas de código para imprimir
en pantalla, conseguimos:
Un bucle for no puede ser usado porque debemos saber el número de iteraciones por adelantado
y esto es justo lo que buscamos. Un mecanismo alternativo para iterar es el bucle while. Su uso en el
seudocódigo anterior se implementa en M ATLAB como sigue:
Si la expresión lógica CotaError > delta es verdadera, entonces el cuerpo del bucle es ejecuta-
do. Esta ejecución se repetirá hasta que la expresión lógica sea falsa. Cuando el bucle termina de
ejecutarse, el programa continuará ejecutando las líneas debajo de la palabra end. Debemos tener
presente que variables que sean utilizadas por el bucle while deben inicializarse antes de comenzar
el bucle.
La solución final del problema es presentada en el siguiente script.
Observemos que la condición al inicio del bucle while en un principio es verdadera (caso contrario
no se ejecutaría iteración alguna), y basta que una de las proposiciones encerradas entre paréntesis
llegue a ser falsa para que el bucle termine. Si no se hubiese tenido el cuidado de incorporar un
número máximo de iteraciones (nMax) podría haberse incurrido en un bucle infinito (esto ocurriría si
damos, por ejemplo, un δ muy pequeño como 10−20 ). Recordar que en caso el programa tarde mucho
en exhibir el output, debe usarse Ctrl-c para abortar la ejecución.
36 Fundamentos de Programación en MATLAB y Visualización Científica
delta = 1.000e-06
m = 5569
nMax = 1000000
ro_m = 3.141592486963389
Pi = 3.141592653589793
break: Cuando es ejecutada la línea que contiene al comando break, el bucle es obligado a terminar
y el control del programa pasa a la línea de código ubicada después del fin (end) del bucle.
continue: Cuando es ejecutado este comando el bucle vuelve a reiniciarse con el próximo valor de
la iteración.
Queda como ejercicio justificar porqué el valor en memoria para x es 3. El siguiente programa ilustra
el uso del comando continue.
Escriba un script que exhiba los valores de ¯π − ρ n ¯, |π − τn |, y ¯π − µn ¯ para n = 100, 200, 300, . . . , 1000.
¯ ¯ ¯ ¯
2 p Xn p 4n + 3 p
n n≤ k≤ n
3 k=1 6
para n = 1, . . . , 100.
5) Modifique el programa 2.6 de manera que termine el bucle cuando | A n+1 − A n | ≤ δ ó |B n+1 − B n | ≤
δ.
6) Añada comandos apropiados (fprintf o disp) al fragmento de código (bucle for) de la pág. 34,
para obtener la tabla de valores mostrada en esa página, para n = 10, 102 , . . . , 108 .
7) La implementación del programa 2.6 requiere la constante predefinida pi. Usando repetidamente
las fórmulas de ángulo mitad
s s
1 + cos(θ ) 1 − cos(θ )
cos(θ /2) = , sen(θ /2) = ,
2 2
podemos evitar esta dependencia y producir un método genuino que “descubra” π. Observe que el
caso n = 3 involucra
p p
cos(π/3) = 1/2, sen(π/3) = 3/2, y sen(2π/3) = 3/2.
Las evaluaciones necesarias para coseno y seno para A 6 y B6 pueden ser obtenidas de estos va-
lores vía las fórmulas de ángulo mitad. Usando estas evaluaciones trigonométricas actualizadas,
podemos obtener los valores necesarios de coseno y seno para A 12 y B12 , etc. Use esta idea para
escribir un script que pida un número positivo δ > 10−12 y calcule un estimado de π con un error
menor que δ.
sen(5x) e− x/2
f (x) =
1 + x2
en el intervalo [−2, 3].
en el plano un conjunto finito de puntos y luego unirlos con segmentos de recta. En otras palabras,
lo que se plotea en una computadora es realmente un camino poligonal. Sin embargo, podemos “en-
gañar” nuestra vista si ploteamos una cantidad suficiente de puntos. Por ejemplo, grafiquemos la
función seno con una cantidad insuficiente de puntos. Primero construimos los puntos (x, g(x)) alma-
cenando las abscisas y ordenadas en arreglos separados:
>> x = 0:2*pi
x =
0 1 2 3 4 5 6
>> y = sin(x);
Observar que la función seno se aplica componente a componente, y por ende el arreglo y es del
mismo tamaño que x. Para plotear los puntos y unirlos con segmentos de recta usamos el comando
plot
plot(x,y);
shg; % show graph (mostrar gráfica)
El comando shg es usado para que la ventana de ploteo (titulada Figure 1), aparezca encima de
todas las ventanas abiertas (lo cual a veces no es necesario si no hay otras figuras abiertas y no hay
aplicaciones que ocupen toda la pantalla del computador). El resultado de este ploteo se muestra en
la Fig. 2.4. Respondemos el problema con el siguiente script
Podemos “embellecer” la gráfica agregando un título (comando title), etiquetas a los ejes (co-
mandos xlabel y ylabel), y eliminando franjas verticales u horizontales en donde la función no
es graficada (comando axis tight). Además, podemos hacer la línea más ancha con el comando
linewidth, así como agregar comentarios para especificar lo que hace el script y cada bloque del
código.
0.6
0.4
0.2
0
y
-0.2
-0.4
-0.6
-0.8
-1
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3
x
donde [xmin,xmax] es el rango de valores para el eje horizontal y [ymin, ymax], el rango de valores
para el eje vertical.
En esta gráfica vemos que hay un problema. Las oscilaciones de seno y coseno no se aprecian
en la gráfica. Esto se debe al rango de valores en el eje vertical. Si activamos la línea 8 (borrar el
símbolo %), obtenemos un mejor resultado. Sin embargo, si deseamos que el ancho de línea sea más
grueso, nos damos cuenta que no basta con agregar el atributo 'linewidth',2 a cada par de data
42 Fundamentos de Programación en MATLAB y Visualización Científica
(x, yi ), más bien conseguimos un error. Para aumentar el ancho de línea debemos usar el comando
plot para cada data y los comandos hold on ... hold off, como se muestra a continuación:
Existe aún un problema, suponiendo que no sabemos cómo lucen las gráficas de estas funciones,
¿cómo sabe una persona que no ha hecho el programa, cuál linea le corresponde a cada función? A
nuestra ayuda viene el comando legend. Basta agregar, después del comando hold off (línea 8), la
siguiente sentencia
legend ( ' sen ( x ) ' , ' cos ( x ) ' ,' exp ( x ) ')
Hasta aquí podemos decir que se entiende qué línea le corresponde a cada función. Pero si imprimi-
mos esta gráfica en una impresora a blanco y negro se presentaría un problema. Podemos resolver
esto si cambiamos el estilo de cada línea que es graficada. La tabla 2.6 nos brinda los comandos dis-
ponibles en M ATLAB. La primera columna hace referencia al estilo de línea, la segunda al color de
la línea, y la tercera a los marcadores (markers), los cuales son útiles de cambiar en caso estemos
ploteando data discontinua. Por ejemplo, basta cambiar las líneas 5–7 del programa anterior por
6
(en cm)
4
y
-1
0 1 2 3 4 5 6
x (en cm)
44 Fundamentos de Programación en MATLAB y Visualización Científica
Bibliografía
[1] D Xue, Y Chen, Scientific Computing with MATLAB, CRC Press, Taylor & Francis Group, Flori-
da, 2da Ed, 2016. Disponible en biblioteca.
45