• Nenhum resultado encontrado

Caderno de Física Computacional

N/A
N/A
Protected

Academic year: 2019

Share "Caderno de Física Computacional"

Copied!
29
0
0

Texto

(1)

Caderno de

Física Computacional

Métodos computacionais II

Álgebra matricial básica

Prof. Dr. Luís Fernando de Oliveira

Universidade do Estado do Rio de Janeiro – UERJ Centro de Tecnologia e Ciência – CTC

Instituto de Física Armando Dias Tavares – IFADT

(2)
(3)

Sumário

III Métodos computacionais em álgebra 1

3 Métodos em álgebra 3

3.1 Produto de matrizes . . . 3

3.2 Operações básicas . . . 4

3.3 Inversão de matrizes . . . 8

3.4 Determinante . . . 11

3.4.1 Regra de Sarrus . . . 11

3.4.2 Método deLaplace . . . 15

3.4.3 Eliminação deGauss . . . 17

3.5 Solução de sistemas lineares . . . 20

3.5.1 Método de eliminação de Gauss . . . 20

3.5.2 Método de fatoração LU . . . 20

3.6 Ajuste de dados pelo método dos mínimos quadrados. . . 20

3.6.1 Ajuste linear . . . 22

Códigos em Fortran 25

(4)
(5)

Parte III

Métodos computacionais em álgebra

(6)
(7)

3

Métodos em álgebra

3.1

Produto de matrizes

O produto de matrizes é resultado de um conjunto de operações de somatório entre linhas e colunas das matrizes envolvidas. Cada elemento da matriz resposta é resultado deste tipo de operação que se assemelha muito ao produto escalar.

Sejam as matrizesAm×p(mlinhas porpcolunas) eBp×n(plinhas porncolunas). O produto da matrizAporBgera como resultado a matrizC, isto é,Am×pBp×n=Cm×n. Como pode ser visto,Cpossuimlinhas encolunas. Cada elementocij da matrizCé resultado do produto da

i-ésima linha da matrizA pelaj-ésima coluna da matrizB. As linhas e colunas de uma matriz vistas isoladamente são como sequências simples de números, vetores formados porn-uplas, Daí a expressão do produto de uma linha por uma coluna ser equivalente ao produto escalar de duas sequências ou vetores. Assim, os elementos cij são o resultado da seguinte operação:

cij = p X k=1

aikbkj

onde o índiceiindica o produto da i-ésima linha deA pelaj-ésima coluna deB.

O Algoritmo 1 implementa o produto entre duas matrizes e o retorno da matriz resposta, todas passadas como argumentos. As matrizes devem ter sido alocadas devidamente antes de se utilizar este procedimento.

Algoritmo 1: Subrotina para produto entre matrizes.

SubrotinaProd_Mat (a,b,c,m,p,n)

declarar a[∗,∗],b[∗,∗],c[∗,∗]numéricos (por referência) {entradas: a, b; saída: c }

declarar m,p,n numéricos(por cópia) {dimensões das matrizes }

declarar i,j,k numéricos {variáveis contadoras }

1. paraide1 até m,fazer { para cada linhas de a } 2. | paraj de 1 atén,fazer { para cada coluna de b }

3. | | c[i, j]←0 { usando o próprio elemento como acumulador } 4. | | parakde 1até p,fazer

5. | | | c[i, j]←c[i, j] +a[i, k]∗b[k, j] 6. | | fim para

7. | fim para 8. fim para Fim subrotina

(8)

3.2

Operações básicas

Denomina-se como matrizes elementares as matrizes derivadas de uma matriz identidade cujas linhas foram manipuladas para produzir um efeito específico quando multiplicadas por outras matrizes.

O modelo base da matriz elementar, representada aqui como U, é a matriz identidade. As matrizes elementares dão suporte a três operações básicas:

1. multiplicação da i-ésima linha por um escalar β, representada pela seguinte notação:

LiβLi. Esta operação é obtida quandouii=β.

U= i           

1 0 · · · 0 · · · 0 0 1 · · · 0 · · · 0 ... ... ... ... ... 0 0 · · · β · · · 0 ... ... ... ... ... 0 0 · · · 0 · · · 1

           i

Exemplo: multiplicar a terceira linha da matriz Apor −2 (L3 ←(−2)L3):

    

1 0 0 0

0 1 0 0

0 0 −2 0

0 0 0 1

    

| {z }

U:L3←−2L3 ·     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

| {z }

A =     

3 0 −1

2 1 3

−6 −4 2 −1 5 −2

    

| {z }

U·A

2. permuta envolvendo ai-ésima e aj-ésima linha: LiLj. Esta operação é obtida quando

uij =uji = 1 euii=ujj = 0.

U= i j                 

1 0 · · · 0 · · · 0 · · · 0 0 1 · · · 0 · · · 0 · · · 0 ... ... ... ... ... ... 0 0 · · · 0 · · · 1 · · · 0 ... ... ... ... ... ... 0 0 · · · 1 · · · 0 · · · 0 ... ... ... ... ... ... 0 0 · · · 0 · · · 0 · · · 1

                 i j

Exemplo: permutar a segunda linha da matrizA com a última (L2 ↔L4):

    

1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0     

| {z }

U:L2↔L4 ·     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

| {z }

A =     

3 0 −1 −1 5 −2 3 2 −1

2 1 3

    

| {z }

U·A

(9)

5

é obtida quandouij =β.

U= i j                 

1 0 · · · 0 · · · 0 · · · 0 0 1 · · · 0 · · · 0 · · · 0 ... ... ... ... ... ... 0 0 · · · 1 · · · β · · · 0 ... ... ... ... ... ... 0 0 · · · 0 · · · 1 · · · 0 ... ... ... ... ... ... 0 0 · · · 0 · · · 0 · · · 1                  i

Exemplo: substituir a primeira linha da matriz A por ela menos a segunda (L1 ← L1+ (−1)L2):

    

1 −1 0 0

0 1 0 0

0 0 1 0

0 0 0 1

    

| {z }

U:L1←L1L2 ·     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

| {z }

A =     

1 −1 −4

2 1 3

3 2 −1 −1 5 −2

    

| {z }

U·A

