Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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
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.
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:
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 .
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.
1: def ecuación(x):
2: return x3 + x2 + 2
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
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()
8
Figura 3: Gráfica usando comando plot
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
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()
11
Se obtiene el siguiente gráfico:
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.
13
Ejemplo:
Se tiene el siguiente sistema:
x+y−z =5
x+y =7
2x + 2y − z = 12
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.
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
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
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:
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
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
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
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
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 )
a11 x1 +a12 x2 +··· a1n xn = b1
a21 x1 +a22 x2 +··· a2n xn = b2
···
(1)
··· ··· ··· ···
an1 x1 an1 x2 +··· ann xn = bn
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
19
(k+1) 1 X (k)
xi = bi − aij xj (3)
aii
j6=i
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.
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.
(k+1) 1 X (k+1)
X (k)
xi = − a : ijxj − aij xj + bi (4)
aii
1≤j≤i i+1≤j≤n
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 || ≤ δ.
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
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:
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.
(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:
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 )
f (xi )
xi = xi − (9)
f 0 (xi )
26
Figura 7: Interpolación
Figura 8: Interpolación
27
Pn (xi ) = yi i = 0, · · · , n
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 :
28
Pn (xi ) = yi i = 0, · · · , n
N −1 N
Y x − xi X
Li = Pn (x) = Li yi
xi − xj i=1
j=1,j6=i
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
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:
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!
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.
f 00 (α)(x − α)2
T1 f (x; α) = f (α) + f 0 (α)(x − α) + (13)
2
32
Figura 10: Serie de Taylor
33
Para x0 = − π4
Para la gráfica x ∈ [−5, 5]
Para la primer iteración, se obtiene una lı́nea pendiente:
En lo sucesivo se obtiene:
34
Figura 13: Tercera iteración
y = ax + b
Donde a es la pendiente de la recta y b es la ordenada al origen de la recta.
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
1 = y1 − ax1 − b
2 = y2 − ax2 − b
3 = y3 − ax3 − b
..
.
n = yn − axn − n
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
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
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
s s
n(a, b) Sxx (a, b)
(a) = (b) =
(nSxx − Sx Sx )(n − 2) (nSxx − Sx Sx )(n − 2)
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
38
Figura 15: Ajuste lineal
[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.
[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
[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:
40
y reducción de la matriz se dan mediante los metodos ya conocidos de la elimi-
nación de Gauss:
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:
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
U × |{z}
A = |{z}
|{z} VT
S × |{z}
n×m n×n n×m m×m
Donde:
42
UT × U = |{z}
I VT × V = |{z}
I
n×n m×m
A × AT = (USVT )(VST UT )
= USST UT
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.
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
0,817 −0,576 0 0
0,576 0,817 0 0
u1 =
0
u2
=
0 u3
=
1u4
=
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
0,4045 −0,9145
v1 = v2 =
0,9145 0,4045
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:
√ √
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
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.
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.
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
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:
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:
4: end for
Algoritmo para diferencias centradas:
48
Figura 17: Derivada numérica
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.
50
Figura 19: Suma de Riemann
51
El área del rectángulo es aproximadamente
Z b
f (x)dx ≈ (b − a)f (b)
a
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:
53
Algoritmo para calcular la integral numérica mediante la regla del trapecio:
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
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.
Solución:
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.
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.
F (x, y, y 0 , · · · , y (n) ) = 0
Ejemplos:
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:
@author: Karolina
"""
import numpy as np
#Definición de la función
def Gauss(A,b,n):
print A
print b
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
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)
print('raiz: ',raiz)
# GRAFICA
import matplotlib.pyplot as plt
xi = tabla[:,2]
yi = tabla[:,5]
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()
@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
@author: Usuario
"""
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)
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
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
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
plt.style.use("ggplot")
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
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
70
d[i]=b[i]-suma
print d
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
###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.]])
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);
gv=-9.81; tf=200;
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..
76