Sei sulla pagina 1di 77

Universidad de Guadalajara

C.U.C.E.I.
Centro Universitario de Ciencias Exactas e
Ingenierı́as

Cómputo Cientı́fico II
Trabajo Final
Alumna: Karolina Padilla Valdez Código: 209520201
Profesor: Federico Angel Velazquez Muñoz
Índice
Capı́tulos Página

1. Introducción al curso 2
1.1. Conceptos básicos de programación . . . . . . . . . . . . . . . . . 2
1.2. Sistemas operativos . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3. Lenguajes de programación . . . . . . . . . . . . . . . . . . . . . 5

2. Evaluación y gráficas de funciones 6


2.1. Definición de variables . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2. Evaluación de una función . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Rutina Plot para graficar una función . . . . . . . . . . . . . . . 8
2.4. Definición de parámetros de un graficado . . . . . . . . . . . . . 10

3. Solución de sistemas de ecuaciones lineales y no lineales 12


3.1. Concepto de sistema de ecuaciones lineales . . . . . . . . . . . . . 12
3.2. Eliminación de Gauss-simple . . . . . . . . . . . . . . . . . . . . 15
3.3. Eliminación de Gauss-Jordan . . . . . . . . . . . . . . . . . . . . 17
3.3.1. Método de Jacobi . . . . . . . . . . . . . . . . . . . . . . 19
3.4. Eliminación de Gauss-Seidel . . . . . . . . . . . . . . . . . . . . 20

4. Métodos para encontrar raı́ces de funciones 23


4.1. Método de la Bisección . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2. Método del punto fijo . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3. Método de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . 25

5. Interpolación y aproximaciones de funciones 26


5.1. Interpolación polinomial . . . . . . . . . . . . . . . . . . . . . . . 26
5.2. Interpolación por Splines . . . . . . . . . . . . . . . . . . . . . . . 30
5.3. Serie de Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.4. Aproximación por mı́nimos cuadrados . . . . . . . . . . . . . . . 35

6. Valores singulares y factorización de matrices 39


6.1. Descomposición LU . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.2. Descomposición SVD . . . . . . . . . . . . . . . . . . . . . . . . . 42

7. Derivación e integración numérica 47


7.1. Concepto de derivada numérica. Método de derivada por diferencias 47
7.2. Concepto de integración numérica. Método del trapecio . . . . . 49
7.3. Método de Simpson . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.4. Definición de cálculo simbólico . . . . . . . . . . . . . . . . . . . 55
7.5. Ecuaciones diferenciales ordinarias . . . . . . . . . . . . . . . . . 56

8. Apéndice 58

1
1. Introducción al curso
1.1. Conceptos básicos de programación
Los problemas básicos que se resuelven gracias a la computación cientı́fica se
resuelven a base de un método especı́fico conocido como algoritmo. Los algorit-
mos son procesos ordenados e iterativos que resuelven problemas matemáticos
y computacionales a través de un código, posiblemente programado en diversos
lenguajes, que resuelve el problema y hace más sencilla la tarea para el usuario.
Puede entenderse que los algoritmos son recetas que explican paso a paso lo
que la computadora debe hacer para resolver un problema numérico. Funda-
mentalmente la explicación de los algoritmos y su uso adecuado es la base del
conocimiento que debe adquirirse para la materia de computación cientı́fica.
Los algoritmos se describen a base de diagramas de flujo, estos diagramas
tienen diversas simbologı́as que representan el algoritmo. Es la base de la cons-
trucción de un algoritmo. Siempre es recomendable entender la receta.antes de
intentar programarla.

Figura 1: Simbologı́a de diagramas de flujo

Los diagramas de flujo describen fácilmente como realizar una tarea, sin im-
portar su dificultad es posible describir el procedimiento:

2
Figura 2: Diagrama de flujo

Cuando nos acercamos a explicar estos procesos a una computadora obtene-


mos algo previo a un código en un lenguaje, es decir, antes de escribir el código
en un lenguaje deseado (Java, C++, Python, etc.,) es importante generar un
pseudocódigo . Un pseudocódigo, como el nombre lo indica es un código que
no está todavı́a escrito en un lenguaje de programación pero que pretende es-
tarlo, variando un poco la sintaxis se puede construir, ya que los lenguajes antes
mencionados tienen todos una sintaxis distinta. La sintaxis de un lenguaje de
programación es un conjunto de reglas que designan un fórmula bien formada
dentro del lenguaje, algo ası́ como las reglas gramaticales en el español.

No es igual la sintaxis de un ciclo For en Python como en Octave, algunos


lenguajes terminan siempre con un End, algunos no, otros varı́an con algunos
paréntesis, etc. Por ello, un pseudocódigo es más universal, pretende dar los
pasos necesarios a un programador antes de que este escriba el código en la
sintaxis correcta de su lenguaje.

Un pseudocodigo pretende ser entendido por un humano y no por la máquina


por ello es más sencillo de entender que un código normal. Los pseudocódigos
son considerados lenguajes de alto nivel, los cuales se caracterizan por estar
destinados al entendimiento humano, mientras que los lenguajes llamados de

3
bajo nivel son aquellos que son mejor entendidos por las máquinas que los
humanos, como Ensamblador, Fortran, C++, son considerados de bajo nivel.
Mientras que lenguajes como Octave, Basic, Pascal, son considerados de alto
nivel.

Una manera de entender los pseudocódigos y su importancia para los algo-


ritmos y la programación es planteando un problema e intentar resolverlo con
un pseudocódigo. Por ejemplo, ordenar la siguiente lista de números de mayor
a menor: (8,9,7,11,3,2,5,0).

Una manera de resolver este problema es mediante un ordenamiento por in-


serción, es decir, moviendo los números mayores cada vez más a la derecha, se
obtendrı́a la lista ordenada.

1: Set n = cantidad de números en la lista


2: for i = 1; n do
3: Paso 1
4: if elemento i + 1 > i then:
5: Cambiar lugares
6: else
7: Pasar al siguiente elemento
8: end if
9: end for

1.2. Sistemas operativos


Un sistema operativo SO se define como un Software que proporciona un
acceso sencillo y seguro al soporte fı́sico del ordenador o (hardware) ocultando
al usuario detalles de la implementación particular, actúa como intermediario
entre la computadora y el usuario. Tiene los siguientes objetivos:

Ejecutar programas del usuario


Proporcional un ambiente amigable visualmente y fácil de utilizar
Utiliza el hardware de manera eficiente

Algunos conceptos importantes son:

1. Kernel: Es el módulo central del sistema operativo, es responsable de la


administración de la memoria, de los procesos, tareas y los discos.
2. Driver: Es un programa de bajo nivel encargado de atender a un dispositivo
fı́sico, ejecutado como resultado de la invocación del sistema operativo.

4
3. Código abierto: Es una certificación estándar generada por la Open Source
Initiative (OSI), inica que el código abierto de un programa está disponible
para público general, libre de cargo (Linux, Ubuntu y sus distribuciones
son de código abierto).
Ejemplos de sistemas operativos:

UNIX: Inició en 1969 es el más antiguo SO para computadoras de escri-


torio.
LINUX: Es una versión de UNIX que es gratuita.

DOS: Creado en 1981 por IBM, no soporta multitarea ni multoprocesa-


miento.
OS/2 Warp, Windows y MAC/OS x

1.3. Lenguajes de programación


Un lenguaje de programación es un conjunto de reglas de formación de
fórmulas que permiten poder expresar procesamiento de datos y sus estructuras
en la computadora. Cada lenguaje, como se explicó anteriormente, posee su pro-
pia sintaxis, la cuál caracteriza cada uno de los lenguajes de programación. Un
ejemplo que puede aclarar las diferencias entre las sintaxis es como se escribe
un ”¡Hello world!ü ”¡Hola mundo!.en cada lenguaje:

Python: print (hello world!)


Perl: print: ”Hello world!\ n”:

Lisp: ”Hello world!”


Los programadores escriben instrucciones en diversos lenguajes de programa-
ción. La computadora puede entender directamente algunos de ellos pero otros
requieren pasos de traducción intermedios. La siguiente es una posible clasifica-
ción de los lenguajes de programación:

Lenguajes desarrollados para el cálculo numérico (Fortran, Mathematica,


Matlab, Python, etc.).
Lenguajes para sistemas como C, C++, ensamblador, Java, JavaScript,
etc.
Lenguajes para aplicaciones de inteligencia artificial como Prolog y Lisp.
Lenguajes para el cálculo simbólico como Maple, Maxima, WolframAlpha,
etc.

5
Anteriormente se mencionó que existe la clasificación de lenguajes de progra-
mación como de alto o bajo nivel, esta también es una clasificación pero con-
siderando el tipo de instrucciones que puede codificar el lenguaje. Existen el
lenguaje de bajo nivel o lenguaje máquina, y el lenguaje de alto nivel1 .

1. Lenguaje máquina (binario): Una computadora sólo puede entender este


tipo de lenguajes, con él se le habla directamente a la computadora a
realizar sus funciones fundamentales de una a una, dicho lenguaje es muy
difı́cil de manejar para una persona porque trabaja sólo con números que
están en formato binario.
2. Lenguaje de bajo nivel (ensamblador) Este lenguaje representa acciones
del ordenador mediante pequeñas abreviaturas de palabras en inglés.

3. Lenguajes de alto nivel: en este tipo de lenguajes se puede escribir en


un sólo enunciado tareas sustanciales. Los lenguajes de alto nivel permi-
ten a los programadores escribir instrucciones que se asemejan al inglés
cotidiano y contiene nociones matemáticas de uso común.

2. Evaluación y gráficas de funciones


2.1. Definición de variables
Definir variables es la parte más importante para resolver un problema fı́sico
o matemático. Si se definen las variables entonces es posible entender como re-
solver el problema, incluso determinar si se puede dar solución al problema con
las variables que se tienen. Una caracterı́stica muy importante de los lenguajes
de programación es que trabajan con variables, ası́ como los seres humanos, para
resolver los problemas computacionales. No es posible pedirle a una computado-
ra que resuelva un ciclo For desde i=0:n si no se ha definido la variable n. Y
ası́ con todas las variables que se involucren en un problema. Las variables se
pueden designar con el nombre que sea conveniente o que convenga según la
literatura de referencia, estas almacenan un valor que puede o no cambiar du-
rante la ejecución de un programa.

Existen diversos tipos de variables2 , en Python los más básicos son:

Enteros o INT: Son valores numéricos que se asignan a cualquier nombre


de variable.

Decimales o FLOAT: Son valores numéricos que contienen decimales.


1 Véase:http://www.iqcelaya.itc.mx/~vicente/Programacion/Lenguajes.pdf
2 En esta sección el autor se limita a señalar los tipos de variables de Python ya que este
trabajo está pensado para desarrollar programas en este lenguaje

6
Valor muy largo o LONG: Son valores numéricos muy largos.
Caracter o ”STRING”: A menudo se utilizan las palabras o cadenas de
carácteres para designar una función en la que el usuario interactúa con
el programa, para ello las variables de tipo string ayudan a hacer más
amigable la interacción
Arreglo o .ARRAY”: Se utiliza para crear arreglos de números o variables
numéricas, ası́ como matrices, vectores o tensores.
Lista o ”LIST”: Son similares a los arrays, en su forma, sin embargo las
variables tipo List pueden relacionarse con otras sublist y con ellas crear
diccionarios o apéndices. Usualmente no son de carácter numérico.
Simbólico o ”SYM”: Se utilizan cuando es necesario hacer un cálculo
simbólico u obtener la expresión para un problema, es decir, no se busca
el resultado numérico sino la expresión simbólica.
Booleano o ”BOOLEAN”: Los booleanos son variables lógicas que sólo
arrojan dos valores: verdadero o false (TRUE o FALSE) ellas se utilizan
para condicionales If, y crear estas rutinas para cuando se cumple cierta
condición.

2.2. Evaluación de una función


Todos los lenguajes de programación contienen ciertas funciones predeter-
minadas o ”built-in functions”las cuales pueden ser utilizadas para construir
funciones cada vez más complejas. Cuando un código es creado en un lenguaje
de programación y este código es muy largo puede ser mejor si en lugar de crear
un sólo código este se separa en diversas subrutinas las cuales están consti-
tuidas por funciones especı́ficas que cumplen una parte especı́fica de la tarea
completa. Cuando una función se ejecuta de esta manera se dice que manda-
mos llamar a la función o invocamos la función para que evalue nuestros datos3 .

Lo primero que es necesario tomar en cuenta es la definición de funciones. Las


funciones más comunes para los métodos numéricos son aquellas que devuelven
un valor, un valor deseado. Por ejemplo, una forma sencilla de definir una fun-
ción es con el comando def :