As matrizes elementares podem ser combinadas na forma de uma sequência de produtos para produzir um resultado específico. Por exemplo, vamos transformar uma matrizAdada de tal maneira que a primeira coluna seja, ao final do processo, composta pelo valor 1 na posição

a11e os demais valores restantes na coluna sejam 0. Para isso, comecemos dividindo a primeira linha de A pelo valor contido em a11. Depois, combinaremos cada linha i de A, para i 6= 1,

com a primeira,i= 1, multiplicada pelo primeiro valor da linha i, ou seja, ai1. Seja, então, a seguinte matrizA:

A=     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

A primeira operação é “normalizar” a primeira linha: 

   

1/3 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

    

| {z }

L1←1 3L1

·     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

| {z }

A =     

1 0 −1/3

2 1 3

3 2 −1

−1 5 −2

    

| {z }

A(1)

Os próximos passo serão combinar a segunda linha com a primeira, a terceira com a primeira e quarta com a primeira de forma que os primeiros valores das linhas se tornem nulos:

    

1 0 0 0

−2 1 0 0

0 0 1 0

0 0 0 1

    

| {z }

L2←L2−2L1

·     

1 0 −1/3

2 1 3

3 2 −1

−1 5 −2

    

| {z }

A(1) =     

1 0 −1/3

0 1 11/3

3 2 −1

−1 5 −2

    

| {z }

A(2)     

1 0 0 0

0 1 0 0

−3 0 1 0

0 0 0 1

    

| {z }

L3←L3−3L1

·     

1 0 −1/3 0 1 11/3

3 2 −1

−1 5 −2

    

| {z }

A(2) =     

1 0 −1/3 0 1 11/3

0 2 0

−1 5 −2

    

| {z }

(10)

    

1 0 0 0

0 1 0 0

0 0 1 0

1 0 0 1

    

| {z }

L4←L4+L1 ·     

1 0 −1/3

0 1 11/3

0 2 0

−1 5 −2

    

| {z }

A(3) =     

1 0 −1/3

0 1 11/3

0 2 0

0 5 −7/3

    

| {z }

A(4)

A partir deste exemplo, podemos ver que a matriz A(4) é obtida pelo produto das matrizes elementares:     

1/3 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

    

| {z }

L1←1 3L1

·     

1 0 0 0

−2 1 0 0

0 0 1 0

0 0 0 1

    

| {z }

L2←L2−2L1

· ·     

1 0 0 0

0 1 0 0

−3 0 1 0

0 0 0 1

    

| {z }

L3←L3−3L1

·     

1 0 0 0

0 1 0 0

0 0 1 0

1 0 0 1

    

| {z }

L4←L4+L1 · ·     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

| {z }

A =     

1 0 −1/3 0 1 11/3

0 2 0

0 5 −7/3     

| {z }

A(4)     

1/3 0 0 0 −2/3 1 0 0 −1 0 1 0 1/3 0 0 1

    

| {z }

U ·     

3 0 −1

2 1 3

3 2 −1 −1 5 −2

    

| {z }

A =     

1 0 −1/3 0 1 11/3

0 2 0

0 5 −7/3     

| {z }

A(4)

Como o produto das matriz ocorre da esquerda para a direita, observe que a matriz elementar de “normalização” é a primeira operação a ser aplicada. Em seguida, vêm as matrizes de combinação linear. A ordem do produto destas três matrizes de combinação linear não importa. Importa é que a operação de normalização venha antes, pois as combinações lineares dependem da linha normalizada.

Uma outra forma de se obter o mesmo resulta neste exemplo seria a combinação linear das linhas antes de se normalizar a primeira, seguindo a seguinte formulação: LiLi+ (−aijajj)Lj.

L2 ←L2+ (−2/3)L1

L3 ←L3+ (−3/3)L1

L4 ←L4+ (1/3)L1

Estas operações “zeram” os valores da primeira coluna e deixam intacta a primeira linha. Como último passo, normaliza-se a primeira linha com a operação própria: L1 ← 13L1.

Vamos transformar estes procedimentos em algoritmos usando nossa pseudo-linguagem. Pri-meiro, vamos desenvolver uma subrotina que monte a matriz identidade com uma dimensão dada:

Agora, vamos implementar uma subrotina que construa tanto a matriz elementar para mul-tiplicar a i-ésima linha por um escalar dado como a combinação linear da i-ésima linha com a

(11)

7

Algoritmo 2: Subrotina Identidade.

SubrotinaIdentidade (u,n)

declarar u[∗,∗]numérica (por referência) {matriz que sairá como identidade }

declarar nnumérica (por cópia) {dimensão da matriz }

declarar i,j numéricas {variáveis auxiliares }

{se i=j, entãou[i, j] = 1, senão u[i, j] = 0 }

1. paraide1 até n,fazer

2. | paraj de 1 atén,fazer 3. | | se(i==j),então 4. | | | u[i, j]←1

5. | | senão

6. | | | u[i, j]←0

7. | | fim se

8. | fim para 9. fim para

Fim subrotina

Algoritmo 3: Subrotina Comb_Mat.

SubrotinaComb_Mat (u,i,j,alf a)

declarar u[∗,∗]numérica (por referência) { matriz elementar }

declarar i,j numéricas(por cópia) {coordenadas das linhas }

declarar alf a numérica (por cópia) { escalar }

{se j=i, então escalai-ésima linha: LiαLi }

{senão, combina i-ésima linha com alfa*j-ésima linha: LiLi+αLj } 1. u[i, j]←alf a

(12)

– se os índices das linhas forem iguais, a matriz elementar operará a escala de uma linha; se os índices forem diferentes, o efeito será a da combinação linear:

Usando o exemplo acima, vamos escrever uma lógica (pseudo-código) em pseudo-linguagem para realizar a mesma tarefa que foi realizada manualmente.

Algoritmo 4: Normalizar a primeira coluna de uma matriz dada.

Algoritmo

declarar A[4,3]numérica { mat A: matriz de entrada }

declarar R[4,3] numérica {mat R: matriz resposta }

declarar U[4,4]numérica { mat U: matriz de transformação }

1. A←[[3; 0;−1]; [2; 1; 3]; [3; 2;−1]; [−1; 5;−2]] 2. Identidade(U, 4)

