CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Post on 11-Aug-2015

282 views 1 download

Transcript of CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Sistemas lineares,

métodos diretos e SciPy Prof. Paulo R. G. Bordoni

UFRJ

Surfista, descubra pela Internet o caminho das pedras sobre

Computação Científica e

Álgebra Linear Computacional.

Vou buscar no Google, Mestre!

Com a palavra-chave scientific computation,

achei:

Python e SciPy!

http://history.siam.org/

E com history of scientific computation,

achei:

Quando busquei por Numerical Linear Algebra, o 1º resultado

foi da Wikipedia:

• BLAS: Basic Linear Algebra Subprograms,

• LAPACK: Linear Algebra Package.

Repetindo: BLAS e LAPACK, bibliotecas

altamente otimizadas que implementam os algoritmos básicos de

Álgebra Linear Computacional.

Não deixem de olhar as listas indicadas de software de análise

numérica e de bibliotecas numéricas.

Fui buscar a BLAS no Google!

Um repositório de software importantíssimo!

O que é a Netlib:

A BLAS na www.netlib.org

Perguntas básicas:

O que é a BLAS:

A LAPACK na Wikipedia:

A continuação de LAPACK na Wikipedia:

O site oficial do LAPACK, claro: www.netlib.org

É aqui que começam as informações sobre Álgebra Linear no

SciPy.

Vamos mergulhar nas “Basic routines”

Basic routines

O que há na parte de rotinas básicas do Scipy sobre

solução de sistemas lineares:

Examinando as informações sobre o

solve()

Nesse “script” criamos uma matriz A e um vetor-coluna b.

Em seguida, chamamos o solve()

para resolver o sistema linear A*x = b.

Outra forma de obter

informações do solve()

Específica para sistemas

triangulares.

Detalhes do parâmetros.

Para resolver sistemas lineares cuja matriz é

de banda.

Detalhes dos parâmetros

Apropriada para matrizes hermitianas e

positivo-definidas.

Detalhamento dos parâmetos.

Exemplo.

Agora vamos explorar as fatorações (Decompositions) existentes no Linear Algebra.

Basic routines

Decompositions

A famosa fatoração LU.

A famosa fatoração LU – continuação.

Rotinas existentes no Reference Guide para

a fatoração LU.

Esta é uma das rotinas do linalg para realizar a fatoração PLU.

Ela só realiza a fatoração; não apresenta a solução.

A rotina pode efetuar o pivoteamento por linha (ou não). Ela retorna:

• as três matrizes P, L e U • ou apenas duas, a PL que é a triangular

inferior permutada e a U.

Esta é uma rotina alternativa à anterior.

Ela recebe a matriz A e retorna uma matriz contendo a fatoração LU e um vetor

contendo os índices de pivoteamento.

Os parâmetros retornados.

Esta rotina recebe a fatorada LU e o vetor piv fornecidos pela LU_factor( ).

Recebe também o termo independente b e retorna a solução x.

Uma brevíssima explicação do que é a

fatoração de Cholesky.

As rotinas do SciPy para a fatoração de Cholesky.

A explicação para passagem de parâmetros.

Esta rotina só efetua a fatoração. Deve ser usa

com a próxima.

Esta rotina resolve o sistema após fatorado pela

rotina cho_factor( ).

Esta é específica para matrizes de banda. Só

fatora.

Esta resolve o sistema linear, após a fatoração pela

cholesky_banded( ).

Carl Friedrich Gauss 30/04/1777 – 23/02/1855

Vamos encerrar este conjunto de transparências

detalhando o famoso Método de Eliminação, de

Gauss.

Na verdade ele não foi criado por Gauss.

Ele já aparece no cap. 8 do livro chinês “Os nove capítulos sobre a arte

matemática”, composto por gerações de mestres ao

longo dos séculos X a II A.C.

Fui buscar estas informações na

Wikipedia!

Vamos agora explicar como resolver um sistema linear como o abaixo, pelo

método de eliminação.

Primeiro descreveremos o método usando as equações.

Nosso objetivo será atingido em várias etapas consecutivas.

Em cada etapa utilizaremos operações elementares

sobre as linhas.

Elas são três:

Somar ou subtrair linhas

Multiplicar uma linha por um número real

Trocar duas linhas de posição

Na 1ª etapa, eliminaremos os termos envolvendo 𝑥1 nas equações após a 1ª, efetuando operações elementares nas

linhas.

Naturalmente os coeficientes e termos

