Ecuaciones algebraicas lineales - ayudasingenieria.com 3... · Ecuaciones algebraicas lineales y la...

118
Ecuaciones algebraicas lineales

Transcript of Ecuaciones algebraicas lineales - ayudasingenieria.com 3... · Ecuaciones algebraicas lineales y la...

Ecuaciones algebraicas lineales

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

Orientación

Solución de pequeños sistemas de ecuaciones

● Método gráfico● Regla de Cramer (determinantes)● Sustitución

Eliminación de Gauss simple

● Dos pasos:

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 n­1:

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 n­1 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 n­1:

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 n­1 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 n­1:

## 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 n­1 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 n­1:

## 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 n­1 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 }

Problemas 9.1 a 9.18 pag. 279

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}

Pasos en la descomposición LU

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 n­1:

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 i­1:

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 n­1 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 }

Pasos en la descomposición LU con Pivoteo

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 n­1:

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 i­1:

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 n­1 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.

Problemas 10.1 a 10.8, pag. 303

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∣

Número de condición

● Se define como

cond [A ]=∥A∥⋅∥A−1∥1

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

]

Problemas 10.9 a 10.21

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,i­1) 

      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(k­1)

      f(k) = f(k) ­ e(k)*g(k­1)

● Sustitución hacia adelante    repetir para k desde 2 hasta n:

      r(k) = r(k) ­ e(k)*r(k­1)

● Sustitución hacia atrás

   x(n) = r(n) / f(n)    repetir para k desde n­1 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 k­1: L(k,i) = A(k,i) repetir para j desde 1 hasta i­1: 

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 k­1: 

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

Métodos iterativos

Gauss - Seidel Jacobi

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) + (1­lambda) * 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

Algoritmo de Gauss-Seidel con Relajación

● Código en Python: gaussSeidelRelax.py

exSeidelRel.py

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

Estudio de casos

Sistema de reactores

● Balance de masa

∑iQi⋅C isaliente=∑

iQ j⋅C j entrante

c3⋅3.5=2⋅251.5⋅10

Sistema de reactores

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

● Equilibrio de fuerzas

∑ F H=0

∑ FV=0

Análisis de un reticulado

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

∑ i=0

∑ iR=V

Análisis de un circuito

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

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

Lo más importante