3. Comb_Mat(U, 2, 1,A[2,1]/A[1,1]) { combina a 2a com a 1a } 4. Comb_Mat(U, 3, 1,A[3,1]/A[1,1]) { combina a 3a com a 1a } 5. Comb_Mat(U, 4, 1,A[4,1]/A[1,1]) { combina a 4a com a 1a } 6. Comb_Mat(U, 1, 1, 1/A[1,1]) {normaliza a 1a } 7. Prod_Mat (U,A,R, 4, 4, 3) { U.A=R } 8. paraide1 até 4,fazer

9. | escreverR[i,1], R[i,2], R[i,3] 10. fim para

Fim algoritmo

3.3

Inversão de matrizes

Os procedimentos apresentados na seção anterior (seção3.2) são as chaves para se calcular a matriz inversa de uma matriz quadrada. Os processos elementares sobre cada coluna da matriz de entrada (nossa matriz A do exemplo anterior) devem ser tais que a transforme em uma matriz identidade. O produto das matrizes de transformação corresponde à matriz inversa.

Digamos que o processo de transformação de uma matriz Ak×k em identidade necessite de

kmatrizes elementares, cada uma transformando uma coluna de A. O produto dask matrizes

elementares gera uma matriz resultante que é a inversa deA:

U(k)U(k−1)

· · ·U(2)U(1)A=I

U(k)U(k−1)

· · ·U(2)U(1)AA−1

=IA−1 U(k)U(k−1)

· · ·U(2)U(1)I=A−1

A partir do Algoritmo 4, pode-se implementar uma subrotina (Algoritmo5) que retorne a inversa de uma matriz dada.

Um cuidado deve ser tomado em relação à presença de zeros na diagonal principal. Outra questão é a presença de valores muito próximos de zero (em valores absolutos). Como as combinações lineares dependem do inverso do valor presente na diagonal, tanto o valor nulo quanto “quase nulos” não são adequados ao cálculo. Assim, um procedimento adotado como padrão é a busca pelo maior valor na coluna que será processada e permutar a linha para que este maior valor (novamente, em termos de valor absoluto) ocupe a diagonal principal.

Assumindo a existência de uma função chamada Absoluto (dado) que retorne o valor

absoluto do dado passado como argumento e a subrotina de permuta de linhas Perm_Lin

(13)

9

Algoritmo 5: Inversão de uma matriz quadrada dada.

SubrotinaInv_Mat (A,iA,n)

declarar A[∗,∗]numérica (por referência) { mat A: matriz de entrada }

declarar iA[∗,∗]numérica (por referência) { mat iA: matriz inversa }

declarar nnumérica (por cópia)

declarar U[∗,∗]numérica { mat U: matriz de transformação }

declarar R[∗,∗],S[∗,∗]numéricas {mat R e S: matrizes auxiliares }

1. alocarR

2. alocarS

3. alocarU

4. Identidade(iA,n)

5. RA { preserva a matriz de entrada }

6. paraide1 até n,fazer 7. | Identidade (U,n) 8. | paraj de 1 atén,fazer 9. | | se(i6=j),então

10. | | | Comb_Mat (U,j,i,−R[j, i]/R[i, i]) { combina linha j com a linha i } 11. | | fim se

12. | fim para

13. | Comb_Mat (U,i,i, 1/R[i, i]) { normaliza linha i } 14. | Prod_Mat (U,R,S,n,n,n) {aplica U em R: U.R=S }

15. | RS { atualiza R }

16. | Prod_Mat (U,iA,S,n,n,n) { aplica U em iA: U.iA=S }

17. | iAS { atualiza iA}

18. fim para

19. desalocarU

20. desalocarS

21. desalocarR

Fim subrotina

Algoritmo 6: Subrotina Perm_Mat.

SubrotinaPerm_Mat (u,i,j)

declarar u[∗,∗]numérica (por referência) { matriz elementar }

declarar i,j numéricas(por cópia) {coordenadas das linhas }

1. u[i, i]←0 2. u[j, j]←0 3. u[i, j]←1 4. u[j, i]←1

(14)

Algoritmo 7: Inversão melhorada de uma matriz quadrada dada.

SubrotinaInv_Mat (A,iA,n)

declarar A[∗,∗]numérica (por referência) { mat A: matriz de entrada }

declarar iA[∗,∗]numérica (por referência) { mat iA: matriz inversa }

declarar nnumérica (por cópia)

declarar U[∗,∗]numérica { mat U: matriz de transformação }

declarar R[∗,∗],S[∗,∗]numéricas {mat R e S: matrizes auxiliares }

declarar i,j,k numéricas {variáveis auxiliares }

1. alocarR

2. alocarS

3. alocarU

4. Identidade(iA,n)

5. RA { preserva a matriz de entrada }

6. paraide1 até n,fazer 7. | Identidade (U,n) 8. | ki

9. | paraj de 1 atén,fazer { percorre os dados na coluna i } 10. | | se(Absoluto(R[j, i]) >Absoluto(R[k, i])), então

11. | | | kj { memoriza o índice da linha que contém o maior valor absoluto } 12. | | fim se

13. | fim para

14. | Perm_Mat (U,i,k)

15. | Prod_Mat (U,R,S,n,n,n) 16. | RS

17. | Prod_Mat (U,iA,S,n,n,n) 18. | iAS

19. | Identidade (U,n) 20. | paraj de 1 atén,fazer 21. | | se(i6=j),então

22. | | | Comb_Mat (U,j,i,−R[j, i]/R[i, i]) { combina linha j com a linha i } 23. | | fim se

24. | fim para

25. | Comb_Mat (U,i,i, 1/R[i, i]) { normaliza linha i } 26. | Prod_Mat (U,R,S,n,n,n) {aplica U em R: U.R=S }

27. | RS { atualiza R }

28. | Prod_Mat (U,iA,S,n,n,n) { aplica U em iA: U.iA=S }

29. | iAS { atualiza iA}

30. fim para

31. desalocarU

32. desalocarS

33. desalocarR

(15)

11

3.4

Determinante

Matrizes quadradas possuem um escalar associado a elas chamado determinante. Existem

diferentes métodos para se calcular o determinante de uma matriz quadrada, mas certamente a mais famosa é a regra de Sarrus para matrizes de ordem 2 e 3. Usando as propriedades de