1: def ecuación(x):
2: return x3 + x2 + 2

De tal manera se define la función que se ha llamado ecuación. La palabra def


es abreviatura para ((define)) y return para ((devuelve)) en inglés. Ası́ cuando se
mande llamar la función se obtendra el resultado para el valor introducido. Si
3 Véase: http://www.fc.uaem.mx/~bruno/material/python.pdf

7
utilizamos por ejemplo, la función evaluada en 2:

1: def ecuación(x):
2: return x3 + x2 + 2
3: Print ecuación (2)
4: 14

2.3. Rutina Plot para graficar una función


En un artı́culo cientı́fico normalmente nos encontramos con una sección de
resultados en la cuál se exponen las gráficas que relacionan dos o más varia-
bles de distintas maneras. Si queremos hacer uso de las gráficas en un artı́culo
cientı́fico siempre es importante saber cuál es la forma más correcta de presentar
dicho gráfico. Supongamos que es necesario presentar una gráfica de la posición
con respecto al tiempo, se conocen 10 valores de la posición en sus respectivos
tiempos:

Posición en x en metros: (1,4,9,16,25,36,49,64,81,100).


Tiempo t en segundos: (1,2,3,4,5,6,7,8,9,10).

Es necesario preguntarse ¿cuál variable es la dependiente y cuál es la indepen-


diente?, sabemos que que el tiempo transcurre continuamente y su transcurso
no depende de la posición de nada, por ello t es la variable independiente y x es
la variable dependiente, se dice que la posición x depende de t o que x = x(t).
Nosotros fácilmente podemos graficar estos puntos uno a uno utilizando los co-
mandos de python:

import matplotlib.pyplot as plt


import numpy as np

t=np.array([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])
x=np.array([1,4,9,16,25,36,49,64,81,100])

plt.plot(t,x)

plt.show()

Dando como resultado la siguiente gráfica:

8
Figura 3: Gráfica usando comando plot

Sin embargo esta figura no explica cuál es la variable dependiente ni la in-


dependiente, no explica el fenómeno, para mejorar estas especificaciones de la
gráfica podemos hacer lo siguiente:

import matplotlib.pyplot as plt


import numpy as np

t=np.array([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])
x=np.array([1,4,9,16,25,36,49,64,81,100])

plt.plot(t,x)
plt.xlabel('time (s)')
plt.ylabel('posicion (m)')
plt.title('Grafica de posicion con respecto del tiempo')
plt.grid(True)

plt.show()

Se obtiene una figura mejor diseñada y con mejor explicación de los datos
que están siendo mostrados:

9
Figura 4: Gráfica mejorada

2.4. Definición de parámetros de un graficado


Realmente, el ejemplo de gráfica mostrado es bastante simple, no se han he-
cho modificaciones importantes al estilo de la gráfica. Sin embargo, sabemos que
Matplotlib es probablemente el paquete de Python más utilizado para gráficos
2D, proporciona una manera rápida de visualizar datos y figuras con calidad de
publicación en varios formatos4 .

En el siguiente código se utilizan otras variaciones de parámetros para las gráfi-


cas, como el color, el grosor y el estilo de las lineas5 .

import matplotlib.pyplot as plt


import numpy as np

t1=np.array([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])
x1=np.array([1,4,9,16,25,36,49,64,81,100])

t2=([1,2,3,4,5,6,7,8,9,10])
x2=([1,2,3,4,5,6,7,8,9,10])
4 Para más información acerca de como variar los parámetros más importantes consul-

te la página: https://claudiovz.github.io/scipy-lecture-notes-ES/intro/matplotlib/
matplotlib.html
5 Veáse: https://matplotlib.org/gallery/index.html

10
#Cambiar color, grosor y estilo de la lı́nea
plt.plot(t1,x1, color="green", linewidth=2.0, linestyle="--")
plt.plot(t2,x2, color="pink",linewidth=2.5, linestyle="-")

plt.xlabel('time (s)')
plt.ylabel('posicion (m)')
plt.title('Grafica de posicion con respecto del tiempo')
#Usar red
plt.grid(True)
#Mostrar imagen
plt.show()

Se obtiene la siguiente gráfica:

Figura 5: Parámetros variados

Es posible configurar las etiquetas de cada una de las gráficas añadiendo al


plot el nombre de la etiqueta:

#Cambiar color, grosor y estilo de la lı́nea


plt.plot(t1,x1, color="green", linewidth=2.0, linestyle="--", label="Cuerpo 1")
plt.plot(t2,x2, color="pink",linewidth=2.5, linestyle="-", label="Cuerpo 2")
#Agregar comando para localizar las etiquetas
plt.legend(loc="upper left")

11
Se obtiene el siguiente gráfico:

Figura 6: Agregar etiquetas

3. Solución de sistemas de ecuaciones lineales y


no lineales
3.1. Concepto de sistema de ecuaciones lineales
Se llama ecuación lineal a aquella que tiene la forma de un polinomio de
primer grado, es decir, que las incógnitas no están elevadas a potencias, ni mul-
tiplicadas entre sı́, es decir, se trata de una combinación lineal de las incógnitas,
por ejemplo 3x + 5y − 5z = 0, es una ecuación lineal de tres incógnitas. Si una
ecuación lineal tiene 3 incógnitas, su representación es una lı́nea en el plano, si
tiene 3 es un plano en el espacio.

Un sistema de ecuaciones lineales es un conjunto de varias ecuaciones linea-


les. Se dice que dos ecuaciones son equivalentes si tienen las mismas soluciones
o tienen la misma representación geométrica en el plano.

Definición: Sistemas de ecuaciones lineales6 .

Un sistema de ecuaciones lineales es un conjunto de ecuaciones con la siguiente


6 Véase: http://sauce.pntic.mec.es/~jpeo0002/Archivos/PDF/T07.pdf

12
forma:
 
a00 x0 + a01 x1 + a02 x2 + · · · + a0n xn = b1
 a10 x0 + a11 x1 + a12 x2 + · · · + a1n xn = b2 
 
 ··· ··· ··· 
am0 x0 + am1 x1 + am2 x2 + · · · + amn xn = bm
En este caso se tiene un sistema con m ecuaciones y n incógnitas. Los números
reales aij se llaman coeficientes y los elementos xi se denominan incógnitas y
bj se denominan términos independientes.

Resolver el sistema consiste en calcular las incógnitas para que se cumplan


TODAS las ecuaciones del sistema simultáneamente. Diremos que dos siste-
mas son equivalentes cuando tienen las mismas soluciones.

En muchas ocasiones las parte más importante computacionalmente para resol-


ver sistemas de ecuaciones lineales, consiste en armar una expresión matricial
del sistema, de manera que cualquier sistema se puede expresar como una ecua-
ción Ax = b, donde A es la matriz de coeficientes aij :
 
a00 a01 a02 ··· a0n
 a10
 a11 a12 ··· a1n 
 ··· ··· ··· ··· ··· 
am0 am1 am2 ··· amn
x es el vector de incógnitas:
 
x1

 x2 


 x3 

 ··· 
xn
Y finalmente el vector de soluciones bj :
 
b1
 b2 
 
 ··· 
bn
La matriz formada por A y B se conoce como matriz ampliada y se representa
como (A|B):
 
a00 a01 a02 a03 ··· a0n b1
 a10 a11 a12 a13 ··· a1n b2 
(A|B) = 
 ···

··· ··· ··· ··· ··· ··· 
am0 am1 am2 am3 ··· amn bm

13
Ejemplo:
Se tiene el siguiente sistema:

x+y−z =5
x+y =7
2x + 2y − z = 12

Escrito matricialmente es:


    
1 1 −1 x 5
 1 1 0  y  =  7 
2 2 −1 z 12

Donde la matriz ampliada es:


 
1 1 −1 5
(A|B) =  1 1 0 7 
2 2 −1 12
Se dice que existen dos tipos de sistemas cuando se buscan soluciones en los
reales R. Dependiendo del posible número de tales soluciones reales que tenga
un sistema se puede clasificar como:

1. Incompatibles: que no tienen solución

2. Compatibles: que tienen solución


a) Determinados: que tienen una solución única.
b) Indeterminados: que tienen infinitas soluciones.
La forma de solucionar estos sistemas puede ser sencilla, sobre todo si el núme-
ro de ecuaciones es igual al número de incógnitas. Existen varios métodos de
solución:

Reducción
Igualación

Sustitución
En lo sucesivo veremos algunos métodos de resolución y las implicaciones compu-
tacionales que tienen.

14
3.2. Eliminación de Gauss-simple
La solución de sistemas de ecuaciones lineales es el problema central del
álgebra lineal7 . Es posible evaluar los sistemas de resolución respecto a su coste
computacional. Muchos probelas de Ingenierı́a o Matemática Aplicada se redu-
cen a resolver un sistema de ecuaciones lineales. De aquı́ la importancia de estos
y el interés de sus métodos de resolución. La mayorı́a de los métodos directos de
resolución tienen su origen en el algoritmo de Gauss y algunas de sus variaciones.

El método de Gauss consiste en tranformar el sistema dado:

A.x = b
en otro equivalente
U.x = c
en el que la matriz U es triangular superior.

Ejemplo:
Sea el sistema :

2x + y + z = 1
4x + y = −2
−2x + 2y + z = 7

Construimos la matriz ampliada:


 
2 1 1 1
 4 1 0 −2 
−2 2 1 7
Multiplicamos la primera fila por -2 y se la restamos a la segunda y escribimos
este resultado en la segunda fila, con lo cual se reduce la matriz, repetimos esto
hasta tener sólo ceros debajo del primer elemento de la primera fila:
   
2 1 1 1 2 1 1 1
 4 1 0 −2  .f2 − 2f1 → f2 =  0 −1 −2 −4 
−2 2 1 7 −2 2 1 7
   
2 1 1 1 2 1 1 1
 0 −1 −2 −4  .f3 + f1 → f3 =  0 −1 −2 −4 
−2 2 1 7 0 3 2 8
7 ALMEIDA, B. PEDRO., FRANCO B. JOSÉ. ”Eliminación gaussiana para sistemas de

ecuaciones lineales”. Educación Matemática. Vol. 10. No. I. Abril 1990. Universidad de la
Laguna. Recuperado en: http: // www. revista-educacion-matematica. org. mx/ descargas/
Vol10/ 1/ 08Almeida. pdf

15
Ahora continuamos con la segunda fila y utilizamos el primer elemento distinto
de cero como pivote, para eliminar los elementos debajo de esta columna:
   
2 1 1 1 2 1 1 1
 0 −1 −2 −4  .f3 + 3f2 → f3 =  0 −1 −2 −4 
0 3 2 8 0 0 −4 −4
Esto corresponde a la ecuación U x = c a partir de aquı́ se completa el método
haciendo una sustitución hacia atrás de los valores correspondientes:
Es necesario volver a las incógnitas correspondientes

2x + y + z = 1
−y − 2z = −4
−4z = −4

De donde es posible concluir que:

z=1
Sustituyendo en la ecuación anterior:

−y − 2(1) = −4

Por lo que:

y=2
Donde finalmente sustituimos en la última ecuación:

2x + 2 + 1 = 1

Por lo que:
x = −1
La matriz que se obtiene U es una matriz reducida o escalonada la cual sólo
contiene ceros en la diagonal principal. En términos computacionales llevar a
cabo una tarea como la eliminación gaussiana resulta convenientemente sencillo,
el algoritmo consta de dos partes esenciales:

Pivoteo: el cual consiste en formar la matriz escalonada, a partir del ele-


mento pivote de cada una de las columnas.
Sustitución hacia atrás: el cual consiste en utilizar el último elemento de
las filas y sustituir su valor en las filas de arriba.

16
Con estos dos procedimientos finalmente se obtiene el vector resultado c.
Pseudocódigo para la reducción de la matriz aumentada:

1: Set n
2: for 0:n do:
3: for i+1,n do:
4: P=A[i,k]/A[j,j]
5: b[j]+=-P*b[i]
6: for k do 0:n:
7: A[j,k]+=-P*A[i,k]
8: end for
9: end for
10: end for

Cuando se obtiene la matriz reducida se continua con el segundo paso para


obtener los valores de cada variable. En este caso el pseudocódigo es el siguiente:

1: Set n
2: for n-2:-1:-1 do:
3: suma=0
4: for 0,n do:
5: suma+=matrix[i,j]*x[j]
6: end for
7: end for

3.3. Eliminación de Gauss-Jordan


Cuando se resuelve un sistema de ecuaciones por reducción gaussiana, el
proceso que corresponde a la sustitución hacia atrás tambien puede ser realiza-
do haciendo más operaciones elementales, hasta obtener un sistema equivalente
cuya solución resulte evidente.