independentes mudarão após essas operações.

Tornamos a repetir até ficarmos com um sistema triangular.

Repetimos o processo para o subsistema sem

a 1ª linha.

O último passo consiste em resolver o sistema triangular.

Algo extremamente simples.

O processo consiste, portanto, em eliminarmos incógnitas nas equações.

Daí o nome.

Ax = b

Já vimos que esse sistema pode ser reescrito na forma

matricial como abaixo:

Acrescentando o vetor b à última coluna da matriz A, obtemos uma

matriz referida na literatura como “matriz aumentada”.

Linha 1

Linha 2

Linha n

O processo de eliminação envolve efetuar as operações elementares,

sobre as linhas da matriz aumentada.

As operações elementares são:

Linha 1 Linha 1

Linha 2 Linha 2 Linha 1 𝐴21/𝐴11 × −

Linha 3 Linha 3 Linha 1 𝐴31/𝐴11 × −

Linha n Linha n Linha 1 𝐴𝑛1/𝐴11 × −

Multiplicadores

Observe que os multiplicadores foram escolhidos de forma a anular

todos os 𝐴𝑖1 abaixo do 𝐴11.

O 𝐴11 é intitulado “pivot”.

Essas operações exigem que o pivot seja não-nulo: 𝐴11 ≠ 0.

Caso 𝐴11 = 0 trocamos a linha 1 com outra onde 𝐴𝑖1 ≠ 0.

O final do processo é o mesmo: uma matriz triangular superior.

Repetimos apenas para evidenciar que não precisamos envolver as incógnitas no

processo – só os vetores linha da matriz aumentada.

De novo, os 𝐴𝑖𝑗 e os 𝑏𝑖 são modificadas a cada

passo do processo.

Quando pensamos nas equações, fica óbvio que as operações

elementares não alteram a solução.

Isto não é tão óbvio quando olhamos para a

matriz aumentada.

Uma forma de contornar a propagação de erro consiste em localizar o 𝐴1𝑗 de maior

valor absoluto e trocar a linha onde ele está com a linha 1.

Esta é a estratégia conhecida na literatura como pivoteamento parcial por coluna.

Quando o 𝐴11 é muito pequeno, por exemplo, 𝐴11 = 10−2, estamos ampliando 100 vezes o erro

envolvido na representação IEEE 754 dos multiplicadores, que então se propaga.

Esse processo, repetido ao longo da eliminação, acaba por arruinar a solução do sistema.

Antes que os Surfista reclame, vamos implementar um

programa para o método de eliminação.

Antes, vou mostrar um programa que facilita muito

a entrada de dados, via teclado, para sistemas lineares

Ax = b. Eu vivo errando na digitação!

Experimentei o programa do Mestre para um sisteminha 3x3.

Na pressa, cometi um erro, mas o programa me salvou

(de digitar tudo novamente) !

Este é o programa.

A continuação do código.

Porque eliminaram o Gauss, Mestre?

Coitado!

Agora o famoso Método de

Eliminação de Gauss.

Primeiro veremos a programação

no estilo clássico

para o Método de Eliminação, de Gauss.

Para facilitar o entendimento, vamos mostrar 1º a execução do

programa.

Depois discutiremos seu código.

Estes são a matriz A e o vetor b de nosso

exemplo.

Eis a 1ª etapa do processo de eliminação.

As operações elementares visam colocar zeros na 1ª coluna, abaixo do pivot.

É a mesma coisa que eliminar a variável x1 na 2ª, na 3ª e na 4ª equação.

pivot

Mestre, seu programa está errado!

A matriz A atualizada deveria ter sido esta aqui, com zeros abaixo

do pivot.

Mil perdões Loirinha!

Esqueci de dizer que usei o espaço dos zeros para guardar

os multiplicadores.

A 2ª etapa do processo de eliminação.

As operações elementares visam colocar zeros na 2ª coluna, abaixo do pivot.

É a mesma coisa que eliminar a variável x2 nas 3ª e 4ª equações.

Novamente, guardei os multiplicadores no lugar dos zeros.

A etapa final do processo de eliminação.

A solução x foi obtida por retro-substituição.

Após completarmos o processo de eliminação:

• a matriz A é a matriz triangular superior que eu marquei em rosa,

• e os multiplicadores estão em verde, abaixo da diagonal.

O método da fatoração LU decorre dessa ideia. U é de

upper e L é de lower.

1º passo