determinante, outro método utilizado é a expansão ou teorema de Laplace (também conhecido como método dos cofatores). O método de Laplace é aplicável à matrizes quadradas de qualquer ordem. O método de inversão de matriz da seção anterior também pode ser usada para calcular o determinante tirando-se proveito do processo de diagonalização da matriz dada.

3.4.1 Regra de Sarrus

A regra de Sarrus é simples em termos da lógica do cálculo, mas dispendioso em termos

de operações aritméticas, como somas e produtos. Vale a pena olharmos este método como exercício de lógica.

SejaA uma matriz 2×2:

A= "

a b c d

#

O determinante de A (detA ou |A|) corresponde ao resultado da seguinte operação: adbc.

Este resultado pode ser visto como um “passeio” sobre as diagonais de A, destra e sinistra:

ad é o produto dos elementos da diagonal principal (destra) e bc da diagonal principal trans-versa (sinistra). Os termos neste cálculo devem ser distintos, isto é, não podem se repetir. Outra observação é o sinal dos termos. Diagonais destras são positivas e diagonais sinistras são negativas.

Vejamos o caso 3×3. Seja a matrizB dada:

B=   

a b c d e f g h i

  

detBcorresponde ao resultado da seguinte operação: aei+bf g+cdhcegaf hbdi. Para ficar mais fácil observar que os termos desta operação são os produtos dos elementos das diagonais, vamos ampliar a matrizB replicando as 2 colunas iniciais após a 3a:

1a 2a 3a 1a 2a

     

a b c a b

ց ց ց

d e f d e

ց ց ց

g h i g h

      

produzaei+bf g+cdh

1a 2a 3a 1a 2a

     

a b c a b

ւ ւ ւ

d e f d e

ւ ւ ւ

g h i g h

      

produz −(ceg+af h+bdi)

Assumamos os índices dos elementos da matriz B como p e q. Os elementos da primeira diagonal principal possuem índices idênticos: (1,1), (2,2), (3,3), ou seja, (p, p).

(16)

possuem uma “quebra” em relação ao índice da coluna. Naturalmente, pela matrizBampliada, a sequência seria (1,2), (2,3), (3,4), ou seja, (p, p+ 1). Mas a matriz Bnão possui uma quarta coluna.

Então, a questão é: podemos, a partir da sequência natural em B ampliada, calcular os

índices corretos dos elementos da segunda diagonal destra?

É fato que o elemento (3,4) da matriz B ampliada é o elemento (3,1) de B. E aí, uma

questão leva a outra: existe uma relação entre as coordenadas (3,4) e (3,1)? Dito de outra forma: é possível deduzir os índices dos elementos de B que correspondem ao elementos da

segunda diagonal destra de B ampliada a partir dos índices desta?

Sendo 3×3 a ordem de B, tanto o índice da linha como o da coluna não pode ultrapassar o valor 3. Do índice 4 da coluna da matriz ampliada, temos que gerar o valor 1. Um método simples de se obter isso é usar o operador resto de divisão de inteiros: %. Observe que a

operação 4%3 gera, como resultado, o valor 1.

Assim, uma primeira tentativa seria identificar os elementos da segunda diagonal destra com a seguinte expressão: (p,(p+ 1)%3); se p= 3, o resultado será (3,(3 + 1)%3) = (3,1) – o

desejado. Mas e os outros elementos? Se p= 1, o resultado será (1,(1 + 1)%3) = (1,2) – ok.

Agora, se p= 2... O resultado para p = 2 é (2,(2 + 1)%3) = (2,0), pois 3%3 é 0, e não (2,3) como esperado.

A manobra para corrigir este resultado também é simples. Vejamos a sequência de resultados da operaçãor =p%3 para p= 0,1,2,3, . . . e uma sequência paralela com os valores qr+ 1.

p 0 1 2 3 4 5 6 7 · · ·

r 0 1 2 0 1 2 0 1 · · ·

q 1 2 3 1 2 3 1 2 · · ·

A sequência relativa aos valores de q é justamente a saída que desejamos para resolver o problema, ou seja, se p é o índice da linha (p ≥ 1), q ← (p%3) + 1 é o índice da coluna

correspondente para o caso da segunda diagonal destra. Os índices são (p,(p%3) + 1).

E os elementos da terceira diagonal destra? Os índices da terceira diagonal, observando a matriz B, são: (1,3), (2,1) e (3,2). Usando a expressão anterior para o cálculo dos índices, os

índices esperados são calculados pela expressão (p,((p+ 1)%3) + 1) conforme pode ser visto a

seguir usandor←(p+ 1)%3 e qr+ 1.

p 0 1 2 3 4 5 6 7 · · ·

r 1 2 0 1 2 0 1 2 · · ·

q 2 3 1 2 3 1 2 3 · · ·

Voltemos ao caso da diagonal principal. Será se é possível usar estas expressões para calcular os índices dos seus elementos? A resposta é sim. Os índices das colunas da diagonal principal podem ser computados com as expressõesr ←(p−1)%3 e qr+ 1.

p − 1 2 3 4 5 6 7 · · ·

r − 0 1 2 0 1 2 0 · · ·

q − 1 2 3 1 2 3 1 · · ·

Resumindo, as expressões em cada caso são:

• 1a diagonal destra: (p,((p1)%3) + 1)

(17)

13

• 3a diagonal destra: (p,((p+ 1)%3) + 1)

Como último passo, precisamos inserir nestas expressões alguma referência em relação ao índice da diagonal que se pretende usar. Se o índice das diagonais destras for t, a expressão

mais adequada para resolver o problema será (p,((p+t−2)%3) + 1): • set= 1, 1a diagonal destra (diagonal principal)

(p,((p+ 1−2)%3) + 1): (1,1),(2,2),(3,3), . . .

• set= 2, 2a diagonal destra

(p,(p+ 2−2%3) + 1): (1,2),(2,3),(3,1), . . .

• set= 3, 3a diagonal destra

(p,((p+ 3−2)%3) + 1): (1,3),(2,1),(3,2), . . .

Façamos, então, um procedimento para calcular o produto dai-ésima diagonal destra,

gene-ralizando o mesmo para uma matriz quadrada de ordem nqualquer1: funçãoProd_Destra. A expressão genérica é (p,((p+t−2)%n) + 1)