En este caso, la forma que debemos buscar a la matriz aumentada del siste-
ma es la denominada forma escalonada reducida, definida a continuación y el
método de solución de sistemas resultante se conoce como método de Gauss-
Jordan.

Una matriz escalonada reducida es una matriz A, que todos los elemen-
tos debajo de la diagonal principal son ceros, los de la diagonal principal son 1,
mientras que el resto de los elementos pueden ser cualesquiera números reales8 .
8 Véase: http://oldemarrodriguez.com/yahoo_site_admin/assets/docs/libro_algebra_

lineal_Version_Oficial.220123048.pdf

17
Retomando el ejemplo anterior podemos obtener la siguiente reducción:

Primero dividimos todas las filas de maneras respectivas para hacer 1’s todos
los elementos de la diagonal principal:

1 12 1 1
   
2 1 1 1
 0 −1 −2 −4  f1 1 → f1 =  0 −1 −2 −4 
2 2

2
0 0 −4 −4 0 0 −4 −4
1 12 1 1
1 12 1 1
   
2 2 2 2
 0 −1 −2 −4  f2 (−1) → f2 =  0 1 2 4 
0 0 −4 −4 0 0 −4 −4
1 12 1 1
1 21 12 12
   
2 2 1
 0 1 2 4  f3 (− ) → f3 =  0 1 2 4 
4
0 0 −4 −4 0 0 1 1

Después se hace la reducción de cada columna, donde el objetivo es que cada


una de los 1’s de la diagonal principal tengan solo ceros por arriba de ellos:

1 12 12 12 1 0 − 12 − 32
   
 0 1 2 4  f1 − 1 f2 → f1 =  0 1 2 4 
2
0 0 1 1 0 0 1 1
1 0 − 12 − 32
   
1 0 0 −1
1
 0 1 2 4  f1 + f3 → f1 =  0 1 2 4 
2
0 0 1 1 0 0 1 1
   
1 0 0 −1 1 0 0 −1
 0 1 2 4  f2 − 2f3 → f2 =  0 1 0 2 
0 0 1 1 0 0 1 1
De donde finalmente se obtiene que:

z=1 y=2 x = −1

Cuyo resultado es el mismo que se obtuvo para el método de eliminación gaus-


siana tradicional. A continuación se muestra el pseudocódigo de este método9 :

9 Cf. http://calculo-numerico-ujap.blogspot.com/2014/07/
algoritmo-de-gauss-jordan.html

18
1: input n,(aij )
2: for k=1:n:1 do:
3: for i=k+1,k+2,...,n do:
4: z ← aik /akk
5: aik ← 0
6: for j=k+1,k+2,..., do:
7: aij ← aij − zakj
8: end for
9: end for
10: end for
11: output(aij )

3.3.1. Método de Jacobi


El método de Jacobi asume una matriz:

 
a11 x1 +a12 x2 +··· a1n xn = b1
 a21 x1 +a22 x2 +··· a2n xn = b2 

 ···
 (1)
··· ··· ··· ··· 
an1 x1 an1 x2 +··· ann xn = bn

La cual tiene una solución única y además los coeficientes de la matriz A no


tienen ceros en la diagonal principal.
El método de Jacobi consiste en un método iterativo que utiliza un vector solu-
ción de ceros, con los cuales empieza a sustituir en el resto de los valores de x,
es decir:

