ecuaciones algebraicas lineales - ayudasingenieria.com 3... · ecuaciones algebraicas lineales y la...
Post on 24-Sep-2019
37 Views
Preview:
TRANSCRIPT
Ecuaciones algebraicas lineales
a11 x1a12 x2...a1n xn=b1
a21 x1a22 x2...a2n xn=b2
........... ..........an1 x1an2 x2...ann xn=bn
● Nos interesa resolver el sistema:
Ecuaciones algebraicas lineales y la práctica de la Ingeniería
● Dos tipos de problemas:
a) Solución de sistemas discretos o agrupados
b) Solución de sistemas continuos a través de ED
Solución de pequeños sistemas de ecuaciones
● Método gráfico● Regla de Cramer (determinantes)● Sustitución
Eliminación hacia adelante
● Se multiplica la ecuación 1 (fila pivote) por
a22−a21
a11
a12 x2 ... a2n−a21
a11
a1n xn=b2−a21
a11
b1
f 21=a21
a11
Y se resta a la ecuación 2 para obtener
oa'22 x2 ...a'2n xn=b'2
Eliminación hacia adelante
● Es decir, F '2=F2−a21
a11
F1
● Se procede igual con las restantes filas,
F '3=F3−a31
a11
F1 ; ... ; F 'n=Fn−an1
a11
F1
Para obtener a11 x1a12 x2 ...a1n xn=b1
a'22 x2...a'2n xn=b'2
a'32 x2 ...a'3n xn=b'3
........... .......... a'n2 x2 ...a'nn xn=b'n
Eliminación hacia adelante
● Se toma como fila pivote la 2, y se efectúan las operaciones
F ' '3=F '3−a32
a22
F '2 ; ... ; F ' 'n=F 'n−an2
a22
F '2
Para obtener a11 x1a12 x2a13 x3 ...a1n xn=b1
a'22 x2a'23 x3 ...a'2n xn=b'2
a' '33 x3 ...a' '3n xn=b' '3
........... .......... a' 'n3 x3 ...a' 'nn xn=b' 'n
Eliminación hacia adelante● Se continúa de esta forma hasta tomar la
(n-1)ésima ecuación como pivote, efectuar
Fnn−1=Fn
n−2−an , n−1
an−1, n−1
Fn−1n−2
Y obtener
a11 x1a12 x2a13 x3...a1n xn=b1
a'22 x2a'23 x3 ...a'2n xn=b'2
a' '33 x3...a' '3n xn=b' '3
........... .......... ann
n−1 xn=bnn−1
Eliminación hacia adelante
● Es decir,
[a11 a12 a13 ... a1n
0 a ' 22 a ' 23 ... a ' 2n
0 0 a ' ' 33 ... a ' ' 3n
... ... ... ... ...0 0 0 ... ann
n−1 ]⋅{x1
x2
x3
...x n
}= {b1
b ' 2
b ' ' 3
...bnn−1
}
Sustitución hacia atrás
● De la última ecuación, xn=bnn−1
annn−1
● De la ecuación n-1, xn−1=bn−1n−2−an−1, n
n−2 xn
an−1, n−1n−2
● En general,
xi=
bi i−1− ∑
j= i1
n
aij i−1 x j
aii i−1
Con i = n-1, n-2, ..., 2, 1
Costo computacional (9.2.1)
● Se demuestra que el número de operaciones requeridas es del orden de
limn→∞ [
2 n3
3+O(n2)⏟
eliminación hacia adelante
+n2
2+O(n)⏟
sustitución hacia atrás] =
2 n3
3+O(n2)
Pseudocódigo
Jjjjjjjjjjjjjjjjjjjjjjj
leer A, b; iniciar n # n: número de filas de Ainiciar x en cero # x: vector de longitud n # eliminación hacia adelanterepetir para i desde 1 hasta n1:
repetir para j desde i+1 hasta n:factor = A(j,i) / A(i,i) repetir para k desde i hasta n:
A(j,k) = A(j,k) factor * A(i,k)b(j) = b(j) – factor * b(i)
# sustitución hacia atrás x(n) = b(n) / A(n,n) repetir para i desde n1 hasta 1 cada 1:
x(i) = b(i) repetir para j desde i+1 hasta n:
x(i) = x(i) – A(i,j) * x(j) x(i) = x(i) / A(i,i)
mostrar x
Pseudocódigo (versión 2)
Jjjjjjjjjjjjjjjjjjjjjjj
leer A, b; iniciar n # n: número de filas de Ainiciar x en cero # x: vector de longitud n a = [A b] # a: matriz aumentada # eliminación hacia adelanterepetir para i desde 1 hasta n1:
repetir para j desde i+1 hasta n:factor = a(j,i) / a(i,i) repetir para k desde i hasta n+1:
a(j,k) = a(j,k) factor * a(i,k)
# sustitución hacia atrás x(n) = a(n,n+1) / a(n,n) repetir para i desde n1 hasta 1 cada 1:
x(i) = a(i,n+1) repetir para j desde i+1 hasta n:
x(i) = x(i) – a(i,j) * x(j) x(i) = x(i) / a(i,i)
mostrar x
Ejemplo 9.5 pág. 258
● Resolver por Eliminación de Gauss
3 x1−0.1 x2−0.2 x3=7.850.1 x1+7 x2−0.3 x3=−19.30.3 x1−0.2 x2+10 x3=71.4
Ejemplo 9.5 pág. 258
● Código en Octave (opción 1): gauss.m
● Código en Octave (opción 2): gauss2.m. Se utilizan for implícitos.
● Código en Python (opción 1): gauss.py. Se usan listas para construir la matriz y los vectores.
● Código en Python (opción 2): gauss2.py. Se usan arreglos de Numpy en lugar de listas.
● Código en Python (opción 3): gauss3.py Basado en gauss3.py, pero se trabaja con una matriz aumentada. Es el equivalente en Python de gauss.m
● Código en Python (opción 4): gauss4.py. Se emplean for implícitos. Es el equivalente en Python de gauss2.m
Dificultades en los métodos de eliminación
● División por cero:
● Errores de redondeo● Sistemas mal condicionados
2 x2+3 x3= 8 4 x1+6 x2+7 x3=−3 2 x1+ x2+6 x3= 5
Sistemas mal condicionados
● Pequeños cambios en los coeficientes provocan grandes cambios en las soluciones
Bien condicionado Mal condicionado
Técnicas para mejorar las soluciones
● Uso de más cifras significativas● Reduce errores de redondeo
● Pivoteo● Evita la división por cero● Reduce los errores de redondeo
● Escalamiento● Gran diferencia de magnitud entre distintos
coeficientes
Pivoteo
● Antes de de normalizar cada renglón se determina el coeficiente más grande (en valor absoluto) por debajo del pivote; y se intercambia, de modo que los pivotes sean los elementos de mayor valor absoluto.
● Ejemplo 9.9, pag. 268. Resolver por eliminación de Gauss sin y con pivoteo
0.0003 x13.0000 x2=2.00011.0000 x11.0000 x2=1.0000
Eliminación de Gauss con Pivoteo: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Ainiciar x en cero # x: vector de longitud n a = [A b] # a: matriz aumentada # eliminación hacia adelanterepetir para i desde 1 hasta n1:
## inicio pivoteo parcial para la fila i # en la fila p está el |máximo| de la columna i # busca |máximo| en columna i desde fila pivote ip = i ; mayor = abs(a(i,i))repetir para ii desde i+1 hasta n:
candidato = abs(a(ii,i))si candidato > mayor:
mayor = candidatop = ii # |máximo| está en la fila ii
# pivotea filas p e i si |máximo| no está en la fila isi p es distinto de i:
repetir para jj desde i hasta n+1:temp = a(p,jj)
a(p,jj) = a(i,jj) a(i,jj) = temp
## fin pivoteo parcial para la fila i
Eliminación de Gauss con Pivoteo: Pseudocódigo
(continuación)## fin pivoteo parcial para la fila i repetir para j desde i+1 hasta n:
factor = a(j,i) / a(i,i) repetir para k desde i hasta n+1:
a(j,k) = a(j,k) factor * a(i,k)
# sustitución hacia atrás x(n) = a(n,n+1) / a(n,n) repetir para i desde n1 hasta 1 cada 1:
x(i) = a(i,n+1) repetir para j desde i+1 hasta n:
x(i) = x(i) – a(i,j) * x(j) x(i) = x(i) / a(i,i)
mostrar x
Este pseudocódigo se construyó a partir del correspondiente a la eliminación de Gauss (versión 2). Se resaltó en negrita el código agregado.
Ejemplo
● Código en Octave: gaussPiv.m ● Código en Python: gaussPiv.py
● Resolver por Eliminación de Gauss con Pivoteo
0.1 x1+7 x2−0.3 x3=−19.30.3 x1−0.2 x2+10 x3=71.43 x1−0.1 x2−0.2 x3=7.85
Escalamiento
● Se aplica cuando hay diferencias importantes entre coeficientes del sistema, lo que ocurre comúnmente en problemas de la Física (unidades).
● Se divide cada renglón del sistema por su coficiente de mayor valor absoluto.
● Ejemplo 9.10, pag. 270. Resolver sin y con escalamiento
2 x1100000 x2=100000x1 x2=2
Ejemplo: Pivoteo y Escalamiento
Resolver por Eliminación de Gauss con Pivoteo y Escalamiento el sistema Ax=b:
Matriz aumentada Factores de escalamiento
Se busca el máximo relativo (en valor absoluto) de la columna 1:
Se pivotean las filas 1 y 2 de [A|b] y de s:
Se normalizan las filas 2 y 3:
Se busca el máximo relativo (en valor absoluto) de la columna 2:
Se pivotean las filas 2 y 3 de [A'|b'] y de s:
Se termina la eliminación hacia adelante:
Se realiza la sustitución hacia atrás para obtener:
● Código en Octave: gaussPivEsc.m ● Código en Python: gaussPivEsc.py
Eliminación de Gauss con Pivoteo y Escalamiento: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Ainiciar x, s en cero # x, s: vectores de longitud n a = [A b] # a: matriz aumentada
# Se determinan los factores de escalado# (elementos de mayor valor absoluto en cada fila de A)repetir para i desde 1 hasta n:
s(i) = abs(A(i,1))repetir para j desde 2 hasta n:
si abs(A(i,j)) > s(i):s(i) = abs(A(i,j))
# eliminación hacia adelanterepetir para i desde 1 hasta n1:
## inicio pivoteo parcial escalado para la fila i # en la fila p está el |máximo relativo| de la columna i # busca |máximo relativo| en columna i desde fila pivote ip = i ; mayor = abs(a(i,i)/s(i))repetir para ii desde i+1 hasta n:
candidato = abs(a(ii,i)/s(ii))si candidato > mayor:
mayor = candidatop = ii # |máximo relativo| está en fila ii
# pivotea filas p e i de la matriz aumentada a y del # vector s si |máximo relativo| no está en la fila i
Eliminación de Gauss con Pivoteo y Escalamiento: Pseudocódigo
(continuación) # vector s si |máximo relativo| no está en la fila i si p es distinto de i:
temp = s(p) s(p) = s(i) s(i) = temp
repetir para jj desde i hasta n+1:temp = a(p,jj)
a(p,jj) = a(i,jj) a(i,jj) = temp
## fin pivoteo parcial escalado para la fila i repetir para j desde i+1 hasta n:
factor = a(j,i) / a(i,i) repetir para k desde i hasta n+1:
a(j,k) = a(j,k) factor * a(i,k)
# sustitución hacia atrás x(n) = a(n,n+1) / a(n,n) repetir para i desde n1 hasta 1 cada 1:
x(i) = a(i,n+1) repetir para j desde i+1 hasta n:
x(i) = x(i) – a(i,j) * x(j) x(i) = x(i) / a(i,i)
mostrar x
Costo Computacional
El pivoteo parcial y el escalamiento agregan al método de eliminación de Gauss simple:
32
n(n−1)n(n+1)
2−1 comparaciones divisiones
Por lo tanto, el tiempo de cálculo para resolver un sistema con n elevado no aumenta significativamente.
Si se tuviera que calcular s cada vez que se debe determinar un elemento pivote, se realizarían:
13
n(n2−1)⇒O(n3
/ 3) comparaciones !!!
Los factores de escalamiento se eligen una sola vez.
Ejemplo 9.11
● Un equipo de tres paracaidistas está unido por una cuerda ligera mientras cae a 5 m/s. Calcule la tensión en cada sección de la cuerda y la aceleración del equipo
Paracaidista Masa, kg Coef. de arrastre, kg/s
1 70 10
2 60 14
3 40 17
Ejemplo 9.11
● A partir de los diagramas de cuerpo libre de cada paracaidista,
● Se plantea la segunda ley de Newton para cada uno:
Ejemplo 9.11
● Reemplazando y reordenando,
m1 g−T− c1 v =m1 am2 gT−c2 v−R=m2 am3 g −c3 vR=m3 a
[70 1 060 −1 140 0 −1 ] {
aTR }= {
636518307 }
Descomposición LU
● Es más eficiente que la eliminación de Gauss cuando deben resolverse numerosos sistemas con los mismos coeficientes [A], pero distintos términos {B}
● La propia eliminación de Gauss se puede expresar como una descomposición LU
Descomposición LU
● Sea un sistema de ecuaciones
[ A ] {X}={B} ⇒ [ A] {X }−{B}=0
Que pueda expresarse de la forma
[u11 u12 u13
0 u22 u23
0 0 u33] {
x1
x2
x3}= {
d1
d2
d3} ⇒ [U ]{X }−{D}=0
Luego de la eliminación hacia adelante de Gauss.
Descomposición LU
Y que existe una matriz [L] de la forma
L= [1 0 0l21 1 0l31 l32 1 ]
Tal que
[L ] {[U ] {X }−{D}}=[ A] {X}−{B}
Por lo tanto
[L ] [U ]=[ A] , [ L] {D}={B}
Descomposición LU con eliminación de Gauss
● Se puede demostrar que
U= [a11 a12 a13
0 a ' 22 a ' 23
0 0 a ' ' 33] , L= [
1 0 0f 21 1 0f 31 f 32 1 ]
donde
a ' 22=a22− f 21 a12 ; a ' 23=a23− f 21 a13
a ' ' 33=a33− f 31 a13− f 32 a ' 23
y f 21=a21
a11
, f 31=a31
a11
, f 32=a ' 32
a ' 22
Ejemplo 10.1
● Obtenga una descomposición LU para la matriz del ejemplo 9.5
[3 −0.1 −0.2
0.1 7 −0.30.3 −0.2 10 ] {
x1
x2
x3}= {
7.85−19.371.4 }
Solución del sistema
● Sustitución hacia adelante para resolver
[L ] {D}={B}
d i=bi−∑j=1
i−1
l ij d j=bi−∑j=1
i−1
f ij d j , i=2,3 , ... , n
d1=b1
Solución del sistema
● Sustitución hacia atrás para resolver
[U ] {X}={D}
xi=
d i− ∑j= i1
n
uij x j
uii
, i=n−1, n−2,... ,1
xn=dn
unn
Ejemplo 10.2
● Encontrar la solución del problema 10.1
[3 −0.1 −0.2
0.1 7 −0.30.3 −0.2 10 ] {
x1
x2
x3}= {
7.85−19.371.4 }
● Código en Octave para descomposición LU: descLU.m
● Código en Python para descomposición LU: descLU.py
Costo computacional
● El trabajo total es igual a la Eliminación de Gauss,
2 n3
3On2
● Sólo que se distribuye en partes iguales entre la descomposición y la sustitución
Eliminación de Gauss con Descomposición LU: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Acrear L # matriz identidad con n filasiniciar x en cero # x: vector de longitud n copiar A en U, x en d # descomposición de Arepetir para i desde 1 hasta n1:
repetir para j desde i+1 hasta n:L(j,i) = U(j,i) / U(i,i)repetir para k desde i hasta n:
U(j,k) = U(j,k) – L(j,i) * U(i,k)
# sustitución hacia adelante d(1) = b(1) repetir para i desde 2 hasta n:
d(i) = b(i) repetir para j desde 1 hasta i1:
d(i) = d(i) – L(i,j) * d(j)
Eliminación de Gauss con Descomposición LU: Pseudocódigo
(continuación)
# sustitución hacia atrás x(n) = d(n) / U(n,n) repetir para i desde n1 hasta 1 cada 1:
x(i) = d(i) repetir para j desde i+1 hasta n:
x(i) = x(i) – U(i,j) * x(j) x(i) = x(i) / U(i,i)
mostrar x
Descomposición LU con Pivoteo
● Si en la descomposición LU de se pivotean filas, ya no se cumple que .
Se cumple
donde es una matriz de permutación.
[L ][U ]=[A]
[L ] [U ]=[ P ] [ A]
● Al inicio de la descomposición , y cada vez que se pivotean filas para hallar y , se hace lo mismo con las respectivas filas de .
[U ][L ]
[A]
[P ]
[P ]
[P ]=[ I ]
Eliminación de Gauss con Descomposición LU con Pivoteo
Cuando se usa la descomposición LU con pivoteo junto con la eliminación de Gauss, el vector a utilizar en la sustitución hacia adelante es :
[L ] {D}=[ P ] {B}⏟{C}
{C }
Ejemplo
Resolver por Eliminación de Gauss con Descomposición LU con Pivoteo:
0.1 x1+7 x2−0.3 x3=−19.30.3 x1−0.2 x2+10 x3=71.43 x1−0.1 x2−0.2 x3=7.85
[A]= [0.1 7 −0.30.3 −0.2 103 −0.1 −0.2 ] {B}= {
−19.371.47.85 } [P ]= [
1 0 00 1 00 0 1 ]
1) Descomposición LU con pivoteo de la matriz [A]:
● El máximo (en valor absoluto) de la columna 1 está en la fila 3. Se pivotean las filas 1 y 3, de [A] y de [P]:
● Se normalizan las filas 2 y 3 de [A]:
[A]= [3 −0.1 −0.2
0.3 −0.2 100.1 7 −0.3 ] [P ]= [
0 0 10 1 01 0 0 ]
l21=a21 /a11=0.1 l31=a31/a11=0.0333
[A' ]= [3 −0.1 −0.20 −0.19 10.020 7.0033 −0.2933 ] [L ]= [
1 0 00.1 1 0
0.0333 l32 1 ]
● El máximo (en valor absoluto) de la columna 2 está en la fila 3. Se pivotean las filas 2 y 3 de [A'] , [P] y l21 con l31:
● Se normaliza la fila 3 de [A']:
[P ]= [0 0 11 0 00 1 0 ]
l32=a ' 32/a ' 22=−0.02713
[A' ]= [3 −0.1 −0.20 7.0033 −0.29330 −0.19 10.02 ] [L ]= [
1 0 00.0333 1 0
0.1 l32 1 ]
● Finalizando la descomposición:
● Se verfica que:
[P ]= [0 0 11 0 00 1 0 ]
[U ]= [3 −0.1 −0.20 7.0033 −0.29330 0 10.0120 ]
[L ]= [1 0 0
0.0333 1 00.1 −0.02713 1 ]
[P ][A]=[L ][U ]
2) Sustitución hacia adelante:
donde
● Se obtiene:
[L ]{D}=[P ]{B}⏟{C }
{C}= [0 0 11 0 00 1 0 ] {
−19.371.47.85 }= {
7.85−19.371.4 }
[1 0 0
0.0333 1 00.1 −0.02713 1 ] {
d 1
d 2
d 3}= {
7.85−19.371.4 }
{d1
d 2
d3}= {
7.85−19.561770.0843 }
3) Sustitución hacia atrás:
● Solución:
[U ]{X }={D}
[3 −0.1 −0.20 7.0033 −0.29330 0 10.0120 ] {
x1
x2
x3}= {
7.85−19.561770.0843 }
{x1
x2
x3}= {
3−2.5
7 }● Código en Octave: descLUPiv.m ● Código en Python:
módulo gaussLUPiv.py programa principal ejemploGaussLUPiv.py
● Pseudocódigo: DescomposicionLUPiv.pdf
● Los métodos de eliminación vistos también se programaron en Python de forma modular utilizando subprogramas:
( ver carpeta ProgramasModulares )
Matriz Inversa
● Es aquella que satisface
[ A ] [ A]−1=[ A]−1
[ A]= I● Supongamos un sistema de 3 x 3. Para
calcular la primera columna de inv A, se resuelve el sistema
[a11 a12 a13
a21 a22 a23
a31 a32 a33] {a11−1
a21−1
a31−1 }= {
100 }
Matriz Inversa● para calcular la segunda columna de inv A,
[a11 a12 a13
a21 a22 a23
a31 a32 a33] {a12−1
a22−1
a32−1 }= {
010 }
● Y la tercera columna de inv A,
[a11 a12 a13
a21 a22 a23
a31 a32 a33] {a13−1
a23−1
a33−1 }= {
001 }
Matriz inversa
● Es decir, resolver n sistemas para una matriz de n x n● Como A no cambia, conviene usar el algoritmo de
descomposición LU visto
Ejemplo 10.3, pag. 293
● Código en Octave para el cálculo de la inversa: inversa.m
● Código en Python para el cálculo de la inversa: inversa.py
Cálculo de la Matriz Inversa: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Acrear L # matriz identidad con n filascrear invA # matriz cuadrada nula con n filasiniciar x en cero # x: vector de longitud n copiar A en U, x en d # descomposición de Arepetir para i desde 1 hasta n1:
repetir para j desde i+1 hasta n:L(j,i) = U(j,i) / U(i,i)repetir para k desde i hasta n:
U(j,k) = U(j,k) – L(j,i) * U(i,k)
# se calcula la matriz inversa invA# z es el número de columna de invA a calcularrepetir para z desde 1 hasta n:
iniciar b en cero # b: vector columna de longitud nb(z) = 1 # b es la columna z de la matriz identidad
# sustitución hacia adelante d(1) = b(1) repetir para i desde 2 hasta n:
d(i) = b(i) repetir para j desde 1 hasta i1:
d(i) = d(i) – L(i,j) * d(j)
Cálculo de la Matriz Inversa: Pseudocódigo
(continuación) # sustitución hacia atrás # se calcula x: columna z de la matriz inversax(n) = d(n) / U(n,n) repetir para i desde n1 hasta 1 cada 1:
x(i) = d(i) repetir para j desde i+1 hasta n:
x(i) = x(i) – U(i,j) * x(j) x(i) = x(i) / U(i,i)
# se copian los elementos x(i) en la columna z de invArepetir para i desde 1 hasta n:
invA(i,z) = x(i)
mostrar invA
Este pseudocódigo se construyó a partir del correspondiente a la eliminación de Gauss con descomposición LU. Se resaltó en negrita el código agregado.
Sistemas mal condicionados
● Cuatro formas de detectar el mal condicionamiento:● Escalar la matriz A e invertirla. Observar si hay
elementos mucho mayores a 1● Multiplicar la inversa de A por A y estimar qué tan
lejos está el resultado de I● Invertir la inversa y estimar qué tan lejos está el
resultado de A● Calcular el número de condición de A, cond[A]
Normas vectoriales y matriciales
● Proporciona una medida del tamaño o "longitud" de una matriz o vector
● Por ejemplo, el módulo de un vector es una norma
Normas de vectores y matrices
● Vectores ● Matrices
∥X∥e=∑i=1
n
x i2
Norma euclideana
∥A∥e=∑i=1
n
∑j=1
n
aij2
Norma de Frobenius
∥X∥1=∑i=1
n
∣x i∣
∥X∥∞=maxi=1
n
∣x i∣
∥A∥1=maxj=1
n
∑i=1
n
∣aij∣
∥A∥∞=maxi=1
n
∑j=1
n
∣aij∣
Ejemplo 10.4
● Calcular el número de condición de la matriz de Hilbert de rango 3
[A]= [1
12
13
12
13
14
13
14
15
]
Matrices bandeadas
● Aparecen en la solución numérica de EDs
● Eliminación de Gauss o descomposición LU son ineficientes
Sistemas tridiagonales
[f 1 g1
e2 f 2 g2
e3 f 3 g3
. . .. . .
. . .en−1 f n−1 gn−1
en f n
] {x1
x2
x3
.
.
.xn−1
xn
}= {r1
r2
r3
.
.
.r n−1
r n
}● Se almacenan 4 vectores de O(n) en lugar de
una matriz de O(n²) esencialmente llena de ceros
Algoritmo de Thomas
Un método de descomposición LU eficiente para sistemas tridiagonales
● Almacenamiento de la matriz A en tres vectores
repetir para i desde 1 hasta n:
f(i) = A(i,i)
si i es distinto de 1:
e(i) = A(i,i1)
si i es distinto de n:
g(i) = A(i,i+1))
● Descomposición repetir para k desde 2 hasta n:
e(k) = e(k) / f(k1)
f(k) = f(k) e(k)*g(k1)
● Sustitución hacia adelante repetir para k desde 2 hasta n:
r(k) = r(k) e(k)*r(k1)
● Sustitución hacia atrás
x(n) = r(n) / f(n) repetir para k desde n1 hasta 1 cada 1:
x(k) = (r(k) – g(k)*x(k+1)) / f(k)
Ejemplo 11.1 pag. 307
● Resolver el siguiente sistema tridiagonal con el algoritmo de Thomas
[2.04 −1−1 2.04 −1
−1 2.04 −1−1 2.04
] {T 1
T 2
T 3
T 4
}= {40.80.80.8
200.8}
● Código en Octave: thomas.m ● Código en Python: thomas.py
Matrices simétricas
● Son las que cumplen
aij=a ji , ∀ i , j
Es decir
[A]=[A]T
● Requieren la mitad de memoria de almacenamiento
● Una matriz [A] es definida positiva si:
{x }T [A]{x }>0 , ∀{x}≠0
Descomposición de Cholesky
● Si [A] es simétrica, puede descomponerse como
[A]=[L ][L ]T
● Se demuestra que, si además es definida positiva:
l ki=
aki−∑j=1
i−1
l ij l kj
l ii
, i=1,2 , ... , k−1
l kk=akk−∑j=1
k−1
lkj2
Descomposición de Cholesky: Pseudocódigo
leer matriz A # A: debe ser simétrica y definida positivainiciar n # n: número de filas de Ainiciar x en cero # x: vector de longitud n iniciar L en cero # L: matriz cuadrada de n filas
L(1,1) = sqrt(A(1,1)) repetir para k desde 2 hasta n:
repetir para i desde 1 hasta k1: L(k,i) = A(k,i) repetir para j desde 1 hasta i1:
L(k,i) = L(k,i) L(i,j)*L(k,j) L(k,i) = L(k,i)/L(i,i)
L(k,k) = A(k,k)repetir para j desde 1 hasta k1:
L(k,k) = L(k,k) L(k,j)^2 L(k,k) = sqrt(L(k,k))
mostrar L
Ejemplo 11.2, pag. 308
● Aplique la descomposición de Cholesky a la matriz simétrica
[A]= [6 15 5515 55 22555 225 979 ]
Algoritmo de Cholesky
● Código en Octave para la descomposición de Cholesky: cholesky.m
● Código en Python para la descomposición de Cholesky: cholesky.py
Métodos iterativos
● Sea el sistema
[A]{X }={B}
● Si es de 3 x 3, es posible despejar cada incógnita como
x1=b1−a12 x2−a13 x3
a11
x2=b2−a21 x1−a23 x3
a22
x3=b3−a31 x1−a32 x2
a33
Métodos iterativos
● En general,
x i=
bi−∑j=1
i−1
aij x j−∑j=i1
n
aij x j
aii
, i=1,2 , ... , n
● Se debe partir de un conjunto de valores iniciales para x (pueden ser cero). Se reemplazan en los miembros derechos para obtener los valores más actuales en los miembros izquierdos. Se repite hasta que
|εa , i|=|x ij−x i
j−1
xij |100%<εs , i=1,2,. .. , n
Métodos iterativos
● Método de Gauss-Seidel
xik =
bi−∑j=1
i−1
aij x jk −∑
j=i1
n
aij x jk−1
aii
, i=1,2 , ... , n
● Método de Jacobi
x ik =
bi−∑j=1
i−1
aij x jk−1− ∑
j=i1
n
aij x jk−1
aii
, i=1,2 , ... , n
Ejemplo 11.3 pag. 311
● Use los métodos de Gauss-Seidel y de Jacobi para resolver el sistema
[3 −0.1 −0.2
0.1 7 −0.30.3 −0.2 10 ] {
x1
x2
x3}= {
7.85−19.371.4 }
Ejemplo 11.3 pag. 311
● Solución con planilla de cálculo: seidel.ods
jacobi.ods ● Solución en Octave: seidel.m , jacobi.m● Solución en Python: gaussSeidel.py
exSeidel.py
jacobi.py
exJacobi.py
Método de Gauss-Seidel: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Ainiciar x, xAnt en cero # x, xAnt: vectores de longitud n iniciar iter=0, iterMax, ea(valor grande), tol
repetir mientras (ea>tol and iter<iterMax): xAnt = x mayor = 0repetir para i desde 1 hasta n:
x(i) = b(i)repetir para j desde 1 hasta n:
si i es distinto de j: x(i) = x(i) – A(i,j) * x(j)
x(i) = x(i) / A(i,i)# ea para la incógnita x(i)eaXi = abs((x(i)xAnt(i))/x(i))*100si eaXi > mayor:
mayor = eaXi ea = mayor # ea: mayor eaXi en una iteracióniter = iter + 1
mostrar x
Método de Jacobi: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Ainiciar x, xAnt en cero # x, xAnt: vectores de longitud n iniciar iter=0, iterMax, ea(valor grande), tol
repetir mientras (ea>tol and iter<iterMax): xAnt = x mayor = 0repetir para i desde 1 hasta n:
x(i) = b(i)repetir para j desde 1 hasta n:
si i es distinto de j: x(i) = x(i) – A(i,j) * xAnt(j)
x(i) = x(i) / A(i,i)# ea para la incógnita x(i)eaXi = abs((x(i)xAnt(i))/x(i))*100si eaXi > mayor:
mayor = eaXi ea = mayor # ea: mayor eaXi en una iteracióniter = iter + 1
mostrar x
Criterio de convergencia
● Se demuestra (11.2.1) que el método es convergente si [A] es diagonalmente dominante:
∣aii∣∑j=1j≠i
n
∣aij∣ , ∀ i
● Si no se puede cumplir lo anterior, al menos se intentará
∣aii∣=maxj=1
n
∣aij∣ , ∀ i
Criterio de convergencia
● Relajación
● λ = 1, el resultado no se modifica● λ < 1, subrelajación (desaceleración)● λ > 1, sobrerrelajación (aceleración)
xik = x i
k 1− x ik−1
Método de Gauss-Seidel con Relajación: Pseudocódigo
leer A, b; iniciar n # n: número de filas de Ainiciar x, xAnt en cero # x, xAnt: vectores de longitud n iniciar iter=0, iterMax, ea(valor grande), toliniciar lambda # (0< lambda <1: subrelajación)
# (1< lambda <2: sobrerrelajación)
repetir mientras (ea>tol and iter<iterMax): xAnt = x mayor = 0repetir para i desde 1 hasta n:
x(i) = b(i)repetir para j desde 1 hasta n:
si i es distinto de j: x(i) = x(i) – A(i,j) * x(j)
x(i) = x(i) / A(i,i)x(i) = lambda * x(i) + (1lambda) * xAnt(i)# ea para la incógnita x(i)eaXi = abs((x(i)xAnt(i))/x(i))*100si eaXi > mayor:
mayor = eaXi ea = mayor # ea: mayor eaXi en una iteracióniter = iter + 1
mostrar x
Uso de software
● Resolver el sistema
utilizando● Planilla de cálculo: planilla.ods● Python● Octave
[1 1/2 1/3
1 /2 1/3 1 /41 /3 1/4 1 /5 ] {
x1
x2
x3}= {
1+1/2+1/31/2+1/3+1/41/3+1 /4+1/5 }
Uso de software
Python + Numpy: función solve del módulo numpy.linalg
>>> from numpy import array
>>> from numpy.linalg import solve
>>> A = array([[1., 1/2., 1/3.], [1/2., 1/3., 1/4.], [1/3., 1/4., 1/5.]])
>>> A
array([[ 1. , 0.5 , 0.33333333],
[ 0.5 , 0.33333333, 0.25 ],
[ 0.33333333, 0.25 , 0.2 ]])
>>> b = array([[1.+1/2.+1/3.],[1/2.+1/3.+1/4.],[1/3.+1/4.+1/5.]])
>>> b
array([[ 1.83333333],
[ 1.08333333],
[ 0.78333333]])
>>> x = solve(A,b)
>>> x
array([[ 1.],
[ 1.],
[ 1.]])
Uso de software
Octave: función \
octave:1> A = [1 1/2 1/3; 1/2 1/3 1/4; 1/3 1/4 1/5]A = 1.00000 0.50000 0.33333 0.50000 0.33333 0.25000 0.33333 0.25000 0.20000
octave:2> b = [1+1/2+1/3; 1/2+1/3+1/4; 1/3+1/4+1/5]b = 1.83333 1.08333 0.78333
octave:3> x=A\bx = 1.00000 1.00000 1.00000
Uso de software
● Realizar la descomposición LU de:
utilizando● Python● Octave
[ 2 6 2−3 −8 0 4 9 2 ]
Uso de software
Python + Numpy + Scipy: función lu del módulo scipy.linalg
A = P * L * U descomposición LU con pivoteo en Scipy. P es una matriz de permutación.
>>> from numpy import array
>>> from scipy.linalg import lu
>>> A=array([[2., 6., 2.], [3., 8., 0.], [4., 9., 2.]])
>>> P, L, U = lu(A)
>>> L
array([[ 1. , 0. , 0. ],
[ 0.5 , 1. , 0. ],
[0.75 , 0.83333333, 1. ]])
>>> U
array([[ 4. , 9. , 2. ],
[ 0. , 1.5 , 1. ],
[ 0. , 0. , 2.33333333]])
>>> P
array([[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.]])
Uso de softwareOctave: función lu
P * A = L * U descomposición LU con pivoteo en Octave. P es una matriz de permutación.
Cuidado: las matrices de permutación de Octave (P) y de Scipy (P) son diferentes!! P = inv(P)
octave:1> A = [ 2 6 2; 3 8 0; 4 9 2];
octave:2> [L,U,P] = lu(A)
L =
1.00000 0.00000 0.00000
0.50000 1.00000 0.00000
0.75000 0.83333 1.00000
U =
4.00000 9.00000 2.00000
0.00000 1.50000 1.00000
0.00000 0.00000 2.33333
P =
Permutation Matrix
0 0 1
1 0 0
0 1 0
Uso de software
● Calcular la inversa y el número de condición de:
utilizando● Python● Octave
[1 1/2 1/3
1 /2 1/3 1 /41 /3 1/4 1 /5 ]
Uso de software
Python + Numpy: funciones inv y cond del módulo numpy.linalg
>>> from numpy import array, inf>>> from numpy.linalg import inv, cond
>>> A=array([[1., 1/2., 1/3.], [1/2., 1/3., 1/4.], [1/3., 1/4., 1/5.]])
>>> invA = inv(A)
>>> invA
array([[ 9., 36., 30.],
[ 36., 192., 180.],
[ 30., 180., 180.]])
>>> condA = cond(A)
>>> condA
524.05677758606441
>>> condA1 = cond(A,1) # se calcula con norma columna suma (norma 1)
>>> condA1
748.00000000000273
>>> condAInf=cond(A,inf) # se calcula con norma fila suma (norma infinita)
>>> condAInf
748.00000000000273
>>> condAFrob=cond(A,'fro') # se calcula con norma de Frobenius
>>> condAFrob
526.15882107972118
Uso de softwareOctave: funciones inv y cond
octave:1> A=[1 1/2 1/3; 1/2 1/3 1/4; 1/3 1/4 1/5]
octave:2> invA = inv(A)invA = 9.0000 36.0000 30.0000 36.0000 192.0000 180.0000 30.0000 180.0000 180.0000
octave:3> condA=cond(A)condA = 524.06octave:4> condA1=cond(A,1)condA1 = 748.00octave:5> condAInf=cond(A,Inf)condAInf = 748.00octave:6> condAFrob=cond(A,'fro')condAFrob = 526.16
Uso de software
● Realizar la descomposición de Cholesky de:
utilizando● Python● Octave
[A]= [6 15 5515 55 22555 225 979 ]
Uso de software
Python + Numpy: función cholesky del módulo numpy.linalg
>>> from numpy import array>>> from numpy.linalg import cholesky>>> A=array([[6.0, 15.0, 55.0],[15.0, 55.0, 225.0],[55.0, 225.0, 979.0]])>>> cholesky(A)array([[ 2.44948974, 0. , 0. ], [ 6.12372436, 4.18330013, 0. ], [ 22.45365598, 20.91650066, 6.11010093]])
Octave: función choloctave:35> A=[6 15 55; 15 55 225; 55 225 979]
A =
6 15 55
15 55 225
55 225 979
octave:36> chol(A)
ans =
2.44949 6.12372 22.45366
0.00000 4.18330 20.91650
0.00000 0.00000 6.11010
Sistema de reactores6 c1−c3=50
−3c13 c2=0
−c29 c3=160
−c2−8 c311c4−2 c5=0
−3c1−c24 c5=0
[6 0 −1 0 0−3 3 0 0 00 −1 9 0 00 −1 −8 11 −2−3 −1 0 0 4
] {c1
c2
c3
c4
c5
}= {500
16000
}
Análisis de un reticulado
● Nodo 1
∑ F H=−F1 cos30 °F3 cos60°F1h=0
∑ FV=−F1 sin 30°−F3 sin60 °F1v=0
● Nodo 2
∑ F H=F2F1 cos30°F2hH 2=0
∑ FV=F1 sin 30°F2vV 2=0
● Nodo 3
∑ F H=−F2−F3 cos60 °F3h=0
∑ FV=F3sin 60°F3vV 3=0
Análisis de un reticulado
[0.866 0 −0.5 0 0 0
0.5 0 0.866 0 0 0−0.866 −1 0 −1 0 0−0.5 0 0 0 −1 0
0 1 0.5 0 0 00 0 −0.866 0 0 −1
] {F1
F2
F3
H 2
V 2
V 3
}= {0
−10000000
}
Análisis de un circuito
● Ley de Kirchhoff
● Ley de Ohm
i12i52i32=0
−i54 R54−i43 R43−i32 R32i52 R52=0
i65−i52−i54=0
i43−i32=0i54−i43=0
−i65 R65−i52 R52i12 R12−200=0
Análisis de un circuito
[1 1 1 0 0 00 −1 0 1 −1 00 0 −1 0 0 10 0 0 0 1 −10 10 −10 0 −15 −55 −10 0 −20 0 0
] {i12
i52
i32
i65
i54
i43
}= {00000
200}
Sistemas masa-resorte
● Segunda ley de Newton
● En el reposo, a = 0
● Ley de Hooke
∑ F=m a
md2 xd t2 =F D−FU
F=k x
∑ F=0
Sistemas masa-resorte● Masa 1
2 k x2−x1m1 g−k x1=0● Masa 2
k x3−x2m2 g−2 k x2−x1=0● Masa 3
m3 g−k x3−x2=0
[3 k −2 k 0−2 k 3k −k
0 −k k ] {x1
x2
x3}= {
W 1
W 2
W 3}
[K ]{X }={W }
Sistemas masa-resorte
● Con m1 = 2 kg, m2 = 3 kg, m3 = 2.5 kg, k = 10 kg/s2,
[30 −20 0−20 30 −10
0 −10 10 ] {x1
x2
x3}={
19.629.424.5 }
Problemas 12.1 a 12.40 pag. 339
top related