Algoritmo 8: Função Prod_Destra.

Função Prod_Destra(a,n,t) numérica

declarar a[∗,∗]numérica (por referência) { matriz de dados }

declarar n,tnuméricas(por cópia) {ordem da matriz e índice da diagonal }

declarar p,q numéricas { coordenadas }

declarar prodnumérica (prod←1)

1. parap de1 atén,fazer { para cada linha... } 2. | q ←1 + ((p+t−2)%n) {calcula a coluna correspondente... } 3. | prodproda[p, q] { e executa o produtório } 4. fim para

Fim função

Precisamos prever, agora, uma solução para as diagonais transversas. A diagonal transversa envolve os elementos (1,3), (2,2) e (3,1). A segunda transversa, (1,1), (2,3) e (3,2). E a

terceira, (1,2), (2,1) e (3,3). A expressão que se aplica a estes casos é (p,((2−p+t)%3) + 1).

• set= 1, 1a diagonal transversa

(p,((2−p+ 1)%3) + 1): (1,3),(2,2),(3,1), . . .

• set= 2, 2a diagonal transversa

(p,(2−p+ 2)%3) + 1): (1,1),(2,3),(3,2), . . .

• set= 3, 3a diagonal transversa

(p,((2−p+ 3)%3) + 1): (1,2),(2,1),(3,3), . . .

O valor 2, presente na expressão, não éa toa. Ele é, na verdade, o resultado de 3−1, ordem da matriz menos 1. Generalizando para uma matriz quadrada de ordem1 n: (p,((n1p+

t)%n) + 1).

Vamos completar a lógica com o desenvolvimento de um programa que use estas duas funções e compute o determinante de uma matriz dada.

Usaremos como exemplo a seguinte matriz:

A=   

1 2 3 2 3 4 3 4 1   

O determinante da matriz Aé 4.

1É importante lembrar que a regra deSarrusé aplicável apenas às matrizes de ordem 2 e 3. Além disso, o método desenvolvido aqui para produto dos elementos de uma diagonal só é aplicável à regra deSarrussenfor

(18)

Algoritmo 9: Função Prod_Sinistra.

Função Prod_Sinistra(a,n,t) numérica

declarar a[∗,∗]numérica (por referência) { matriz de dados }

declarar n,tnuméricas(por cópia) {ordem da matriz e índice da diagonal }

declarar p,q numéricas { coordenadas }

declarar prodnumérica (prod←1)

1. parap denaté 1,fazer { para cada linha... }

2. | q ←1 + ((n−1−p+t)%n) {calcula a coluna correspondente... } 3. | prodproda[p, q] { e executa o produtório } 4. fim para

Fim função

Algoritmo 10: Cálculo de determinante usando a regra de Sarrus.

Algoritmo

declarar A[3,3]numérica {matriz A }

declarar detnumérica (det←0) {determinante }

declarar inumérica { variável auxiliar }

1. A←[[1; 2; 3]; [2; 3; 4]; [3; 4; 1]] 2. paraide1 até 3,fazer

3. | detdet+Prod_Destra(A,3, i)−Prod_Sinistra(A,3, i) 4. fim para

(19)

15

3.4.2 Método de Laplace

O método deLaplacecalcula o determinante de matrizes quadradas de qualquer ordem. Ele

utiliza um recurso lógico (estratégico) chamado deredução da dimensão de problema. Aplicado

ao problema de cálculo de determinante, busca-se o determinante de uma matriz de ordem na

partir do cálculo de determinantes de matrizes de ordem n−1 construídas a partir da matriz original. Por sua vez, busca-se calcular os determinantes das matrizes de ordemn−1 a partir de determinantes de matrizes de ordem n−2. Este processo prossegue até que a ordem das matrizes operadas seja 3 ou 2, dependendo dos recursos lógicos já disponíveis ao desenvolvedor. No método em si, o determinante de uma matriz Ade ordem n,|A|, é o resultado da soma

dos produtos dos elementos de uma linha (ou coluna) aij por seus respectivos cofatores Aijˆ (também chamados de complementos algébricos):

|A|= n X i=1 j=cte

aijAijˆ = n X j=1 i=cte

aijAijˆ

O cofatorAijˆ é um escalar cujo valor corresponde ao produto de (−1)i+j pelo determinante da matriz reduzida Mij construída a partir da matriz original Aretirando-se a i-ésima linha e a j-ésima coluna. Logo, a matriz reduzida Mij ainda é quadrada e possui ordemn−1.

Vejamos um exemplo. Considere a matriz A da subseção anterior:

A=   

1 2 3 2 3 4 3 4 1   

O método deLaplaceé aplicado sobre uma linha ou uma coluna qualquer da matriz. Usemos

a primeira linha. Os elementos são a11 = 1, a12 = 2 e a13 = 3. Os cofatores associados serão ˆ

A11,12 e 13:

11= (−1)1+1|M11|= (−1)2 3 4 4 1

= (3·1−4·4) =−13

12= (−1)1+2|M12|= (−1)3 2 4 3 1

=−(2·1−4·3) = 10

13= (−1)1+3|M13|= (−1)4 2 3 3 4

= (2·4−3·3) =−1

Pelo método, o determinante de Aserá:

|A|=a1111+a1212+a1313= (1)·(−13) + (2)·(10) + (3)·(−1) = 4

Fica como exercício verificar que trocando a linha ou passando para colunas o resultado será o mesmo.

Passemos ao desenvolvimento da lógica da programação para o cálculo de determinante via método deLaplace.

Primeira coisa a observar é que o cálculo do cofator depende do cálculo de um determinante, de uma matriz de ordem menor. Então, o determinante porLaplace depende de um parâmetro

chamado cofator que depende de outro determinante que pode ser calculado por Laplace que

usará cofatores que dependem de outros determinantes e assim por diante. Esta lógica parece não ter fim.

Mas podemos enxergar o fim deste processo de “recursão”2 se formos capazes de calcular o determinante, em algum momento deste processo, sem ser pelo método de Laplace. Sabemos

(20)

que o determinante de uma matriz de ordem 2 pode ser calculado via regra de Sarrus. Assim,

quando o cofator estiver associado a uma matriz de ordem 2, não será necessário invocar o cálculo de determinante via Laplace e sim viaSarrus.