1
x1 = − a12 x2 − a13 x3 − · · · a1n xn
a11 (b1
1
x2 = − a21 x1 − a23 x3 − · · · a2n xn
a22 (b2 (2)
···
1
xn = ann (bn − an1 x1 − an2 x2 − · · · ann−1 xn−1

(0) (0) (0) (0)


Tomando como vector inicial de soluciones x(0) = (x1 , x2 , x3 , ..., xn ). Sus-
tituyendo estos valores a la derecha de cada ecuación obtenemos la primera
(1) (1) (1) (1)
aproximación del vector solución, (x1 , x2 , x3 , ..., xn ) Con ello se habrı́a rea-
lizado la primera iteración. De igual manera se obtiene la segunda aproximación
(2) (2) (2) (2)
(x1 , x2 , x3 , ..., xn ) sustituyendo los valores de la primera aproximación del
vector solución en el lado derecho de las ecuaciones.
(k) (k) (k) (k)
Con k iteraciones se obtiene x(k) = (x1 , x2 , x3 , ..., xn ), donde k es un núme-
(k)
ro natural. Para cada k≥1 los componentes xi de xk vienen desde xk−1 :

19
 
(k+1) 1  X (k)
xi = bi − aij xj  (3)
aii
j6=i

Para cada i = 1, 2, 3...n.

3.4. Eliminación de Gauss-Seidel


El método de Gauss-Seidel es un método iterativo, a diferencia de los dos
métodos anteriores, el hecho de que sea un método iterativo implica que la so-
lución del problema será cada vez más acercada a la solución real conforme se
repita el proceso. Un método iterativo se aplica recursivamente hasta encon-
trar una solución adecuada con un error considerablemente pequeño, y con esto
señalamos otra diferencia, este método contendrá un error en la solución obte-
nida10 .

En cada iteración obtenemos una solución posible del sistema con un error
determinado, a medida que aplicamos nuevamente el método, la solución puede
ser más precisa, entonces se dice que el sistema converge, pero si al aplicar el
método reiteradas veces la solución tiene siempre un error cada vez mayor se
dice que el sistema no converge y no se puede resolver el sistema de ecuaciones
por este método.

Recordemos el sistema de ecuaciones Ax = b:

a11 x1 + a12 x2 + · · · + a1n xn = b1


a21 x1 + a22 x2 + · · · + a2n xn = b2
.. .. ..
. . .
an1 x1 + an2 x2 + · · · + ann xn = bn
Despejamos de la ecuación 1 la incógnita x1 , de la ecuación 2 la incógnita x2 ,...,
de la ecuación n la incógnita xn :

b1 − a22 x2 − · · · − a1n xn
x1 =
a11
b2 − a21 x1 − · · · − a2n xn
x2 =
a22
···
bn − an1 x1 − · · · − ann−1 xn−1
xn =
ann
Desde la fórmula anterior resultan las fórmulas que se deberán ir aplicando en
las diferentes iteraciones. Para comenzar a aplicar el método debemos asignar
10 Cf. http://www.paginaspersonales.unam.mx/files/977/Metodo_Gauss_Seidel.pdf

20
un valor arbitrario a las variables x2 , ..., xn con el fin de obtener x1 . Lo más
conveniente en este caso es que los valores comiencen en cero, lo cual nos facili-
tarı́a el trabajo ya que se reduce al cálculo de las primeras soluciones, entonces
de esto resulta que:
b1
x1 =
a11
Ahora despejamos x2 de la ecuación 2 y reemplazamos x1 por el valor obtenido
de la ecuación anterior, de esto nos queda:

b2 − a21 ( ab11
1
)
x2 =
a22
Una vez que tenemos x2 , despejamos x3 y ası́ sucesivamente con las n ecuacio-
nes, cada vez asignando el valor obtenido de la incógnita anterior.

Cuando se han despejado las xn incógnitas, tenemos la primera iteración del


(k) (k) (k) (k)
método.Con k iteraciones se obtiene x(k) = (x1 , x2 , x3 , ..., xn ), donde k es
(k)
un número natural. Para cada k≥1 los componentes xi de xk vienen desde
k−1
x :

 
(k+1) 1  X (k+1)
X (k)
xi = − a : ijxj − aij xj + bi  (4)
aii
1≤j≤i i+1≤j≤n

Para cada i = 1, 2, 3...n.

Ejemplo Se tiene el sistema:


 
x + 2y = 1
x − 4y = 0
Con las condiciones iniciales x(0) = 0, y (0) = 0. Se obtiene que la primera itera-
ción es:

1 − 2y (0)
x(1) =
5
1
=
5
0 − x(0)
y (1) =
−4
=0

21
1
Ahora tomamos como condición inicial x(1) = 5 y y (1) = 0:

1 − 2y (1)
x(2) =
5
1
=
5
0 − 51
y (2) =
−4
1
=
20
Repetimos el proceso:

1 − 2y (2)
x(3) =
5
9
=
50
0 − x(2)
y (3) =
−4
1
=
20
Podemos notar que si sustituimos estos valores en las ecuaciones obtenemos que
la primera ecuación se satisface, mientras que la segunda se satisface por un
orden de 10−2 , la condición de paro puede depender ya sea de un δ donde el
error  satisface la condición de que || ≤ δ.

Podemos también proponer como condición de paro una cantidad n de ite-


raciones, pero dicho método no es tan efectivo ya que esto no garantiza ninguna
efectividad en el método.

A continuación se presenta pseudocódigo de este método11 :

11 Cf. https://www.cimat.mx/~alram/met_num/clases/clase08b.pdf

22
1: Input,número de ecuaciones desconocidas; las entradas aij de la matriz, ,
(0)
el vector bi , los valores iniciales de las incógnitas xi , la tolerancia TOL;
máximo número de iteraciones N
2: Set k=1
3: while k ≤ N do:
4: for i = 1, ..., n do:
Pi−1 (0)
aij xj − n
P
− j=1 j=i+1 j aij x +bi
5: set xi = aii
6: end for
7: if ||x − x(0) || ≤ T OL then: OUTPUT (x1 , ..., xn );
8: STOP
9: Set k = k + 1
10: end if
11: for i = 1, ..., n do:
(0)
12: Set xi = xi
13: end for
14: OUTPUT
15: STOP

4. Métodos para encontrar raı́ces de funciones


4.1. Método de la Bisección
Una de las técnicas más básicas para encontrar raı́ces es el método de la
bisección, el cuál está basado en el teorema del valor medio. El método de la
bisección se aplica cuando se tiene una función f que es continúa en un intervalo
[a,b], en el cual la función evaluada en a f (a) y la misma función evaluada en
b f (b) tienen signos opuestos. Lo que significa que esta función tiene una raı́z
entre estos dos valores. El método está basado en subdividir el intervalo a la
mitad y en cada mitad encontrar un punto p, el cual se acerca a la raı́z de la
función:

1. El primer paso es tomar a1 = a y b1 = b, p1 será el punto medio entre [a,b]:


b1 − a1 a1 + b1
p1 = a1 + =
2 2
2. Si f (p1 ) = 0, entonces, la raı́z p = p1 , y el proceso acaba.
3. Si f (p1 ) 6= 0, entonces f (p1 ) tiene el mismo signo de f (a1 ) o f (b1 )
a) Si f (p1 ) y f (a1 ) tienen el mismo signo, entonces, p ∈ (p1 , b1 ). Se toma
a2 = p1 y b2 = b1 .
b) Si f (p1 ) y f (b1 ) tienen el mismo signo, entonces, p ∈ (a1 , p1 ). Se toma
a2 = a1 y b2 = p1 .

23
4. Se continúa el mismo proceso hasta encontrar la raı́z.
El algoritmo necesitará como entradas; el intervalo, es decir, los valores de a y
b, y los valores de la función evaluada en los extremos del intervalo, f(a) y f(b),
más una tolerancia con la cual nos aproximemos a la raı́z. O bien, un número
máxima de iteraciones con las cuales podamos detener el proceso sino es posible
determinar la raı́z con la exactitud deseada.
A continuación se presenta el pseudocódigo del algoritmo:

1: INPUT intervalo [a,b]; tolerancia TOL, número máximo de iteraciones N0


2: OUTPUT Raı́z de la función p
3: Paso 1 Set i=1; FA=f(a)
4: Paso 2
5: while i ≤ N0 do:
6: Paso 3 Set p = a + (b − a)/2; F P = f (p).
7: Paso 4
8: if F P = 0 o (b − a)/2 ¡TOL then
9: OUTPUT (p);
10: STOP
11: Paso 5 Set i=i+1
12: Paso 6
13: if FA* FP ¿0 then set a=p;
14: FA=FP
15: elseSet b=p
16: OUTPUT FAILURE
17: STOP

4.2. Método del punto fijo


El ”punto fijo”de una función es un número en el cual la función evaluada
arroja ese mismo número:

g(p) = p
Encontrar raı́ces de una función y encontrar los puntos fijos son problemas se-
mejantes, definiendo las raı́ces de una función es posible determinar los puntos
fijos de esta con una manipulación de la función, es decir, sea f (p) = 0 la raı́z
de una función, entonces un punto fijo de esta se encuentra:

g(x) = x − f (x)
De igual manera, si la función g tiene un punto fijo en p, entonces la función:

f (x) = x − g(x)
tiene un zero en p.
Por ejemplo, se puede determinar el punto fijo de la ecuación:

24
g(x) = x2 − 2
Utilizando la definición de punto fijo se obtiene:

p = g(p) = p2 − 2
0 = p2 − p − 2
= (p + 1)(p − 2)
Los puntos fijos son p = −1 y p = 2.

A continuación se presenta el pseudocódigo para la iteración del punto fijo:


1: INPUT Aproximación inicial p0 ; tolerancia TOL; máximo número de itera-
ciones.
2: OUTPUT Solución aproximada p, o failure.
3: Paso 1 Set i = 1
4: Paso 2
5: while i ≤ N0 do:
6: Pasos 3-6
7:
8: Paso 3 Set p = g(p0 )
9: Paso 4
10: if |p − p0 | < T OL then: OUTPUT (P);
11: STOP
12: Paso 5 Set i = i + 1
13: Paso 6 Set p0 = p
14: Paso 7 Failure: STOP

4.3. Método de Newton


El método de Newton es un método numérico capaz de resolver ecuaciones
del tipo f (x) = 0. Este método se origina en las expansiones de Taylor de una
función f(x) en el punto x1 :

(x − x1 )2 f 00 (x1
f (x) = f (x1 ) + (x − x1 )f 0 (x1 ) + + ··· (5)
2!
donde f, y su primera y segunda derivada, f’ y f” son calculadas en x1 si to-
mamos los primeros dos terminos de la serie de Taylore obtenemos la siguiente
expansión:

f (x) ≈ f (x1 ) + (x − x1 )f 0 (x1 ) (6)


Cuando evaluamos esta ecuación en cero (f(x)=0) para encontrar la raı́z de la
ecuación nos da:

f (x) = f (x1 ) + (x − x1 )f 0 (x1 ) (7)

25
Reacomodando los términos para obtener la siguiente aproximación a la raı́z
obtenemos:

f (x1 )
x = x2 = x1 − (8)
f 0 (x1 )

Es posible generalizar el algoritmo:

f (xi )
xi = xi − (9)
f 0 (xi )

donde xi → x̄ cuando i → ∞ y x̄ es la aproximación a la raı́z de la función f(x).


Cuando las iteraciones comienzan a repetir los mismos valores, es decir, xi =
xi+1 = x̄ esto indica que f(X) converge a x̄. Por lo que xi es la raı́z de la función
f(x).
Sin embargo, este procedimiento sólo puede ser utilizado para resolver ecuacio-
nes no lineales de una sola variable. Por ello habrá que contemplar un cambio
para el método iterativo. Si expresamos este método como una matriz a la que
le corresponde un vector obtenemos:

x(k) = x(k−1) − J(x(k−1) )−1 F(x(k−1) ) (10)

donde k=1,2,3...n representa las iteraciones, x ∈ Rn , F es el vector función, y


J(x−1 ) es la inversa de la matriz Jacobiana.

5. Interpolación y aproximaciones de funciones


5.1. Interpolación polinomial
Una interpolación consiste en averiguar un valor aproximado de una mag-
nitud en un intervalo cuando se conocen algunos de los valores que toma a uno
y otro lado de dicho intervalo, y no se conoce la variación de la magnitud.

Supóngase que se tienen los siguiente puntos:

26
Figura 7: Interpolación

Una interpolación podrı́a ser la siguiente:

Figura 8: Interpolación

Es posible, para algunos tipos de datos, encontrar interpolaciones únicas.


Este método se conoce como método de polinomio de interpolación úni-
co12 .

Se supone que se tiene (n + 1) pares de datos (x0 , y0 ), (x1 , y1 ), · · · , (xn , yn )


representando (n + 1) puntos de la gráfica de una función y = f (x), cuya forma
explı́cita no se conoce. Las xi , i = 0, · · · , n se asumen con valores distintos, es
decir, la función es continua.

El polinomio que se va a encontrar debe satisfacer las siguientes restricciones:


12 Cf. https://www.ugr.es/~mpasadas/ftp/Inter2.pdf

27
Pn (xi ) = yi i = 0, · · · , n

Asumiendo un polinomio Pn de la siguiente forma:

Pn (x) = a0 + a1 x + a2 x2 + · · · + an xn
Al tener que cumplir con las restricciones, se generan (n + 1) ecuaciones en
(n + 1) incógnitas; siendo éstas los coeficientes ai :

a0 + a1 x0 + a2 x20 + a3 x30 + · · · + an xn0 = y0


a0 + a1 x1 + a2 x21 + a3 x31 + · · · + an xn1 = y1
.. ..
. = .
a0 + a1 xn + a2 x2n + a3 x3n + · · · + an xnn = yn

que en su forma matricial:


 a  y 
x20 xn0

1 x0 ··· 0 0
n   a1   y1 
1 x1 x21 ··· x1     
  a2   y2 
1 x2 x22 ··· xn2 
 = 
 . .
 ···  ..   .. 
1 xn x2n ··· xnn an yn
Por lo que xA = y, entonces, la ecuación que debe resolverse es A = yx−1 .
Obteniendo ası́ el vector solución de A.

Algoritmo de interpolación de un único polinomio:

1: INPUT: n (grado del polinomio), (x0 , x1 , · · · , xn+1 ), (y0 , y1 , · · · , yn )


2: OUTPUT: Vector de coeficientes (a0 , a1 , · · · , an )
3: Paso 1: Construir matriz de Vandermonde
4: for i = 0; n + 1 do
5: for j = 0, n + 1 do Vi,j = xi ∗ ∗j
6: end for
7: end for
8: Paso 2: Resolver A = yx−1
9: OUTPUT: Vector A =0
El polinomio de interpolación de lagrange tiene las mismas condiciones que
el método del polinomio único; sin embargo, la forma del polinomio cambia13 :

Pn (x) = y0 b0 (x) + y1 b1 (x) + · · · + yn bn (x)


donde bk (x) es un polinomio de grado n. El polinomio Pn (x) cumple con las
siguientes restricciones:
13 Cf.http://www.mty.itesm.mx/dtie/deptos/cb/cb00854-1/Apuntes/HMA/MNIeI.pdf

28
Pn (xi ) = yi i = 0, · · · , n

Si desarrollamos el polinomio Pn (xi ) tenemos:

y0 b0 (xi ) + y1 b1 xi + y2 b2 (xi ) + · · · + yn bn (xi ) = yi


generando (n+1) ecuaciones:

y0 b0 (x0 ) + y1 b1 (x0 ) + y2 b2 (x0 ) + · · · + yn bn (x0 ) = y0


y0 b0 (x1 ) + y1 b1 (x1 ) + y2 b2 (x1 ) + · · · + yn bn (x1 ) = y1
.. ..
. = .
y0 b0 (xn ) + y1 b1 (xn ) + y2 b2 (xn ) + · · · + yn bn (xn ) = yn

Finalmente se puede obtener la forma general cuando se trata del polinomio


de un grado:
xi − xi+1 xi+1 − xi
P1 (xi ) = yi + yi+1
xi − xi+1 xi+1 − xi
Los términos:

Pn (xi ) = yi Pn (xi+1 ) = yi+1

Se llaman multiplicadores de Lagrange.


La forma general es:

N −1 N
Y x − xi X
Li = Pn (x) = Li yi
xi − xj i=1
j=1,j6=i

Donde n = N − 1 y N = No de datos, la x sin ı́ndice es la x que se busca evaluar


en dicho punto.

Algoritmo para la interpolación de Lagrange:

29
1: INPUT: k(grado del polinomio), (x0 , x1 , · · · , xN ), (y0 , y1 , · · · , yN ),
n(número que se busca interpolar
2: OUTPUT: Resultado de interpolación
3: for i = 0, N do:
4: SET:(product = 1):
5: for j = 0, N do:
6: if j 6= i then:
7: product = (m − xj )/(xi − xj )
8: end if
9: end for
10: end for
11: Li = product
12: Suma = Li yi
13: OUTPUT: Resultado para m

5.2. Interpolación por Splines


El objetivo de este método es el de colocar un polinomio de grado 3 en cada
intervalo de datos, cumpliendo con las siguientes condiciones:

1. Debe haber certeza de que yi = f (xi ).


2. xi es menor que xi+1 → No se permite que haya dos xi iguales.

Figura 9: Splines cúbicos

Sea Pi (x) el polinomio de aproximación de la verdadera relación f (x), en el


intervalo (xi , yi ) (xi+1 , yi+1 ), se tienen las siguientes restricciones:

Pi (xi+1 ) = Pi+1 (xi+1 ), condición de que los polinomios se unan.


P0i (xi+1 ) = P0i+1 (xi+1 ), condición de misma pendiente en la unión.
P00i (xi+1 ) = P00i+1 (xi+1 ), condición de misma concavidad.

30
Entonces, los polinomios tienen la siguiente forma:

Pi (x) = ai (x − xi )3 + bi (x − xi )2 + ci (x − xi ) + di
Donde i = 1, ..., n + 1. Para construir el Spline cúbico interpolante S de una fun-
ción f , definida por los números x0 < x1 < · · · < xn que satisface la condición
S00 (x0 ) = S00 (xn ) = 0, se tiene el siguiente algoritmo:

1: INPUT: n;x0 , x1 , · · · , xn ; a0 = f (x0 ), a1 = f (x1 ), · · · , an = f (xn )


2: OUTPUT:aj , bj , cj , dj , forj = 0, 1, · · · , n − 1a
3: for i = 0, 1, · · · , n − 1 do
4: Set: hi = xi+1 − xi
5: end for
6: for i = 1, 2, · · · , n − 1 do
3 3
7: Set: αi = (ai+1 − ai ) − (ai − ai−1 )
hi hi−1
8: end for
9: Set: l0 = 1, u0 = 0, z0 = 0.
10: for i = 1, 2, · · · , n − 1 do
hi (αi − hi−1 zi−1 )
11: Set: li = 2(xi+1 − xi−1 ) − hi−1 ui−1 ; ui = ; zi =
li li
12: end for
13: Set: ln = 1, zn = 0, cn = 0
14: for j = n − 1, n − 1, · · · , 0 do
(aj+1 − aj ) hj (cj+1 + 2cj )
15: Set: cj = zj − uj cj+1 ; bj = −
hj 3
16: end for
17: OUTPUT: aj , bj , cj , forj = 0, 1, · · · , n − 1
18: STOP
a Nota:S(x) = Sj (x) = aj + bj (x − xj ) + cj (x − xj )2 + dj (x − xj )3 , forxj ≤ x ≤ xj+1

5.3. Serie de Taylor


El desarrollo de la serie de Taylor intenta aproximar una función en una re-
gión a un punto especı́fico. La serie de Taylor es una serie infinita que converge
a una función real, y los polinomios de Taylor, que son series finitas (sumas
parciales) y sólo convergen a la función aproximada en una región cerca del
punto en que el polinomio de Taylor está desarrollado. Las series de Taylor
son utilizadas frecuentemente en ciencias fı́scias cuando las funciones son muy
difı́ciles y sólo se necesita un resultado de la función en una región pequeña. Ası́
podemos simplificar funciones más avanzadas como funciones trigonométricas o
logarı́tmicas. Además las computadoras no podrı́an calcularlas sin herramientas
de aproximaciones, todos los cálculos son resultados numéricos, esto significa
que las computadoras sólo trabajan con aproximaciones.

Podemos definir la serie de Taylor como sigue; si I ∈ R y f: I −→ R es una

31
función continuamente diferenciable en un intervalo abierto y α un elemento de
I, la serie infinta:

X f (n) (α)
T f (x; α) = (x − α)(n)
n=0
n!

se llama serie de Taylor de f en el punto α.

La suma parcial o las series finitas

f 0 (α) f 00 (α)
T f (x; α) = f (α) + (x − α) + (x − α)2
1! 2!
(11)
f 000 (α) f (n) (α)
+ (x − α)3 + · · · + (x − α)n
3! n!
se llaman polinomios de Taylor.

El primer polinomio de Taylor es una aproximación de la función, con una


tangente en el punto α donde está desarrollada. Está da como resultado una
función lineal que se vuelve más inexacta conforme se aleja de α.

T1 f (x; α) = f (α) + f 0 (α)(x − α) (12)

El segundo polinomio es una aproximación de la función con una parábola. Es-


ta función es más exacta que el primer polinomio aunque también sólo en una
región cerca del punto α.

f 00 (α)(x − α)2
T1 f (x; α) = f (α) + f 0 (α)(x − α) + (13)
2

Entre mayor grado tenga el polinomio más exacta será la aproximación a la


función original. El error de la aproximación es la diferencia entre el resultado
de la función y el polinomio.

Finalmente se obtiene la expresión de la función en terminos de una serie:



X f (n) (a)
f (x) = (x − a)n
n=0
n!
Tomando un valor de x0 y una vecindad en donde se aproxima esa función:

32
Figura 10: Serie de Taylor

Como se muestra en la imagen, es posible tomar sólo la primera, la segunda


hasta la i-ésima iteración, que dará como resultado un polinomio de i-ésimo or-
den. Cuando se obtiene un polinomio de i-ésimo orden con i < n se dice que la
serie está truncada. Con este truncamiento obtenemos una aproximación más
o menos adecuada a la función. En el ejemplo podemos ver como los trunca-
mientos cada vez más altos se acercan cada vez más a la función.

Ahora mostraremos como se construye, como mencionamos anteriormente la


serie de Taylor evaluada en un punto α se aproxima a la función inicial eva-
luada en el mismo punto f (α), a medida que n → ∞. En la figura anterior se
muestran 4 iteraciones de la expansión, podemos explicar el algoritmo de dicha
expansión de la siguiente manera:

1: INPUT: x0 = α, n = número de iteraciones, función inicial : f (x)


2: for i = 1, n do
3: suma = 0 i (i)
4: suma = suma + (x−x0 )i!f (x0 )
5: end for
6: OUTPUT: Expansión de Taylor

Los valores iniciales del ejemplo anterior son:

Para f (x) = − sin(x)

33
Para x0 = − π4
Para la gráfica x ∈ [−5, 5]
Para la primer iteración, se obtiene una lı́nea pendiente:

Figura 11: Primera iteración

En lo sucesivo se obtiene:

Figura 12: Segunda iteración

34
Figura 13: Tercera iteración

Las expresiones simbólicas de la expansión se muestran en la siguiente tabla:

Expansión en n=1 −0,70 ∗ x + 0,15


Expansión en n=2 −0,70 ∗ x − 0,35 ∗ (x + 0,78) ∗ ∗2 + 0,15
Expansión en n=3 −0,70 ∗ x + 0,11 ∗ (x + 0,78) ∗ ∗3 − 0,35 ∗ (x + 0,78) ∗ ∗2 + 0,15
Expansión en n=4 −0,707 ∗ x + 0,029 ∗ (x + 0,78) ∗ ∗4 + 0,11 ∗ (x + 0,78) ∗ ∗3
−0,35 ∗ (x + 0,78) ∗ ∗2 + 0,15

5.4. Aproximación por mı́nimos cuadrados


Es posible efectuar un cálculo para aproximar una recta pendiente que mejor
se aproxime a los valores (x1 , y1 ), (x2 , y2 ), (x3 , y3 ), · · · (xi , yi ) que se pretenden
sean de carácter experimental.

Este procedimiento es de gran importancia debido a que en las experiencias


muchas veces las magnitudes fı́sicas dependen linealmente, como por ejemplo,
la intensidad de corriente eléctrica es proporcional a la diferencia de potencial
en los elementos óhmicos. En reiteradas ocasiones, nos será útil encontrar la
pendiente en la recta que mejor se aproxime a los datos experimentales, debido
a que tendrá un importante significado fı́sico. En términos generales es posible
expresar la recta de una pendiente con la ecuación:

y = ax + b
Donde a es la pendiente de la recta y b es la ordenada al origen de la recta.

La parte interesante es tratar con datos experimentales, cuando se trata de


este tipo de datos, debido a los errores experimentales, generalmente los datos
no satisfacen exactamente dicha ecuación, sino que estarán próximos a la recta
pero no perfectamente a los datos.

35
Se busca la recta que minimice el error:
n
X
(a, b) = (yi − axi − b)2
i=1

Se puede decir que la distancia de cada punto del gráfico a la recta es calculado
como:

y1 = ax1 + b + 1
y2 = ax2 + b + 2
y3 = ax3 + b + 3
..
.
yn = axn + b + n

Despejando los errores:

1 = y1 − ax1 − b
2 = y2 − ax2 − b
3 = y3 − ax3 − b
..
.
n = yn − axn − n

Se tiene una recta como la siguiente:

Figura 14: Ajuste lineal

36
Es posible definir entonces el error cuadrático medio:
v v
u n u n
uX uX
t  = t (yi − axi − b)2
2

i=1 i=1

Encontrando las sumas parciales de a y b se obtiene el siguiente sistema:

2i
P
∂ P
=2 i = (yi − axi − b)(−xi )
∂a
2i
P
∂ P
= −2 i (yi − axi − b)
∂b
Las sumas:

X X X
− yi xi + a x2i + b xi =0
i
X X
− yi + a xi + bn = 0
i

Finalmente se obtienen las matrices:


 P 2 P    P 
Pi xi i xi a
= Pxi yi
i xi n b yi
En la literatura es posible encontrar las siguientes definiciones:

n
X n
X n
X n
X
Sx = xi Sy = yi Sxx = x2i Sxy = xi yi
i=1 i=1 i=1 i=1

Podemos definir los valores de la pendiente a y la ordenada al origen b, con las


siguientes ecuaciones, sea n el número de datos:

nSxy − Sx Sy Sxx Sy − Sx Sxy


a= b=
nSxx − Sx Sx nSxx − Sx Sx
Sus respectivos errores:

s s
n(a, b) Sxx (a, b)
(a) = (b) =
(nSxx − Sx Sx )(n − 2) (nSxx − Sx Sx )(n − 2)

Se llama r al parámetro de coeficiente de correlación lineal que designa el grado


de correlación entre x e y, donde |r| ≤ 1:

37
|r| = Correlación total
r = 0 No hay correlación
Siendo r:
nSxy − Sx Sy
r= √ p
nSxx − Sx Sx nSyy − Sy Sy
donde
n
X
Syy = yi2
i=1

A continuación se presenta un ejemplo:


Sean dados los siguientes datos

xi yi xi yi x2i yi2 (b + axi − yi )


1 1.5 1.5 1.0 2.25 0.042
2 2.0 4.0 4.0 4.00 0.052
3 4.0 12.0 9.0 16.00 0.699
5 4.6 23.0 25.0 21.16 0.187
6 4.7 28.2 36.0 22.09 1.606
8 8.5 68.0 64.0 72.25 0.440
9 8.8 79.2 81 77.44 0.000
10 9.9 99.0 100.0 98.01 0.037
Se obtienen los siguientes valores:

a = 0,935 b = 0,36 r = 0,978

y = (0,94 ± 0,08)x + (0,4 ± 0,5)

38
Figura 15: Ajuste lineal

6. Valores singulares y factorización de matrices


6.1. Descomposición LU
El método de eliminación gaussiana sirve para resolver sistemas de ecuacio-
nes algebráicas lineales:

[A](X) = (B)
Los métodos de descomposición LU separan el tiempo usado en las eliminaciones
para la matriz [A] de las manipulaciones en el lado derecho (B). Una vez que
[A] se ha descompuesto, los múltiples vectores del lado derecho (B) se pueden
evaluar de manera eficiente.

De manera similar al caso de eliminación de Gauss, la descomposición LU re-


quiere del pivoteo para evitar la división entre cero.

Es posible ordenar la ecuación anterior de forma que se obtiene:

[A](X) − (B) = 0
Suponemos que esta ecuación puede expresarse como un sistema triangular su-
perior:

39
    
u11 u12 u13 x1 d1
 0 u22 u23   x2  =  d2  (14)
0 0 u33 x3 d3

Es decir, se utiliza eliminación para reducir el sistema a una forma triangular


superior. La ecuación también se puede ordenar como:

[U ](X) − (D) = 0
Ahora suponga que existe una matriz diagonal inferior con números 1 en la dia-
gonal:
 
1 0 0
[L] =  l21 1 0 
l31 l32 1
de ella se obtiene:

[L][U ] = [A] [L](D) = (B)

Es posible resolver la descomposición en dos pasos:

1. Paso de descomposición LU: Se factoriza o se descompone en las matrices


triangulares [L] y [U]

2. Paso de la sustitución: [L] y [U] se usan para determinar la solución (X)


para un lado derechp (B). Este paso se divide en dos:
a) Se utiliza la ecuación [L](D) = (B) para generar un vector intermedio
(D) mediante sustitución hacia adelante.
b) Este resultado se sustituye en la ecuación [U ](X) = (D) para encon-
trar (X), que se resuelve por sustitución hacia atrás.
Aunque a primera vista podrı́a parecer que la eliminación de Gauss no está
relacionada con la eliminación LU, aquélla puede usarse para descomponer [A]
en [L] y [U], lo cual se observa fácilmente para [U] que es el resultado directo de
la eliminación hacia adelante. Recuerde que en el paso anterior correspondiente
a esta eliminación se pretende reducir la matriz de coeficientes [A] a la forma:
 
a11 a12 a13
[U ] =  0 a022 a023 
0 0 a033
que es el formato superior triangular.
El pivoteo que se utiliza para encontrar los factores de eliminación de columnas

40
y reducción de la matriz se dan mediante los metodos ya conocidos de la elimi-
nación de Gauss:

a21 a31 a032


f21 = f31 = f32 =
a11 a11 a022

Con lo que finalmente se obtienen las siguientes expresiones para las matrices
[U] y [L]:

   
a11 a12 a13 1 0 0
[U ] =  0 a022 a023  [L] =  f21 1 0 
0 0 a033 f31 f32 1

Ejemplo:

Sea la matriz [A]:


 
3 −0,1 −0,2
[A] =  0,1 7 −0,3 
0,3 −0,2 10
Se obtiene la siguiente matriz [U]:
 
3 −0,1 −0,2
[U ] =  0 7,00333 −0,29333 
0 0 10,0120
Para la matriz [L]:

0,1 0,3 −0,19


f21 = f31 = f32 =
3 3 7,00333
Se obtiene:
 
1 0 0
[L] =  0,0333 1 0 
0,1000 −0,02713 1
De la ecuación [L](D) = (B):
    
1 0 0 d1 7,85
 0,0333 1 0   d2  =  −19,3 
0,1000 −0,02713 1 d3 71,4
Despejando se obtienen los valores de (D):

d1 = 7,85 d2 = −19,5617 d3 = 70,0843

41
Este resultado se sustituye en la ecuación [U ](X) = (D):
    
3 −0,1 −0,2 x1 7,85
 0 7,00333 −0,29333  x2  =  −19,5617 
0 0 10,0120 x3 70,0843
Donde finalmente se obtiene (X):

x1 = 3 x2 = −2,5 x3 = 7,00003
El siguiente es el pseudocódigo para la descomposición LU:

1: INPUT: a,n,b,x
2: Sustitución hacia adelante
3: for i = 2, n do:
4: sum = bi
5: for j = 1, i − 1 do
6: sum = sum − aij ḃj
7: end for
8: bi = suma
9: end for
10: Sustitución hacia atrás
bn
11: xn =
ann
12: for i = n − 1, 1, −1 do:
13: sum = 0
14: for j = i + 1, n do:
15: sum = suma + aij ẋj
16: end for
17: end for
18: OUTPUT Substitute

6.2. Descomposición SVD


La descomposición en valores singulares consigue expresar la .acción”de una
matriz de forma simple en términos de rotación y cambios de coordenadas.
El teorema fundamental explica que toda matriz |{z} A se puede descomponer
n×m
como:

U × |{z}
A = |{z}
|{z} VT
S × |{z}
n×m n×n n×m m×m

Donde:

Las matrices |{z}


U y |{z}
V son matrices de cambio de coordenadas u orto-
n×r m×r
gonales, es decir, que:

42
UT × U = |{z}
I VT × V = |{z}
I
n×n m×m

S es diagonal con r elementos positivos en la diagonal, siendo r el rango


de la matriz y el resto de los elementos iguales a cero, donde la matriz no
es necesariamente cuadrada:
 
σ1



..
. 0 


S=
 . ..


 

 0 σr


0
Los elementos de la diagonal de S se le denominan valores singulares de A. Las
columnas principales de U y V se denominan direcciones principales de sa-
lida y entrada respectivamente.

Este problema se puede enfocar de dos maneras distintas:

1. A es la matriz ortogonal de vectores propios de la matriz simétrica A×AT ,


y la diagonal de S contiene las raı́ces cuadradas de sus valores propios σi :

A × AT = (USVT )(VST UT )
= USST UT

2. V es la matriz ortogonal de valores propios de la matriz simétrica AT × A


y S contiene la raı́z cuadrada de sus valores propios σi :

AT × A = (VST UT )(VST SVT )

Es posible construir las matrices de U y de V a partir de las siguientes ecuacio-


nes:

Av = σu AT u = σv
Sabemos que σ son los valores singulares de A, además otra forma de de-
nominar las columnas que componen a U y a V , es como sus correspondientes
vectores singulares izquierdo y derecho respectivamente.

Dado los valores singulares σi estos se ordenan como σ1 ≥ σ2 ≥ · · · σk . r es


el ı́ndice tal que σr ¿0 y además k = r o σr+1 = 0. Es importante considerar
que:

43
1. Las columnas de U son los vectores propios de la matriz AAT .
2. Las columnas de V son los vectores propios de la matriz AT A.
3. Es posible calcular los elementos de S con los valores propios de AT A o con
AAT , ya que son los mismos. Las columnas restantes de S se completan
con zero vectores de las dimensiones necesarias.
4. Puede hacerse la comprobación tomando en cuenta que U y V son orto-
gonales (multiplicando ella misma por su transpuesta debe de obtenerse
una matriz identidad).
5. Los vectores se acomodan por columnas en sus respectivas matrices según
sus respectivos valores propios, de nuevo, considerando el orden de mayor
a menor.
Es necesario encontrar la descomposición SVD de la siguiente matriz:
 
2 4
1 3
A= 0

0
0 0
Solución:

Su matriz transpuesta:  
T 2 1 0 0
A =
4 3 0 0
Realizamos el cálculo para obtener las columnas de U obteniendo los vectores
propios de A × AT :
 
20 14 0 0
14 10 0 0
A × AT = 


0 0 0 0
0 0 0 0
Los valores propios de A × AT son:

√ √
λ1 = 221 + 15 λ2 = − 221 + 15 λ3,4 = 0

Los vectores propios de A × AT son:

       
0,817 −0,576 0 0
0,576   0,817  0 0
u1 = 
 0
 u2
 =
 0 u3
 =
1u4
 = 
0
0 0 0 1

44
Por lo tanto U es:

 
0,817 −0,576 0 0
0,576 0,817 0 0
U=
 0

0 1 0
0 0 0 1

Realizamos el cálculo para obtener las columnas de V obteniendo los vecto-


res propios de AT × A:
 
T 5 11
A ×A=
11 25
Los vectores propios de AT × A son:

   
0,4045 −0,9145
v1 = v2 =
0,9145 0,4045

Por lo tanto V es:

 
0,4045 −0,9145
V=
0,9145 0,4045

Y además:
 
0,4045 0,9145
VT =
−0,9145 0,4045
Realizamos cálculo para S:

Sean los valores singulares:

√ √
q q
σ1 = 221 + 15 σ2 = − 221 + 15 σ3,4 = 0

45
Sabemos que S tiene dimensiones n × m, es decir 4x2, por lo tanto:
p√ 
221 + 15 p 0

S=
 0 − 221 + 15 
 0 0 
0 0
Finalmente se obtiene que:
  p√ 
0,817 −0,576 0 0 221 + 15 p √0  
0,576 0,817 0 0 
A= × 0 × 0,4045
− 221 + 15 0,9145
 0 0 1 0  0 0  −0,9145 0,4045
0 0 0 1 0 0

Se dice que una ”una transformación ortogonal V sólo produce la rotación de la


esfera S, σ la deforma en una hiperelipse y finalmente U rota esa misma elipse 14

Si una matriz A ha de ser descompuesto según el método SVD, y además


es cuadrada de dimensiones nxn, donde n=2, entonces S es la circunferencia
unitaria, donde se tiene una deformación de la circunferencia y de los vectores
singulares a la derecha de A al aplicar sucesivamente sus transformaciones:

Figura 16: Transformación de una esfera unitaria en R2

Por su capacidad de alterar las matrices de las imagines, una de sus apli-
caciones más comunes es la descompresión de imágenes, con lo cual es posible
reducir algo la memoria utilizada por esta imagen.

14 Cf. BUFFO, Flavia., VERDIELL Adriana. La Descomposición en valores singulares: un

enfoque geométrico y aplicaciones. Recuperado en: https://revistas.unc.edu.ar/index.


php/REM/article/download/10834/11431.

46
Mediantes las propiedades de las matrices, es posible definir una imagen compu-
tacionalmente como un arreglo de números, donde cada número designa un color,
y cada posición de la matriz designa una posición en la pantalla. Haciendo va-
riar el rango de la matriz inicial es posible obtener imágenes de mayor o menor
calidad que ocupen más o menos espacio en la memoria respectivamente.

Otra aplicación de la descomposición SVD, se obtiene si definimos la pseu-


doinversa de dicha matriz. La cual se define como:

A+ = (V ) × S × UT
Entonces, es posible establecer que cualquier matriz A y vector b, el sistema
AX = b tiene una única solución de longitud mı́nima, obtenida por el método
de mı́nimos cuadrados, la cual está dada por:

Xsvd = A+ b

7. Derivación e integración numérica


7.1. Concepto de derivada numérica. Método de derivada
por diferencias
La derivación numérica es una técnica de análisis para calcular una apro-
ximación a la derivada de una función en un punto utilizando los valores y
propiedades de la misma.

Podemos considerar el cociente de Newton como la definición de una deriva-


da de una función f (x):

f (t + ∆t) − f (t)
f 0 (x) = lı́m
∆x→∞ ∆t
Las aproximaciones numéricas que podamos hacer para δt > 0 serán de dos
tipos:

1. Diferencias hacia adelante


f (x0 + ∆t) − f (x0 )
f 0 (x0 ) ≈
∆t

2. Diferencias hacia atrás


f (x0 ) − f (x0 − ∆t)
f 0 (x0 ) ≈
∆t

La aproximación de la derivada por este método entrega resultados aceptables


con un determinado error. Para minimizar los errores se estima que el promedio

47
de ambas entrega la mejor aproximación numérica al problema dado:

Diferencias centradas
f (x0 + ∆t) − f (x0 − ∆t)
f 0 (x0 ) ≈
2∆t
Algoritmo para las diferencias adelantadas:

1: INPUTf (x), xi ∈ [a, b], ∆t


2: for i = 0, n − 1 do
−yi
3: f 0 (xi ) = yi+1
∆t
4: end for
Algoritmo para diferencias atrasadas:

1: INPUTf (x), xi ∈ [a, b], ∆t


2: for i = −1, n − 2 do
3: f 0 (xi ) = yi −y
∆t
i−1

4: end for
Algoritmo para diferencias centradas:

1: INPUTf (x), xi ∈ [a, b], ∆t


2: for i = −1, n − 1 do
−yi−1
3: f 0 (xi ) = yi+12∆t
4: end for
Sea dado el siguiente ejemplo donde f (x) = sin x y f 0 (x) = cos x, se obtie-
ne el siguiente plot:

48
Figura 17: Derivada numérica

7.2. Concepto de integración numérica. Método del tra-


pecio
Haciendo uso del teorema fundamental del cálculo es posible calcular una
integral definida. Este teorema se define de la siguiente manera.

Sea f (x) una función continua y definida en el intervalo [a, b] y sea F (x) una
función primitiva de f (x), entonces:
Z b
I= f (x)dx = F (b) − F (a)
a
El problema en la práctica se presenta cuando nos vemos imposibilitados a
encontrar una función primitiva requerida, aún para integrales aparentemente
sencillas como:

Z 1
2
I= ex dx
0
integral que no es posible resolver mediante el uso del Teorema fundamental del
Cálculo15 . Una manera sencilla de aproximar las integraciones es mediante una
suma de Riemann. La idea central de las sumas de Riemann es el definir una
15 Cf. http://www.ing.unne.edu.ar/assets/pdf/academica/departamentos/computacion/

comp/IN.pdf

49
forma de calcular una área debajo de la curva de una integral de manera que
sea posible calcular o aproximar el área bajo la curva que delimita dicha función.

Es posible calcular el área de una curva de manera sumamente aproximada


mediante la formula de un rectángulo:

Figura 18: Área debajo de una curva

Podemos considerar el área delimitada por la curva de f (x) según la fórmula:


Z b
f (x)dx ≈ A = (b − a)f (a)
a
Podemos aproximar el área debajo de la curva de una manera mucho más efec-
tiva utilizando una mayor cantidad de rectángulos debajo del área de la curvaa
y sumándolos todos:

50
Figura 19: Suma de Riemann

La cual se puede desarrollar con la fórmula de la suma de los rectángulos:


Z b n−1
X
f (x)dx ≈ (xi+1 − xi )f (xi )
a i=0

Si nos aproximamos al área por una parte extra:

Figura 20: Área aproximada por puntos adelantados

51
El área del rectángulo es aproximadamente
Z b
f (x)dx ≈ (b − a)f (b)
a

Es posible mejorar esta diferencia tomando un punto medio de la siguiente


manera:

Figura 21: Área por diferencias centradas

Donde el área se calcula


Z b
≈ (b − a)f (c)
a

O mediante la construcción de dos figuras cuya área es sencilla de calcular:

Figura 22: Área mediante la suma de dos figuras

52
Se obtiene que:
Z b
1
≈ (b − a)[f (a) + f (b)]
a 2
Combinando estas ideas sobre la integración numérica podemos obtener una
combinación entre sumas de rectángulos y de triángulos:

Figura 23: Regla del trapecio

El área que se obtiene se da mediante la siguiente expresión que se conoce


como regla del trapecio:
Z b n−1
1 X 1
f (x)dx ≈ ∆xf (x0 ) + f (xi )∆x + ∆xf (xi )
a 2 i=1
2

Algoritmo para calcular la integral numérica mediante el método de suma de


Riemann:

1: INPUT: Establecer un ∆x, número de datos n, número de particiones n−1.


2: Set: suma = 0
3: for i = 0, n − 1 do:
4: suma+ = (X[i + 1] − X[i]) ∗ Y [i]
5: end for

53
Algoritmo para calcular la integral numérica mediante la regla del trapecio:

1: INPUT: Establecer un ∆x, número de datos n, número de particiones n−1.


2: Set: suma = 0
3: for i = 1, n − 1 do:
4: suma+ = Y [i] ∗ ∆x
5: a = 0,5 ∗ ∆x ∗ Y [0]
6: b = 0,5 ∗ ∆x ∗ Y [n]
7: suma+ = a + b
8: end for

7.3. Método de Simpson


Además de aplicar la regla del trapecio con una segmentación más fina, otra
forma de obtener una estimación más exacta de una integral consiste en usar
polinomios de grado superior para unir los puntos. Por ejemplo, si hay un punto
a la mitad entre f(a) y f(b), los tres puntos se pueden unir con una parábola. Si
hay dos puntos igualmente espaciados entre f (a) y f (b), los cuatro se pueden
unir mediante un polinomio de tercer grado. Las fórmulas que resultan de tomar
las integrales bajo esos polinomios se conocen como reglas de Simpson.

Figura 24: Reglas de Simpson

El método de Simpson consiste en la aproximación del cálculo de una área


plana bajo una curva utilizando trapecios curvilı́neos a partir de una interpola-
ción con una función cuadrática:
Z b  
b−a a+b
f (x)dx ≈ [f (a) + 4f + f (b)]
a 6 2
La ecuación anterior describe la aproximación simple del método de Simpson,
se denomina simple ya que sólo dependen del desarrollo de un polinomio. Re-
quiere el conocimiento de tres puntos equiespaciados: los extremos y un punto

54
central. Aplicando esta expresión utilizando mayor cantidad de puntos interme-
dios se define la variante de aproximación compuesta del método de Simpson.
En esta definición N es el número de puntos y n = N − 1 subintervalos. En este
caso requiere que la cantidad de subintervalos sean pares. Por lo tanto, se define
un valor h que corresponde al ancho del subintervalo o el paso que hay entre
puntos. Se calcula como h = b−a n . Se obtiene la siguiente aproximación para el
área:
n−2 n−2
 
Z b 2 2
h X X
f (x)dx ≈ f (a) + f (b) + 4 f (x2k+1 ) + 2 f (x2k )
a 3
k=0 k−1

Podemos desarrollar el siguiente ejemplo:


1  
b−a
Z
−x2 a+b
e dx ≈ [f (a) + 4f + f (b)]
−1 6 2
Donde N = 5, n = 4, a = −1, b = 1 y h = 0,5:
Z 1
2 0,5
e−x dx ≈ [f (−1) + f (1) + 4(f (x1 ) + f (x3 )) + 2f (x2 )] ≈ 1,49433
−1 3
1: INPUT: N = número de datos, a y b (lı́mites de integración), N número
de datos, (x0 , x1 , · · · , xN ), (f (x0 ), f (x1 )), · · · , f (xn ), h = Nb−a
−1
2: for k = 0 : n−2
2 do:
3: suma1 = 0
4: suma1+ = f (x2k+1 )
5: end for
6: for k = 1 : n−2
2 do:
7: suma2 = 0
8: suma2+ = f (x2k )
9: end for
10: approx = h(f (a) + f (b) + 4(suma1) + 2(suma2)
11: OUTPUT: approx

7.4. Definición de cálculo simbólico


A lo largo del curso se han abordado temas de métodos numéricos para la
resolución de ciertos algoritmos de resolución cuya base está en los métodos
iterativos, los cuales, pueden ser calculados, muy eficientemente por algunos
softwares como Python, Octave, Fortran, etc. Sin embargo existen otros tipos
de software especializados en e cálculo simbólico, (aunque esto no debe indu-
cir al lector a pensar que los softwares antes mencionados no son capaces de
realizar cálculos simbólicos, la mayorı́a cuentan con una librerı́a poderosa pa-
ra hacer cálculos numéricos) estos tipos de softwares son llamados CAS por
sus siglas en inglés (Computational Algebra System). Algunos de los más uti-
lizados son Maple, Máxima y Mathematica. En el presente trabajo abordare-
mos el uso de Máxima ya que es un software libre y de fácil uso, aunque no

55
es tan estandar como Maple, es posible encontrarlo facilmente en la página
http://maxima.sourceforge.net/, se puede encontrar en esa misma página
toda su documentación.

La historia de este software se desarrolla a finales de los años sesenta cuando


varias agencias gubernamentales de Estados Unidos se vieron en la necesidad de
disponer de un lenguaje cientı́fico capaz de superar la dependencia que tenı́an
respecto de los lenguajes exclusivamente numéricos.

La idea consistı́a en encontrar la manera de que las máquinas manipulasen las


expresiones matemáticas de forma similar a como lo hacen los humanos. Por esa
época, en el MIT (Massachussets Institute of Technology) se presentó una tesis
doctoral sobre integración simbólica cuyo autor era Joel Moses y que habı́a sido
supervisada por Marvin Minsky. Desarrollaron juntos el proyecto de Macsyma,
(MAC’s SYmbolic MAnipulation system)

Maxima, al igual que los lenguajes numéricos, tiene la capacidad de realizar


operaciones sencillas:

Calcular el valor de 5 + ( 32 )−2 :

Solución:

( %i1) 5 + (2/3)( − 2);


29
( %o1) 4

Una forma en la que Maxima expresa sus resultados:

( %i2) [1/2,[a,3],sqrt(3)/2, %pi] h √ i


1 3
( %o2) 2 , [a, 3], 2 , π

7.5. Ecuaciones diferenciales ordinarias


Recordemos que una función y = f (x) se llama diferenciable en el punto
x0 , si su incremento ∆y = f (x) − f (x0 ) puede ser representado en la forma
∆y = A∆x + (∆x).

Donde A es una constante, (∆x) → 0, entonces, ∆x → 0.

Esta representación tiene lugar si y sólo si la función f(x) tiene una derivada
finita en el punto x = x0 . Al denotar dx = ∆x y dy = A∆x = Adx las cantida-
des dx = ∆x y dy = ∆y se llaman diferenciales de la variable x y de la variable y.

Si x0 es un punto arbitrario de un intervalo (a,b) para el cual se cumple la

56
fórmula anterior, entonces la función se llama diferenciable en el intervalo (a,b)
y podemos considerar la diferencial de la función como producto:

dy = f 0 (x)dx
Supongamos que la función y = f (x) expresa cuantitativamente un fenómeno,
al estudiar este fenómeno es imposible establecer directamente el carácter de
la dependencia entre las variables x y y. Sin embargo se puede establecer una
dependencia entre las magnitudes x, y y las derivadsa de y respecto a x:

dy d2 y d(n) y
y0 = y 00 = 2 ,··· , y (n) =
dx dx dx(n)
es decir, se puede escribir una ecuación diferencial.

Una ecuación diferencial es una ecuación donde la función incógnita (o va-


rias funciones) se encuentra bajo el signo de la derivada o de la diferencial. Si
la función incógnita depende de una sola variable independiente, la ecuación
se llama ecuación diferencial ordinaria (EDO). Una ecuación diferencial se
puede escribir simbólicamente:

F (x, y, y 0 , · · · , y (n) ) = 0
Ejemplos:

1. La EDO que describe el movimiento uniforme con velocidad constante V


tiene la forma:

dx
=v
dt
2. La edo que modela el movimiento oscilatorio de un péndulo matemático:

x00 + ω 2 x = 0
donde x = x(t), ω ∈ R
3. Si una ecuación de una circunferencia x2 + y 2 = R2 las variables x y
y consideremos como unas funciones diferenciables que dependen de un
parámetro t, es decir, x = x(t) y y = y(t), entonces obtenemos las EDOs:

dy x dx y
2xdx + 2xdy = 0 =− =−
dx y dy x

57
8. Apéndice
A continuación se presentan todos los códigos de Python anexos a este tra-
bajo:

Método de eliminación Simple de Gauss


# -*- coding: utf-8 -*-
"""
Created on Tue Mar 12 18:55:30 2019

@author: Karolina
"""

import numpy as np

#Definición de la función
def Gauss(A,b,n):

#Reducción de la matriz ampliada


for j in range (0,n):
for i in range (j+1,n):
m=A[i,j]/A[j,j]
b[i]=b[i]-m*b[j]
for k in range (0,n):
A[i,k]=A[i,k]-(m*A[j,k])

print A
print b

#Sustitución hacia atrás

x=np.zeros_like((b))
for i in range (n-1,-1,-1):
suma=0
for j in range(i+1,n):
suma+=A[i,j]*x[j]
x[i]=(b[i]-suma)/A[i,i]
print x

#Valores de A,b,n
n=3
A=np.array([[3,-0.1,-0.2],
[0.1,7,-0.3],
[0.3,-0.2,10]])

58
b=np.array([[7.85],[-19.3],[71.4]])

Gauss(A,b,n)
Método de Gauss-Seidel
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 7 10:43:24 2019

@author: Karolina
"""

import numpy as np
import time
import matplotlib.pyplot as plt

matrix = np.array([[10., -1., 2., 0.],


[-1., 11., -1., 3.],
[2., -1., 10., -1.],
[0.0, 3., -1., 8.]])

vector = np.array([6., 25., -11., 15.])


comp=np.zeros_like((vector))
x=np.zeros_like((vector))
error=[]
tol=1e-5
N=10
n=4
k=0
start=time.clock()
while k< N:
suma=0
k=k+1
for r in range(0,n):
suma=0
for c in range(0,n):
if c!=r:
suma=suma+matrix[r,c]*x[c]
x[r]=(vector[r]-suma)/matrix[r,r]
print("x["+str(r)+"]: "+str(x[r]))

del error[:]
#Comprobación
for r in range(0,n):
suma=0
for c in range(0,n):

59
suma=suma+matrix[r,c]*x[c]
comp[r]=suma
dif=abs(comp[r]-vector[r])
error.append(dif)
print("Error en x[",r,"]=",error[r])
plt.plot(error)
print("Iteraciones: ",k)
if all(i<=tol for i in error) == True:
break
end=time.clock()
print ("Tiempo transcurrido:\n")
print (end-start)
Método de la bisección
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 5 08:42:51 2019

@author: Usuario
"""

# Algoritmo de Bisección
# [a,b] se escogen de la gráfica de la función
# error = tolera

import numpy as np

fx = lambda x: x**3 -8

# INGRESO
a = -5
b = 5
tolera = 0.001

# PROCEDIMIENTO
tabla = []
tramo = b-a

fa = fx(a)
fb = fx(b)
i = 1
while (tramo>tolera):
c = (a+b)/2
fc = fx(c)
tabla.append([i,a,c,b,fa,fc,fb,tramo])
i = i+1

60
cambia = np.sign(fa)*np.sign(fc)
if (cambia<0):
b = c
fb = fc
else:
a=c
fa = fc
tramo = b-a
c = (a+b)/2
fc = fx(c)
tabla.append([i,a,c,b,fa,fc,fb,tramo])
tabla = np.array(tabla)

raiz = c

# SALIDA
np.set_printoptions(precision = 4)
print('[ i, a, c, b, f(a), f(c), f(b), paso]')
# print(tabla)

# Tabla con formato


n=len(tabla)
for i in range(0,n,1):
unafila = tabla[i]
formato = '{:.0f}'+' '+(len(unafila)-1)*'{:.3f} '
unafila = formato.format(*unafila)
print(unafila)

print('raiz: ',raiz)

# GRAFICA
import matplotlib.pyplot as plt

xi = tabla[:,2]
yi = tabla[:,5]

# ordena los puntos para la grafica


orden = np.argsort(xi)
xi = xi[orden]
yi = yi[orden]

plt.plot(xi,yi)
plt.plot(xi,yi,'o')
plt.axhline(0, color="black")

61
plt.xlabel('x')
plt.ylabel('y')
plt.title('Bisección en f(x)')
plt.grid()
plt.show()

Método del punto fijo


# -*- coding: utf-8 -*-
"""
Created on Mon Mar 18 19:17:30 2019

@author: Karolina
"""
import sympy as sy
import numpy as np

x=sy.symbols('x')
gx=sy.exp(-x)
xr=0
itera=0
ea=100 #error aproximado
es=0.1 #Tolerancia porcentual
print("i\t xi\t ea(%)")
#El error aproximado debe ser menor que la tolerancia
while ea>es:
xrol=xr
xr=gx.subs(x,xrol)
xr=xr.evalf()
itera+=1
if xr!=0:
ea=(np.absolute((xr-xrol)/xr))*100
print(itera,"\t",xr,"\t",ea)
Método de Newton Raphson

# -*- coding: utf-8 -*-


"""
Created on Tue Mar 5 07:08:26 2019

@author: Usuario
"""

# -*- coding: utf-8 -*-


"""
Created on Tue Feb 26 07:24:15 2019

62
@author: Karolina Padilla Valdez
"""

import numpy as np
import sympy as sp

x1=sp.Symbol("x1")
x2=sp.Symbol("x2")
x3=sp.Symbol("x3")

X=np.array([[x1,x2,x3]])

matrix=np.array([[3*x1-sp.cos(x2*x3)-0.5],
[x1**2-81*(x2+0.1)**2+sp.sin(x3)+1.06],
[np.e**(-x1*x2)+20*x3+(10*np.pi-3)/3]])

J=np.zeros((3,3),dtype=sp.Add)
n=3
print ("Matriz inicial:\n",matrix)

for i in range(0,n):
for j in range(0,n):
J[i,j]= matrix[i].item().diff(X[0,j])

print ("Jacobiano:\n",J)

Meval=np.zeros((3,1))
Jeval=np.zeros((3,3))
x0=np.array([[0],
[0],
[0]])
error=1
while error>=1e-8:
for i in range(0,n):
for j in range(0,n):
Jeval[i,j]=J[i,j].evalf(subs={x1:x0[0,0],x2:x0[1,0],x3:x0[2,0]})
Meval[i]=matrix[i].item().evalf(subs={x1:x0[0,0],x2:x0[1,0],x3:x0[2,0]})
print ("Matriz Jacobiana evaluada:\n",Jeval)
print ("Matriz inicial evaluada:\n", Meval)

Ji=np.linalg.inv(Jeval)
print ("Ji")
print (Ji)
print ("Meval")

63
print (Meval)
JixMeval=-np.matmul(Ji,Meval)
print ("JixMeval")
print (JixMeval)
x1=x0+JixMeval
print ("x1")
print (x1)
error=np.linalg.norm(x0-x1)
x0=x1
print ("X0")
print (x0)

print (JixMeval)
Interpolación polinomial
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 19 15:08:50 2019

@author: Karolina
"""
import numpy as np
import matplotlib.pyplot as plt
#n es el grado del polinomio que se puede obtener
n=int(input("Introduzca el grado del polinomio:\n"))
#N es el número de datos obtenidos
N=n+1
x=np.zeros((N,1))
Y=np.zeros((N,1))
for i in range(0,N):
x[i]=float(input("Elemento x["+str(i)+"]:\n"))
Y[i]=float(input("Elemento y["+str(i)+"]:\n"))

print (x)
print (Y)
plt.plot(x,Y, 'ro')
M=np.zeros((N,N))
print M
#Construir la matriz de coeficientes de M (Matriz de Vandermonde)
for i in range(0,N):
for j in range(0,N):
M[i,j]=x[i]**j
print M
#Resolución del sistema por reducción Gaussiana
for j in range (0,N):
for i in range (j+1,N):

64
m=M[i,j]/M[j,j]
Y[i]=Y[i]-m*Y[j]
for k in range (0,N):
M[i,k]=M[i,k]-(m*M[j,k])
print (M)
print (Y)

#Coeficientes del polinomio


Z=np.zeros_like((Y))
for i in range (N-1,-1,-1):
suma=0
for j in range(i+1,N):
suma+=M[i,j]*Z[j]
Z[i]=(Y[i]-suma)/M[i,i]
print (Z)
#Fase de interpolación
A=int(input("Introduzca la cantidad de puntos que desea interpolar:\n"))
intp=np.zeros((A,1))
for i in range(0,A):
intp[i]=float(input("Introduzca el punto ["+str(i+1)+"] a interpolar:\n"))

y=np.zeros_like(intp)
for i in range(0,A):
suma=0
for j in range(0,N):
suma+=Z[j]*intp[i]**j
y[i]=suma
print ("Los resultados de la interapolación son:\n")
print y
plt.plot(intp,y,'*',)
Interpolación de Lagrange
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 26 19:18:06 2019

@author: Karolina
"""
import numpy as np
import matplotlib.pyplot as plt

k=int(input("Introduzca el grado del polinomio:\n"))


N=k+1
X=np.zeros((N,1))
Y=np.zeros((N,1))
for i in range(0,N):

65
X[i]=float(input("Introduzca el valor x ["+str(i+1)+"]:\n"))
Y[i]=float(input("Introduzca el valor y ["+str(i+1)+"]:\n"))

plt.plot(X,Y,'ro')
#m es el número de veces que quiero interpolar
m=int(input("Introduzca la cantidad de puntos que desea interpolar:\n"))
intp=np.zeros((m,1))
for i in range(0,m):
intp[i]=float(input("Introduzca el valor a interpolar ["+str(i+1)+"]:\n"))
L=np.zeros((N,1))
suma=np.zeros((m,1))
for k in range(0,m):
for i in range(0,N):
product=1
for j in range(0,N):
if j!=i:
product*=(intp[k]-X[j])/(X[i]-X[j])
L[i]=product
suma[k]=suma[k]+L[i]*Y[i]
print (suma)
plt.plot(intp,suma,'*')
Splines
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 27 09:23:54 2019

@author: Karolina
"""
import numpy as np

#Número de puntos dados


N=int(input("Introduzca la cantidad de puntos conocidos:\n"))
#Número de subintervalos posibles de construir
n=N-1
X=np.zeros((N,1))

a=np.zeros((N,1))
h=np.zeros((n,1))
A=np.zeros((n-1,1))
for i in range(0,N):
X[i]=float(input("Introduzca el punto x["+str(i+1)+"]:\n"))
a[i]=float(input("Introduzca el punto y["+str(i+1)+"]:\n"))
for i in range(0,n):
h[i]=X[i+1]-X[i]
for i in range(1,n):

66
A[i]=((3/h[i])*(a[i+1]-a[i]))-((3/h[i-1])*(a[i]-a[i-1]))

l=[1]*(N)
u=[0]*(N)
z=[0]*(N)

for i in range(1,n):
l[i]=2(X[i+1]-X[i-1])-h[i-1]*u[i-1]
u[i]=h[i]/l[i]
z[i]=(A[i]-h[i-1]*z[i-1])/l[i]
b = [0] * (N)
c = [0] * (N)
d = [0] * (N)
for i in range(n-1, -1, -1):
c[i] = z[i] - u[i]*c[i+1]
b[i] = (a[i+1]-a[i])/h[i] - h[i]*(c[i+1] + 2*c[i])/3
d[i] = (c[i+1]-c[i])/(3*h[i])

print (a)
print (b)
print (c)
print (d)
Serie de Taylor
# -*- coding: utf-8 -*-
"""
Created on Tue Feb 19 08:03:05 2019

@author: Karolina Padilla Valdez


"""
#####Serie de Taylor####
import sympy as sy
import numpy as np
from sympy.functions import sin
import matplotlib.pyplot as plt

plt.style.use("ggplot")

####Definición de la función inicial para aproximar

x=sy.Symbol("x")
f=-sin(x)

###Factorial

67
def factorial(n):
if n<=0:
return 1
else:
return n*factorial(n-1)

####Aproximación de Taylor a x0

def taylor(function,x0,n):
i=0
p=0

while i <= n:
p = p + (function.diff(x,i).subs(x,x0))/(factorial(i))*(x-x0)**i
i+=1
return p
###Plot

def plot():
x_lims=[-5,5]
x1=np.linspace(x_lims[0],x_lims[1],800)
y1=[]

for j in range(1,5,1):
func=taylor(f,-np.pi/4,j)
print("Expansión de Taylor a n="+str(j),func)
for k in x1:
y1.append(func.subs(x,k))
plt.plot(x1,y1,label="order"+str(j))
y1=[]

plt.plot(x1,-np.sin(x1),label="-sin of x")
plt.xlim(x_lims)
plt.ylim([-np.pi,np.pi])
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.title("Serie de Taylor")
plt.show()

plot()
Mı́nimos cuadrados
# -*- coding: utf-8 -*-
"""

68
Created on Wed Apr 3 20:18:53 2019

@author: Karolina
"""

#Mı́nimos cuadrados
import numpy as np
import matplotlib.pyplot as plt
X = np.array([1,2,3,4,5,6,7])
Y = np.array([1,2.3,3.1,3.8,4.96,6.2,7])

n=len(X)

A=np.zeros((2,2))

suma=0
for i in range(0,n):
suma+=(X[i])**2
A[0,0]=suma

for i in range(0,n):
suma+=X[i]
A[0,1]=A[1,0]=suma

A[1,1]=n

b=np.zeros((2,1))
suma=0
product=1
suma2=0
for i in range(0,n):
suma2+=Y[i]
product*=X[i]*Y[i]
suma+=product
b[0,0]=suma
b[1,0]=suma2

for j in range (0,2):


for i in range (j+1,2):
m=A[i,j]/A[j,j]
b[i]=b[i]-m*b[j]
for k in range (0,2):
A[i,k]=A[i,k]-(m*A[j,k])

x=np.zeros_like((b))

69
for i in range (2-1,-1,-1):
suma=0
for j in range(i+1,2):
suma+=A[i,j]*x[j]
x[i]=(b[i]-suma)/A[i,i]
print (x)
m=b[0,0]
p=b[1,0]
X2=np.arange(0,max(X),0.3)
C=np.zeros((n))
C=m*X2+p
Y2=C

plt.plot(X,Y,'m*',X2,Y2,'b-')
Descomposición LU
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 13 11:50:20 2019

@author: Karolina
"""
import numpy as np
from numpy import matrix

#Definición de la función:
def LU(A,I,b,n):

#Reducción de la matriz A e I

for j in range (0,n):


for i in range (j+1,n):
m=A[i,j]/A[j,j]
I[i,j]=m
for k in range (0,n):
A[i,k]=A[i,k]-(m*A[j,k])
d=np.zeros_like(b)
print I
print b
#Sustitución hacia adelante con L
for i in range(0,n):
suma=0
for j in range(i-1,-1,-1):
suma+=I[i,j]*d[j]

70
d[i]=b[i]-suma

print d

#Sustitución hacia atras con U para obtener vector solución


x=np.zeros_like(b)

for i in range(n-1,-1,-1):
suma=0
for j in range(i+1,n):
suma+=A[i,j]*x[j]
x[i]=(d[i]-suma)/A[i,i]

print x

##########################################
n=3
A=matrix([[3,-0.1,-0.2],
[0.1,7,-0.3],
[0.3,-0.2,10]])
b=np.array([[7.85],[-19.3],[71.4]])

I=np.identity(n)

LU(A,I,b,n)
Descomposición SVD
# -*- coding: utf-8 -*-
"""
Created on Thu May 2 07:19:35 2019

@author: Usuario
"""
import numpy as np
import scipy.linalg as la
import sympy as sp
print ("Matriz original")
A=np.array([[2,2],
[-1,1]])
print (A)
#Calcular transpuesta de A y obtener AA^{T}:
print ("Matriz transpuesta")
AT=np.transpose(A)
print (AT)

71
print ("Matriz AAT")
ATA=np.matmul(AT,A)
print (ATA)
#Calcular el polinomio caracterı́stico de AA^{T}
lamb=np.linalg.eigvals(ATA)
print ("Valores propios:")
print (lamb)
n=len(lamb)
#Calcular valores singulares
sig=np.zeros_like(lamb)
for i in range (0,n):
sig[i]=np.sqrt(lamb[i])
print ("Valores singulares")
print (sig)
eigvals, eigvecs=la.eig(ATA)
print("Vectores propios")
print ("Vector v1:")
print (eigvecs[0])
print ("Vector v2")
print (eigvecs[1])
Método de Jacobi
# -*- coding: utf-8 -*-
"""
Created on Tue Feb 5 09:27:48 2019

@author: Karolina Padilla Valdez


"""

###Método de Jacobi

import numpy
A = numpy.array([[10., -1., 2., 0.],
[-1., 11., -1., 3.],
[2., -1., 10., -1.],
[0.0, 3., -1., 8.]])

b = numpy.array([6., 25., -11., 15.])


print (A)
print (b)

N=10
n=4
x0=numpy.zeros_like((b))
x=numpy.zeros_l ike((b))
for k in range(0,N+1):

72
for i in range(0,n):
suma=0.0
for j in range(0,n):
if j!=i:
suma=suma+A[i,j]*x0[j]
x[i]=(b[i]-suma)/A[i,i]
x=x0
print ("Solución actúal:\n")
print (x)
k=k+1
Derivadas numéricas
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 4 07:52:03 2019

@author: Usuario
"""
#Derivadas
import numpy as np
import matplotlib.pyplot as plt
pi=np.pi
x=np.arange(0,2*pi,pi/4)
Y=np.sin(x)
Y2=np.cos(x)

plt.plot(x,Y,'r-',label="Sin(x)")

plt.plot(x,Y2,'m--',label="Cos(x)")
plt.title("Derivadas")
plt.xlabel("x")
plt.ylabel("y")
n=len(x)
#Diferencias adelantadas
dt=pi/4
XR=np.arange(0,(2*pi)-(pi/4),pi/4)
R=np.zeros_like(XR)
for i in range(0,n-1):
R[i]=(Y[i+1]-Y[i])/dt
plt.plot(XR, R,'y*',label="adelantadas")

#Diferencias atrasadas
L=np.zeros_like(XR)
for i in range(-1,n-2):
L[i]=(Y[i]-Y[i-1])/dt
plt.plot(XR,L,'g*',label="atrasadas")

73
#Diferencias centradas
M=np.zeros_like(x)
for i in range(-1,n-1):
M[i]=(Y[i+1]-Y[i-1])/(2*dt)
plt.plot(x,M,'b*',label="centradas")
plt.legend()
#Gráfica del error
##Error para las adelantadas:
err1=np.zeros_like(XR)
for i in range(0,n-1):
err1[i]=abs(Y2[i]-R[i])
print (err1)
plt.subplot(XR,err1)
EDOs
clear all

xo= 10*2*(rand(1,200)-0.5);
uo=100*2*(rand(1,200)-0.5);
yo= 20*2*(rand(1,200)-0.5);
vo=100*2*(rand(1,200)-0.5);

xo=[-100 100]; yo=[0 0]; uo=[50 -50]; vo=[0 0];

gv=-9.81; tf=200;

dt=0.01; N=tf/dt; to=0;


figure(1);clf

for k=1:N
t=to+dt;
xf=xo+uo*dt;
yf=yo+vo*dt;

dx=diff(xf);dy=diff(yf);
r=sqrt(dx.^2+dy.^2);
if r<5; uo=-uo; end

ind=find(yf<-200); vo(ind)=-vo(ind);
ind=find(yf> 200); vo(ind)=-vo(ind);
ind=find(xf<-200); uo(ind)=-uo(ind);
ind=find(xf> 200); uo(ind)=-uo(ind);

if mod(k,10)==0
clf

74
plot(xf(1),yf(1),'.r','MarkerSize',40)
hold on
plot(xf(2),yf(2),'.b','MarkerSize',40)
axis([-1 1 -1 1]*210);
drawnow
end

xo=xf;yo=yf;
end

75
Referencias
[1] CHAPRA, Steven C., et al., . Numerical methods for engineers.,Boston:
McGraw-Hill Higher Education,, 2010..

[2] BURDEN, Richard L.; FAIRES, J. Douglas; REYNOLDS, Albert


C. Numerical analysis Pearson,,2001.

[3] SALA, Jesús Javier Rodrı́guez. Introducción a la programación. Teorı́a


y práctica. 2003.

[4] MARZAL, A., GRACIA, I., Introducción a la programación con Python,


Departamento de lenguajes y sistemas informáticos. Universitat Jaume I.

[5] MARTINEZ AROZA,J. Interpolación Universidad de Granada. Dept. de


matemática aplicada. Recuperado :www.ugr.es/local/mateapli

[6] Dr. Horacio Martinez Alfaro Métodos numéricos 1997-2006. Re-


cuperado en: http://www.mty.itesm.mx/dtie/deptos/cb/cb00854-1/
Apuntes/HMA/MNIeI.pdf

[7] BUFFO, F., VERDIELL, A. La descomposición en valores singulares;


un enfoque geométrico y aplicaciones. Recuperado en: https://revistas.
unc.edu.ar/index.php/REM/article/download/10834/11431.
[8] Notas relacionadas de clase.

[9] Claudio VZ. GITHUB

76

Potrebbero piacerti anche