O processo de eliminação pode ser resumido, recursivamente, em dois passos:

1º passo – Zerar os elementos da matriz A abaixo do pivot via operações elementares,

2º passo – Enquanto possível, repetir o processo para a matriz que resta após retirarmos a linha e a coluna do pivot.

2º passo

Esse é o início do código.

Nada excepcional. Apenas definições básicas para

iniciar.

Aqui são definidas duas funções que vão mostrar o que está acontecendo.

Esta é a fase da eliminação.

O loop em k define as etapas do processo de eliminação.

É definido o pivot e, se ele é não-nulo, criamos uma

matriz-coluna, Mult, para guardar os multiplicadores.

No loop em j atualizamos cada elemento da linha i efetuando a operação elementar sobre ele.

O loop em i percorre as linhas abaixo do pivot e define um multiplicador

para cada linha.

Ainda dentro do loop em i efetuamos a operação

elementar sobre o elemento da linha i do termo independente b.

E guardamos esse multiplicador na linha i da coluna do pivot da matriz A e também na linha i do

vetor Mult.

Agora a fase da retro-substituição.

• Da última equação achamos diretamente o valor de xn .

• Substituímos esse valor na penúltima equação e achamos o valor de xn-1 .

• Assim por diante, de trás para frente, até chegar à 1ª equação, de onde achamos x1 .

0 1 2 3

0

1

2

3

Representarei uma matriz 4x4 por uma grade, como abaixo, porque não

estou interessada nos números.

Quero mostrar claramente o conceito de fatiamento.

Antes, vou mostrar 3 formas distintas de criar

matrizes.

A 3ª forma de criar matrizes é mais simples;

é como no Matlab.

Fatiando para obter as três últimas linhas e depois para obter as três 1ªs colunas.

0 1 2 3

0

1

2

3

0 1 2 3

0

1

2

3

Fatiando para obter as três últimas linhas

da 3ª e 4ª colunas e depois para obter

a 3ª coluna.

0 1 2 3

0

1

2

3

0 1 2 3

0

1

2

3

Fatiando para obter a 3ª linha e depois para

obter o bloco constituído pelas 1ª e 2ª linhas e

2ª e 3ª colunas.

0 1 2 3

0

1

2

3

0 1 2 3

0

1

2

3

Agora veremos a programação

com vetorização

para o Método de Eliminação, de Gauss.

O processo é exatamente o mesmo e, quando executado para a mesma matriz A e vetor b, reproduz fotograficamnte

o resultado do clássico.

A única diferença esta na vetorização das operações.

As duas funções

• mostrar_op_elem( ) • mostrar_result( )

são as mesmas do código tradicional.

Insira suas definições na parte rasgada deste código. O início dele é igual ao da programação tradicional.

O loop em k é o único. Como antes, ele descreve as etapas do processo de

eliminação.

Definimos o pivot e, se ele não é zero, criamos o vetor coluna Mult que

guardará os multiplicadores.

Ver nos slides finais.

Esta linha de código está vetorizada!

Nela, calculamos todos os multiplicadores da coluna k,

abaixo do pivot.

Num golpe só, como um samurai!

Veja o exemplo do Prof. na próxima transparência.

2

Em 1 temos vetorização, em 2

um loop.

1

Esta outra linha de código também está vetorizada.

Ela atualiza, de uma vez só, toda a sub matriz que pintei de azul.

A Professora explica uma parte desse código na próxima transparência.

Observem que:

e isso se repete para as outras duas linhas

0.5

-0.5 1.5 2.5

-1. 3. 5.

=

*

A 1ª das linhas acima coloca os multiplicadores na coluna k da matriz A,

abaixo do pivot. Num ato só.

A 2ª aplica as operações elementares em todos os elementos do vetor b, após

a posição correspondente ao pivot. Também num ato só.

Na substituição retroativa, também temos uma

vetorização.

Executem a versão vetorizada com os mesmos dados e

verifiquem que os resultados são idênticos.

No Guia de Referência do NumPy temos

Descendo um pouco em “Standard array subclasses”

encontraremos o que nos interessa:

“Matrix objects”:

Pois é Manuel, os detalhes sobre

matrizes começam aqui:

A continuação:

Muito simples mesmo, Mestra.

Professor, criei uma matriz M, 3x3.

Em seguida, mostrei o array M.A associado a ela, a sua transposta M.T, a hermitiana

associada, M.H, e a inversa M.I.

Tchau, até a próxima aula!