Então, vamos implementar uma função que calcula o determinante de uma matriz de ordem 2 viaSarrus: Algoritmo 11.

Algoritmo 11: Função Det_Sarrus_2x2.

Função Det_Sarrus_2x2(a) numérica

declarar a[∗,∗]numérica (por referência) { matriz de dados }

declarar detnumérica {valor calculado do determiante }

1. deta[1,1]∗a[2,2]−a[1,2]∗a[2,1] { regra de Sarrus para matriz 2x2 }

2. retornar det

Fim função

Criada a função para o determinante para matrizes de ordem 2, podemos implementar a função que calcula o cofator de uma matriz de ordem m qualquer. Esta função deve analisar a ordem da matriz que ela recebe como argumento. Se a ordem for 2, então o determinante deverá ser calculado viaSarrus. Caso contrário, a função de cálculo de cofatores deverá invocar

a função que calcula o determinante via método deLaplace (que não foi apresentada ainda).

A operação final da função é o produto do determinante calculado pelo termo (−1)p, onde

p é a soma dos índices da linha e coluna associados ao cofator.

Algoritmo 12: Função Cofator.

Função Cofator (a,m,p) numérica

declarar a[∗,∗]numérica (por referência) { matriz de dados }

declarar m numérica (por cópia) {ordem da matriz }

declarar pnumérica (por cópia) { soma dos índices de linha e coluna associados }

declarar detnumérica {valor calculado do determinante }

declarar cof numérica { valor calculado do cofator }

1. se(m= 2),então { se a ordem é 2... }

2. | det← Det_Sarrus_2x2(a) {então, calcula determinante via Sarrus } 3. senão

4. | det← Det_Laplace(a, m) { senão, calcula via método de Laplace } 5. fim se

6. cof ←((−1)∗ ∗p)∗det {finaliza o cálculo do cofator }

7. retornar cof

Fim função

Pelo método de Laplace, o determinante é a soma dos produtos dos elementos de uma linha

(ou coluna) pelos respectivos cofatores. Os cofatores dependem de determinantes de matrizes reduzidas, criadas a partir da matriz alvo do cálculo do determinante. Então, para realizar esta etapa, implementaremos uma subrotina para a construção das matrizes reduzidas. Os dados de entrada devem ser a matriz a ser reduzida, sua ordem e a linha e coluna que devem ser retiradas para produzir a matriz reduzida.

A lógica de construção da matriz reduzida é simples. Usaremos duas variáveis auxiliares só para pular, respectivamente, a linha e a coluna indicadas como argumentos. Estas variáveis assumem valores nulos de início. A ordem da matriz reduzida é a ordem da matriz de entrada menos um.

(21)

17

Algoritmo 13: Subrotina Reduzida.

SubrotinaReduzida(a,m,p,q,r)

declarar a[∗,∗]numérica (por referência) { matriz de entrada }

declarar r[∗,∗]numérica (por referência) { matriz reduzida }

declarar m numérica (por cópia) { ordem da matriz de entrada }

declarar p,q numéricos (por cópia) { linha e coluna a serem retiradas }

declarar u,v numéricas {variáveis auxiliares }

declarar i,j numéricos {indices de linha e coluna }

1. u←0 { variável associada à linha }

2. paraide1 até m−1,fazer

3. | se (i=p),então { se índice da linha for igual ao informado... }

4. | | u←1

5. | fim se

6. | v←0 {variável associada à coluna }

7. | paraj de 1 atém−1,fazer

8. | | se(j=q),então {se índice de coluna for igual ao passado... } 9. | | | v←1

10. | | fim se

11. | | r[i, j]←a[i+u, j+v] { copia o elemento da entrada na matriz reduzida } 12. | fim para

13. fim para Fim subrotina

igual ou maior que o índice da linha ou coluna indicados nos argumentos para serem saltadas, a variável auxiliar correspondente assumira o valor unitário; caso contrário, será nula. Usaremos estas variáveis auxiliares para corrigir as coordenadas dos elementos da matriz de entrada que devem ser copiados. A subrotina em questão retorna, como argumento, a matriz reduzida.

Por fim, o último procedimento que falta implementar corresponde ao método de Laplace

propriamente dito – a soma dos produtos dos elementos da matriz de entrada de uma linha ou coluna por seus respectivos cofatores. Este procedimento retorna o valor do determinante calculado. Logo será elaborado como uma função. Ela recebe a matriz original de entrada e constrói as matrizes reduzidas a partir desta. Para cada matriz reduzida, a função calcula o cofator usando a função construída para isso. A função que calcula o cofator analisa a ordem da matriz de entrada dela e invoca o cálculo do determinante de uma matriz 2×2 ou invoca o método deLaplacenovamente com uma diferença, a matriz de entrada agora é a matriz reduzida

do cofator.

Esta sequência de passos modela a implementação do função Det_Laplace (Algoritmo 14).

3.4.3 Eliminação de Gauss

Outra técnica para cálculo do determinante de uma matriz é a aplicação organizada do que já foi discutido como operações elementares sobre matrizes (seção 3.2) para transformar a matriz alvo em sua equivalente triangular superior (ou inferior). O determinante de uma

matriz triangular é o resultado do produto dos valores presentes na diagonal principal (isto é facilmente verificável).

O processo de transformação de uma matriz quadrada em sua equivalente triangular é parte da conhecida técnica de eliminação de Gauss para solução de sistemas de equações lineares.

Esta técnica diz respeito à solução de sistemas lineares denequações enincógnitas. Mas aqui, pelo propósito de determinação de determinantes, usaremos apenas parte da técnica deGauss.

(22)

Algoritmo 14: Função Det_Laplace.

Função Det_Laplace(a,m) numérica

declarar a[∗,∗]numérica (por referência) { matriz de entrada }

declarar m numérica (por cópia) { ordem da matriz de entrada }

declarar r[∗,∗]numérica { matriz reduzida }

declarar det,cof numéricos {determinante e cofator }

declarar j numérico {indice da coluna }

1. det←0

2. alocarr[m−1, m−1] 3. paraj de1 até m,fazer

4. | Reduzida(a, m,1, j, r) { produz matriz reduzidar associada ao a(1, j) } 5. | cof ← Cofator (r, m−1,1 +j)

