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

101
Sistemas lineares, métodos diretos e SciPy Prof. Paulo R. G. Bordoni UFRJ

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

Page 1: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Sistemas lineares,

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

UFRJ

Page 2: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Surfista, descubra pela Internet o caminho das pedras sobre

Computação Científica e

Álgebra Linear Computacional.

Vou buscar no Google, Mestre!

Page 3: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Com a palavra-chave scientific computation,

achei:

Page 4: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Python e SciPy!

Page 5: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

http://history.siam.org/

E com history of scientific computation,

achei:

Page 6: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Quando busquei por Numerical Linear Algebra, o 1º resultado

foi da Wikipedia:

Page 7: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

• 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.

Page 8: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Fui buscar a BLAS no Google!

Page 9: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Um repositório de software importantíssimo!

Page 10: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

O que é a Netlib:

Page 11: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A BLAS na www.netlib.org

Page 12: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Perguntas básicas:

Page 13: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

O que é a BLAS:

Page 14: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A LAPACK na Wikipedia:

Page 15: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A continuação de LAPACK na Wikipedia:

Page 16: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 17: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

SciPy.

Page 18: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Vamos mergulhar nas “Basic routines”

Basic routines

Page 19: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

solução de sistemas lineares:

Page 20: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Examinando as informações sobre o

solve()

Page 21: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Em seguida, chamamos o solve()

para resolver o sistema linear A*x = b.

Page 22: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Outra forma de obter

informações do solve()

Page 23: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Específica para sistemas

triangulares.

Page 24: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Detalhes do parâmetros.

Page 25: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Para resolver sistemas lineares cuja matriz é

de banda.

Page 26: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Detalhes dos parâmetros

Page 27: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Apropriada para matrizes hermitianas e

positivo-definidas.

Page 28: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Detalhamento dos parâmetos.

Page 29: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Exemplo.

Page 30: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Basic routines

Decompositions

Page 31: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A famosa fatoração LU.

Page 32: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 33: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Rotinas existentes no Reference Guide para

a fatoração LU.

Page 34: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

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

Page 35: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 36: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 37: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Os parâmetros retornados.

Page 38: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 39: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

fatoração de Cholesky.

Page 40: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 41: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 42: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

com a próxima.

Page 43: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Esta rotina resolve o sistema após fatorado pela

rotina cho_factor( ).

Page 44: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

fatora.

Page 45: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

cholesky_banded( ).

Page 46: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 47: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Fui buscar estas informações na

Wikipedia!

Page 48: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 49: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 50: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 51: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Tornamos a repetir até ficarmos com um sistema triangular.

Repetimos o processo para o subsistema sem

a 1ª linha.

Page 52: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 53: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Ax = b

Já vimos que esse sistema pode ser reescrito na forma

matricial como abaixo:

Page 54: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

matriz referida na literatura como “matriz aumentada”.

Page 55: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Linha 1

Linha 2

Linha n

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

sobre as linhas da matriz aumentada.

Page 56: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 57: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 58: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 59: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 60: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 61: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Antes que os Surfista reclame, vamos implementar um

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

Page 62: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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!

Page 63: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Experimentei o programa do Mestre para um sisteminha 3x3.

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

(de digitar tudo novamente) !

Page 64: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Este é o programa.

Page 65: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A continuação do código.

Page 66: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Porque eliminaram o Gauss, Mestre?

Coitado!

Agora o famoso Método de

Eliminação de Gauss.

Page 67: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Primeiro veremos a programação

no estilo clássico

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

Page 68: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 69: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 70: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 71: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 72: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A etapa final do processo de eliminação.

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

Page 73: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 74: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 75: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Esse é o início do código.

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

iniciar.

Page 76: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 77: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 78: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 79: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 80: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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 .

Page 81: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 82: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A 3ª forma de criar matrizes é mais simples;

é como no Matlab.

Page 83: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 84: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 85: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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

Page 86: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Agora veremos a programação

com vetorização

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

Page 87: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 88: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 89: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 90: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 91: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

2

Em 1 temos vetorização, em 2

um loop.

1

Page 92: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 93: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Observem que:

e isso se repete para as outras duas linhas

0.5

-0.5 1.5 2.5

-1. 3. 5.

=

*

Page 94: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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ó.

Page 95: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 96: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

No Guia de Referência do NumPy temos

Page 97: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Descendo um pouco em “Standard array subclasses”

encontraremos o que nos interessa:

“Matrix objects”:

Page 98: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Pois é Manuel, os detalhes sobre

matrizes começam aqui:

Page 99: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

A continuação:

Page 100: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

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.

Page 101: CalcNum16 - Sist. Lin. Mét. Diretos SciPy

Tchau, até a próxima aula!