FIS045
Métodos Computacionais em física
Cap 5: Algebra linear
Prof. Gustavo Guerrero (sala 4120)
e-mail para enviar as listas de exercicios:
s045.ufmg@gmail.com
Universidade Federal de Minas Gerais
2017
Algebra linear
Nesse capitulo estudamos a forma de manipular matrices e vetores numéricamente. Usando esses objetos aprendemos como resolver sistemas de equações lineares que aparecem em muitas áreas da ciência. Mesmo estudando a forma de resolver sistemas de equações usando matrizes, a sugestão é usar bibliotecas de rotinas sosticadas que facilitam esse trabalho: e.x. LAPAC (http://www.netlib.org), Blitz++ (http://www.oonumerics.org), Armadilho (http://arma.sourceforge.org).
Lembrando as propriedades matemáticas das
matrizes
Trabalharemos com matrizes do tipo A de n × n elementos, sendo A real ou complexa. Ex:
, O inverso dessa matriz, se existe, é tal que A−1·A = I. a
ij se refer a um
elemento da matriz na la i e na columna j. Um vetor é um array unidimensional, x, da forma:
Propriedades das matrizes
,
I Uma matriz é diagonal sim: aij=0 para i 6= j. I upper triangular sim: aij =0 para i > j.
Propriedades das matrizes
I Lower triangular sim: aij=0
para i < j
I Tridiagonal sim: aij=0 para
|i − j| >1
1. Se o inverso de uma matriz A existe, A é não singular. 2. A equação Ax = 0, implica x = 0
3. 0 não é um autovalor de A .
4. As las de A formam uma base de Rn
Operações básicas com matrizes
I
Soma e substração: A = B ± C → a
ij= b
ij± c
ij.
,
I
Multiplicação de uma matriz por um escalar:
A = γB → a
ij= γb
ij,
I
Multiplicação de um vetor por uma matriz:
y = Ax → y
i=
P
nj =1a
ijx
j,
I
Multiplicação matriz-matriz: A = BC → a
ij=
P
nk=1
b
ikc
kj,
I
Transposção: A = B
T→ a
ij= b
ji,
I
Se A ∈ C
n×n, a conjugação resulta em: A = B
T→ a
ij= b
ji,
onde z = x − iy é o complexo conjugado de z = x + iy.
Operações básicas com vetores
I
Soma e substração: x = y ± z → x
i= y
i± z
i.
,
I
Multiplicação de um vetor por um escalar: x = γy → x
i= γy
i,
I
Multiplicação de um vetor por um vetor: x = yz → x
i= y
iz
i,
I
Produto escalar: c = y
Tz → a = P
nj =1y
jz
j,
I
Produto externo: A = yz
T→ a
ij= y
iz
j,
I
Norma de um vetor: ||x||
p= (|x
1|
p+ |x
2
|
p+ ... + |x
n|
p)
1/p.
I
Relação de Cauchy-Schwartz para todo x real ou complexo, o
produto interno satisfaz: |x
Ty| ≤ ||x||
2
||y ||
2, a partir da qual
temos
I
que para todos x e y, o produto escalar satisfaz
Declaração de matrizes e vetores
I em C++ usamos:
I em Fortran usamos:
Mas
CUIDADO
: C++ escreve primeiro as las e Fortran primeiro
as colunas
Assim, para somar duas matrizes
I em C++ usamos:
I em Fortran usamos:
Note que C++ começa contar os elementos de vetores e matrizes no 0, enquanto Fortran começa (por defeito) no 1. Assim o primeiro elemento de A em C++ será a[0][0] e em Fortram sera a(1, 1).
Para multiplicar duas matrizes
I em C++ usamos:
Alocação dinâmica de memôria
Em C++ criamos as matrizes assim:Uma vez utilizadas as apagamos da memoria
Em Fortran sao criadas usando ALLOCATABLE
Sistemas lineares
O problema mais básico a ser resolvido usando matrizes é do tipo: Ax = b , AN×N xN×1=bN×1
A melhor forma de resolver esse sistema é usando decomposição Gaussiana ou LU (lower-upper). Outro método é determinar a matriz inversa de A, e encontrar a solução multiplicando ambos os lados da equação por A−1:
x = A−1b ,
Se o problema a ser resolvido tém a forma: Ax = λx ,
sendo x desconhecido e λ um parâmetro desconhecido, o sistema é um problema de autovalores no qual a solução existe unicamente para certos valores de λ. Usamos a matriz identidade para reescrever a equação como:
O sistema tém a solução trivial x = 0. Há outra solução que requer a existência de uma condição que proibe multiplicar ambos os lados da equação acima por [A − λI]−1. (A condição da não existência do
inverso). Essa condição é cumplida quando: det[A − λI] = 0 ,
Os valores de λ que satisfazem essa condição são os autovalores procurados.
Nesse caso são necessárias rotinas que calculem o determinante de uma matriz e os zeros de um sistema de equações.
Eliminação Gaussiana
Nosso sistema de equações é:Ax = w , D AN×N xN×1=wN×1
A ideia é usar a primeira equação para eliminar x1 das n − 1 equações
restantes. Logo, usamos a segunda equação para eliminar x2 das n − 2
equações restantes. Com n − 1 eliminações do tipo encontramos uma matriz triangular da forma:
Para chegar ao sistema upper triangular começãmos elimnando x1para
j =2, ..., n. Fazemos isso multiplicando x1 por aj1/a11 e depois
substraindo o resultado da equação jesima. Para o caso teremos:
Com b1k = a(1k1)para k = 1, ..., n. Os outros coecientes serão:
a(jk2)= ajk(1)−a (1) j1a (1) 1k a(111) , j , k =2, ..., n.
O novo lado direito da equação será: y1= w1(1), wj(2)= wj(1)−a (1) j1w (1) 1 a11(1) , j , k =2, ..., n.
O sistema de x1, ..., xn desconhecidos transforma-se assim num sistema
(n −1) × (n − 1). Uma expresão geral para substituição direta é:
Com m = 1, ..., n − 1, e para o lado direito:
Se valores pequenos (ou zeros) aparecem na diagonal da matriz, podem ser removidos reorganizando a matriz e os vetores permutando las e colunas. Esse procedimento se chama pivoting.
Decomposição LU (lower-upper)
É uma forma de eliminção Gaussiana. A ideia é decompor a matriz A em termos de uma matriz L com elementos só embaixo da diagonal, e uma matriz U contendo a diagonal e os elementos acima dela.
A matriz A tem decomposição LU se o determinante é diferente de zero. Se a factorização LU existe, e A é não singular, o determinante é dado por det{A} = u11u22...unn, a demonstração pode ser encontrada em G.
O algoritmo para obter as matrizes L e U é simples: começando pela primeira coluna, nosso exemplo (4 × 4) ca:
De onde podemos determinar os elementos: u11, l21, l31e l41. Da
segunda coluna temos:
De onde podemos determinar os elementos: u12, u22, l32e l42.
Um algoritmo para decompor uma matriz deve ter os seguintes passos: Começando pela primeira coluna,
para cada j. I Calculamos o primeiro elemento u1j= a1j I Calculamos os elementos uij, para i = 2, ..., j − 1. uij= aij− i −1 X k=1 likukj
I Depois calculamos a diagonal
da matriz ujj = ajj− j −1 X k=1 ljkukj I Finalmente calculamos os elementos lij, para i > j: lij= 1 ujj aij− j −1 X k=1 likukj ! .
Como usar a decomposição LU em sistemas lineares de
equações
Queremos resolver um sistema do tipo: Ax = w, ou,
Usando a decomposição LU escrevemos:
Ax = LUx = w
Essa equação pode ser calculada em dois passos:
Determinante e inverso de uma matriz
A denição básica do determinante é:
Já calcular o inverso de uma matriz de una matriz n × n é mais
difícil: precisamos calcular o cofactor complementario a
ijpara cada
elemento a
ij. Este é o determinante de ordem (n − 1) obtido
cobrindo a la i e a coluna j na qual o elemento a
ijaparece. O
inverso é então a transposta da matriz com elementos (−)
i +jaij
.
Para uma matriz 3 × 3 :
O determinante é (veja exemplo no quadro):
Note que para calcular essa matriz precisamos calcular n2determinantes.
Usando o a decomposição LU da matriz A é mais simples encontrar o determinante.
det{A} = det{L} × det{U} = det{U}
pois os elementos da diagonal de L sao igual a 1. Logo o determinante pode ser calculado como
det{A} =
N
Y
k=1
ukk.
Encontrar a inversa de uma matriz consiste agora em resolver um grupo de equações lineares. Note que se a inversa da matriz existe, A−1A = I.
Que pode ser escrito como:
LUA−1=I .
Podemos então assumir que a primeira coluna da matriz inversa pode ser escrita como um vetor com componentes desconhecidas:
Podemos então assumir que a primeira coluna da matriz inversa pode ser escrita como um vetor com componentes desconhecidas:
Sistema tridiagonal de equações
Um sistema linear de equações da forma:Au = f , Onde A é uma matriz tridiagonal da forma:
Um algoritmo para resolver o sistema tridiagonal faz O(n) opearações, enquanto eliminação Gaussiana requer 2n3/3 + O(n2). Pode ser escrito
Interpolação cubic splines
Permite encontrar valores intermediarios em um conjunto de dados usando polinomios cubicos.
Assuma que temos n + 1 pontos, x0, x1, ..., xn, tal que x0< x1< ... < xn.
Uma função spline, s de ordem k, com n + 1 pontos é denida como:
I Em cada sub-intervalo [xi −1, xi), s é um polinomio de grau k. I s têm k − 1 derivadas continuas no intervalo total [x0, xn].
A função spline mais comum é aquela com k = 3, ou spline cúbico. Se alem dos n + 1 pontos temos os valores da função
y0= f (x0), y1= f (x1), ..., yn= f (xn). Por denição, os polinomios
devem interpolar o mesmo ponto:
si −1(xi) = yi= si(xi) ,
Com 1 ≤ i ≤ n − 1. No total temos n polinomios do tipo: si(x ) = ai0+ ai1x + ai2x2+ ai3x3,
o que implica que teremos 4n coecientes para determinar. Cada sub-intervalo possui duas condições:
yi= s(xi) e yi +1= s(xi +1) ,
Já que s0 e s00 são continuas, temos:
si −0 1(xi) = si0(xi) ,e si −001(xi) = si00(xi)
proporcionando n − 1 e n − 1 condições, respetivamente. No total temos 4n coecientes e 4n − 2 equações, precisamos ainda determinar 2 graus de liberdade.
Partindo da ultima equação denimos dois valores para a segunda derivada:
si00(xi) = fi ,e si00(xi +1) = fi +1
Uma linha reta entre os pontos fi e fi +1é:
Substituindo as condições si(xi) = yi e si(xi +1) = yi +1na equação acima,
podemosdeterminar as constantes c e d, o que resulta em:
Mas como determinamos as segundas derivadas fi e fi +1? Usando a
condição de continuidade para a primeira derivada: si −0 1(xi) = si0(xi) ,
Finalmente fazemos a mudança de viriável: ui=2()hi+ hi −1,
νi= h6
i(yi +1− yi) −
6
hi −1(yi− yi −1), podemos re-escrever o problme
como um conjunto de equações que pode ser resolvido usando eliminação Gaussiana para uma matriz tridiagonal.
Exercicios, entrega: Maio 5 de 2017
1. (a) Escreva uma função que calcule o inverso de uma matriz usando decomposição LU. (b) Depois escreva um programa que utilize esta função para calcular o inverso da seguinte matriz:
A = +4 −2 +1 +3 +6 −4 +2 +1 +8
Verique que sua resposta esta correta fazendo AA−1=I, e
A−1A = I para isso, utilize o programa para multiplicar matrizes.
2. Utilizando a matriz A, resolva agora sistemas de equações Ax = b, para os 3 casos seguintes:
b1= (+12, −25, +32) , b2= (+4, −10, +22) , b3= (+20, −30, +40)
As respostas devem ser:
x1= (+1, −2, +4) , x2= (+0.312, −0.038, +2.677) ,