6. | detdet+a[1, j]∗cof 7. fim para

8. desalocarr

9. retornar det

Fim função

entre linhas para, iterativamente, transformá-la em triangular superior.

Para zerar os elementos ai1, combinaremos linearmente as i-ésimas linhas (1< in) com a primeira: LiLi+mi1L1, ondemi1 ← −ai1/a11. Este processo afetará todos os elementos da matriz da segunda linha em diante. Logo o valor do elementoa22 também mudará:

a(1)22a22+m21 a12=a22−(a21/a11) a12

Este valor é imprescindível na próxima etapa. O sobrescrito(1)indica que o valor foi modificado na primeira etapa do processo.

A primeira coluna da matrizAtem, neste momento, somente o elementoa11não nulo. Para construção da matriz triangular superior, precisamos zerar os elementos da segunda coluna a partir da terceira linha (2< in) usando a segunda linha como referência: LiLi+mi2L2, ondemi2 ← −a(1)i2 /a

(1)

22. Veja que, para efeitos de construção da matriz triangular superior, não é necessário mexer na primeira linha.

Da mesma forma que o valor do elemento a22 foi modificado na primeira etapa, o valor do elemento a33 é modificado nesta segunda etapa:

a(2)33a(1)33 +m32 a(1)23 =a (1) 33 −(a

(1) 32/a

(1) 22) a

(1) 23

Este valor é utilizado na terceira etapa.

Zerar os valores dos elementos na terceira coluna a partir do elemento a34 segue o mesmo tipo de procedimento: LiLi+mi3L3, onde mi3 ← −a(2)i3 /a

(2)

33 (3 < in); e o valor do elemento a44 será:

a(3)44a(2)44 +m43 a(2)34 =a (2) 44 −(a

(2) 43/a

(2) 33) a

(2) 34

Este processo segue até que o valor do elementoan,n1seja zerado, restando somente o valor do elementoann não nulo nan-ésima linha.

Ao final do processo de triangularização da matriz, o determinante pode ser calculado dire-tamente com o produto dos elementos da diagonal principal:

|A|= n Y i=1

a(i−1) ii

(23)

19

• para 2≤in

LiLi+mi1L1∴mi1 ← −ai1

a11

• para 3≤in

LiLi+mi2L2∴mi2 ← −ai2

a22

• para 4≤in

LiLi+mi3L3∴mi3 ← −ai3

a33

• · · ·

• parai=n

LnLn+mn,n−1Ln−1∴mn,n−1← −

an,n−1

an1,n1

Diferente dos algoritmos desenvolvidos para realizar as operações básicas de matrizes (se-ção 3.2) e a inversão de matrizes (seção 3.3), desenvolveremos um algoritmo mais compacto que realize as mesmas operações. Este algoritmo será a estrutura da Função Det_Gauss

(Algoritmo15).

Algoritmo 15: Função Det_Gauss.

Função Det_Gauss(a,n) numérica

declarar a[∗,∗]numérica (por referência) { matriz de entrada }

declarar nnumérica (por cópia) { ordem da matriz de entrada }

declarar r[∗,∗]numérica {matriz auxiliar }

declarar det,m numéricos {determinante e pivot }

declarar i,j,k numéricos {contadores auxiliares }

1. alocarr[n, n]

2. ra { copia o conteúdo da matriz A em R } 3. paraj de1 até n−1, fazer

4. | paraide j+ 1até n,fazer

5. | | m← −r[i, j]/r[j, j] {pivot entre linhas i e j } 6. | | parakde j até n,fazer {LiLi+mijLj } 7. | | | r[i, k]←r[i, k] +mr[j, k]

8. | | fim para

9. | fim para 10. fim para

11. det←1

12. paraide1 até n,fazer { realiza o produtório para o determinante } 13. | detdetr(i, i)

14. fim para

15. desalocarr

16. retornar det

(24)

3.5

Solução de sistemas lineares

3.5.1 Método de eliminação de Gauss

3.5.2 Método de fatoração LU

3.6

Ajuste de dados pelo método dos mínimos quadrados

O ajuste de dados é um procedimento que visa encontrar os parâmetros de uma função dada de forma que esta descreva a tendência dos dados “da melhor forma possível” dentro de um intervalo definido. Uma forma de se obter o melhor ajuste dos dados segundo uma função de tendência dada é minimizar a discrepância entre o valor da função de tendência e o dado a ser ajustado. Este é o objetivo do método dos mínimos quadrados.

Não é raro deparar-se com dados experimentais e extrair-se deles informações sobre o fenô-meno que os originou. Nestas situações, conhece-se, na maioria das vezes, a lei de formação dos dados, a função de transferência que os relaciona. E como toda coleta de dados está sujeita a flutuações (erros sistemáticos, erros de instrumento, erros de leitura, etc.), os dados podem não coincidir com o traçado da função de formação.

Mas isso não deve ser um impedimento para a análise dos dados visando futura interpre-tação. Assumindo que cada dado está sujeito a um erro, o propósito do método dos mínimos quadrados é justamente adequar um modelo genérico de função (escolhido deliberadamente pelo experimentador) aos dados disponíveis, dentro de um intervalo definido, de forma que o erro quadrático acumulado entre os dados e a função dada seja mínimo.

A função de ajuste pode ser qualquer: pode ser a relação matemática fornecida pela teoria do fenômeno, pode ser uma relação empírica que parece descrever o comportamento dos dados. Seja qualquer uma delas, deve-se ter em mente que alguma função deve ser adotada para se proceder o ajuste.

Outra observação em relação a função de ajuste é que ela é, na sua forma mais genérica, “livre”, uma combinação linear de outras funções (adequadamente escolhidas). Assim, o método dos mínimos quadrados busca os valores das constantes de escala de cada uma das funções que compõem a função de ajuste de maneira que o erro quadrático acumulado seja mínimo.

Comecemos definindo alguns elementos importantes.

Os dados a serem ajustados são pares de valores Pi = (xi, yi). O total de dados é n; logo, o índiceiassume valores inteiros no intervalo fechado [1, n]. O valor dado yi é o valor da função de ajusteG(x) emxi acrescido de um erro,ǫi, ou seja,yi=G(xi) +ǫi.

A função de ajusteG(x) é uma combinação linear demoutras funçõesgk(x), parakvariando no intervalo [1, m], adequadamente escolhidas de acordo com o problema, tal que

G(x) =a1g1(x) +a2g2(x) +· · ·+amgm(x) = m X k=1

akgk(x). (3.1)

A soma dos erros quadráticos ǫ2i chama-se resíduo integralR (ou simplesmente resíduo) e é

expresso como

R=

n X i=1

ǫ2i =

n X i=1

(G(xi)yi)2 =

n X i=1

 

m X j=1

ajgj(xi)yi   2

Constata-se que o resíduo é função das constantes aj. Posto desta forma, a função G(x)

que melhor ajusta é aquela cujas constantes aj minimizam R. O ponto de mínimo de R (que é uma função como qualquer outra) pode ser determinado quando as m derivadas parciais dela em relação a cada constante aj forem zero, ou seja,

∂R ∂aj

= 2 n X i=1

(G(xi)yi)∂G(xi) ∂aj

= 0∴ ∂G(xi)

∂aj

(25)

21 Logo, ∂R ∂aj = n X i=1

(G(xi)yi)gj(xi) = 0n X i=1

G(xi)gj(xi) = n X i=1

yigj(xi). (3.2)

Usando 3.1no resultado de 3.2,

n X i=1 m X k=1

akgk(xi) !

gj(xi) = m X k=1 ak n X i=1

gk(xi)gj(xi) !

= n X i=1

yigj(xi), (3.3)

ou seja, sãomderivadas parciais deRe cada derivada possuimincógnitas. Para cadaj, temos

uma expressão do tipo:

a1 n X i=1

g1(xi)gj(xi) !

+a2 n X i=1

g2(xi)gj(xi) !

+· · ·+

+· · ·+am n X i=1

gm(xi)gj(xi) !

= n X i=1

yigj(xi) !

. (3.4)

Os termos entre parênteses são reconhecidamente operações de produto escalar entre duas sequências:

hgj, gki= n X i=1

gj(xi)gk(xi) =hgk, gji (3.5)

hgj, yi= n X i=1

gj(xi)yi. (3.6)

Como dito antes, o problema dos mínimos quadrados está na determinação das constantesaj que minimizam o resíduoR. A organização do problema nos apresenta um sistema de equações lineares com m equações (uma para cada derivada parcial de R em relação à constante aj) e com m incógnitas por equação. Sistemas deste tipo são chamados de sistemas normais e a

equação3.4 é chamada deequação normal.

Então, usando a notação de produto escalar, podemos criar a matrizGGde valoreshgj, gki para j, k = 1,· · ·, m, o vetor A de incógnitas aj, para j = 1,· · ·, m e o vetor GY de termos independenteshgj, yi:

     

hg1, g1i hg1, g2i · · · hg1, gmi hg2, g1i hg2, g2i · · · hg2, gmi

... ... ... ... hgm, g1i hgm, g2i · · · hgm, gmi

     

| {z }

GG ·       a1 a2 ... am      

| {z } A =      

hg1, yi hg2, yi

... hgm, yi

     

| {z } GY

A matriz GG é uma matriz simétrica em relação à diagonal principal dada a relação em 3.5.

Este sistema tem solução se a matriz GG for inversível. Para isso, suas linhas devem ser linearmente independentes. E isso depende da escolha das funções gj(x).

Várias famílias de funções podem ser escolhidas para cumprir o requisito posto acima, mas as famílias de funções ortogonais é particularmente interessante. Esta propriedade de ortogo-nalidade implica que o produto escalar entre as funções seja nula para quaisquer combinações de índices j ek a menos dej =k, isto é,

hgj, gki= (

0, j 6=k

1, j =k

(26)

3.6.1 Ajuste linear

Uma escolha de funções em particular para aplicações experimentais é muito usada: g1(x) = 1 e g2(x) = x. Isto significa que a função de ajuste é do tipo G(x) = a1+a2x. O ajuste de dados que utiliza esta função de ajuste é chamado de ajuste linear ou regressão linear.

hg1, g1i=n

hg1, g2i=hg2, g1i= n X i=1

xi=nX

hg2, g2i= n X i=1

x2i =nX2

hg1, yi= n X i=1

yi=nY

hg2, yi= n X i=1

xiyi =nXY

"

1 X

X X2 #

· "

a1

a2 #

= "

Y XY

# ⇒

(

a1 + a2X = Y

a1X + a2X2 = XY

⇒     

a1 = Ya2X

a2 =

XYX Y X2X2

(27)

Referências Bibliográficas

[1] SANTORO, A.; MAHON, J. R.; OLIVEIRA, J. U. C. L.; MUNDIN FILHO, L. M.; OGURI. V.; SILVA, W. L. P. Estimativas e erros em experimentos de física. Rio de Janeiro: Ed.

EdUerj, 2005.

[2] RUGGIERO, M. A. G.; ROCHA LOPES, V. L. Cálculo numérico: aspectos teóricos e

computacionais, 2 ed. São Paulo: Pearson Makron Books, 1996.

(28)
(29)

Códigos em Fortran

Referências

Documentos relacionados

5 “A Teoria Pura do Direito é uma teoria do Direito positivo – do Direito positivo em geral, não de uma ordem jurídica especial” (KELSEN, Teoria pura do direito, p..

Este estudo apresenta como tema central a análise sobre os processos de inclusão social de jovens e adultos com deficiência, alunos da APAE , assim, percorrendo

Para analisar as Componentes de Gestão foram utilizadas questões referentes à forma como o visitante considera as condições da ilha no momento da realização do

Este era um estágio para o qual tinha grandes expetativas, não só pelo interesse que desenvolvi ao longo do curso pelas especialidades cirúrgicas por onde

Neste estudo foram estipulados os seguintes objec- tivos: (a) identifi car as dimensões do desenvolvimento vocacional (convicção vocacional, cooperação vocacio- nal,

Figure 8 shows the X-ray diffraction pattern of a well-passivated metallic powder and a partially oxidized uranium metallic powder.. Figure 7 - X-ray diffraction pattern of

A Ética Resolvendo Conflito Entre Direito e Moral Nesse outro estágio percebe-se que a eticidade contempla um Estado em que suas leis não são sentidas como mera coerção ao