Mudanças entre as edições de "Map0151"
(→Resolução de sistemas lineares) |
(→Representação em ponto flutuante) |
||
(26 edições intermediárias de um usuário não apresentadas) | |||
Linha 86: | Linha 86: | ||
:<math>\alpha = [0.a_k \cdots a_0 b_1 b_2\cdots]_{\beta} \times \beta^{k+1} </math> | :<math>\alpha = [0.a_k \cdots a_0 b_1 b_2\cdots]_{\beta} \times \beta^{k+1} </math> | ||
Esta última fórmula é importante. O número real <math> \alpha</math> fica caracterizado por três dados: | Esta última fórmula é importante. O número real <math> \alpha</math> fica caracterizado por três dados: | ||
− | * O número <math> m = [0.a_k \cdots a_0 b_1 b_2\cdots]_{\beta} \in | + | * O número <math> m = [0.a_k \cdots a_0 b_1 b_2\cdots]_{\beta} \in [0.1,1)</math> chamado de '''mantissa'''. |
* O número <math> e = k+1 </math> chamado de '''expoente''' | * O número <math> e = k+1 </math> chamado de '''expoente''' | ||
* O sinal do número <math>\sigma</math> | * O sinal do número <math>\sigma</math> | ||
Linha 282: | Linha 282: | ||
|5 | 1.4142114 | -0.0000060 | |5 | 1.4142114 | -0.0000060 | ||
</pre>}} | </pre>}} | ||
+ | |||
=== Resolução de sistemas lineares === | === Resolução de sistemas lineares === | ||
Linha 298: | Linha 299: | ||
==== Método da Eliminação de Gauss ==== | ==== Método da Eliminação de Gauss ==== | ||
Em primeiro lugar vamos descrever os algoritmos para a resolução de sistemas triangulares. Uma matriz quadrada <math>U = (u_{ij})</math> é triangular superior quando | Em primeiro lugar vamos descrever os algoritmos para a resolução de sistemas triangulares. Uma matriz quadrada <math>U = (u_{ij})</math> é triangular superior quando | ||
− | tivermos a condição <math> u_{ij} = 0</math> para <math> i> j</math>. | + | tivermos a condição <math> u_{ij} = 0</math> para <math> i> j</math>. Neste caso podemos resolver o sistema linear <math>Ux=b</math>,usando o algoritmo de baixo pra cima em <math>n</math> passos: |
+ | * Passo 1 : Encontro <math> x_n = b_n/u_{nn} </math> | ||
+ | * Passo k : Encontro <math> x_{n-k+1} = \frac{1}{u_{n-k+1 n-k+1}}\left(b_{n-k+1} - \sum_{j=n-k+2}^{n} u_{n-k+1 j}x_j\right)</math> | ||
+ | |||
+ | A matriz <math>L=(l_{ij})</math> é triangular inferior quando <math> l_{ij}=0 \text{ e } l_{ii}=1</math> para <math> i < j </math>. Para resolver os sistema | ||
+ | <math>Lx=b</math> usando um algoritmo parecido com o anterior. | ||
+ | * Passo 1 : Encontro <math> x_1 = b_1/l_{11} </math> | ||
+ | * Passo k : Encontro <math> x_{k} = \frac{1}{u_{kk}}\left(b_{k} - \sum_{j=1}^{k-1} u_{k j}x_j\right)</math> | ||
+ | |||
+ | No método da eliminação de Gauss (MEG), vamos transformar um sistema linear numa sistema equivalente triangular superior, isto é, quando a matriz dos coeficientes <math> A </math> | ||
+ | é triangular superior. Faremos isso usando as '''operações elementares''', que descrevemos a seguir: | ||
+ | * <math> \mathcal{O}(i,j) </math> é a troca da linha <math>i</math> com a linha <math>j</math> | ||
+ | * <math> \mathcal{O}(i,\alpha)</math> é a multiplicação da linha <math>i</math> por um número, não nulo, <math>\alpha</math> | ||
+ | * <math> \mathcal{O}(i,\alpha, j)</math> é a substituição da linha <math>i</math> pela soma desta com <math>\alpha</math> multiplicado pela <math>i-</math>ésima linha. | ||
+ | O algoritmo é a aplicação sucessivas dos seguintes passos com <math>k</math> variando de <math>1</math> até <math>n-1</math> | ||
+ | '''Passo <math>k</math>:''' Caso <math> a_{kk} \neq 0</math>, faça de <math> i=k+1</math> até <math> i=n</math>: <math> m_{ik} = a_{ik}/a_{kk} </math> e aplique ao sistema a operação elementar <math> \mathcal{O}(i,m_{ik}, k)</math>. | ||
+ | Ao fim do passo <math>n-1</math> o sistema estará triangularizado. | ||
+ | Para evitar a possibilidade de não se triangularizar o sistema, mesmo ele sendo possível e determinado, executamos a '''pivotação''' que é o seguinte procedimento: | ||
+ | antes da execução do passo <math>k</math> do MEG. Buscamos, na <math>k-</math>ésima coluna, a partir da <math>k-</math>ésima linha o índice <math>i</math> | ||
+ | tal que <math> |a_{ik}| </math> seja o maior possível, e executamos <math> \mathcal{O}(i,k) </math>. Com isto garantimos a triangularização de qualquer sistema que tenha | ||
+ | solução única. | ||
+ | |||
+ | A seguir o código em python para a eliminação de Gauss | ||
+ | {{ ipyin | n=5 | ||
+ | | c= <syntaxhighlight enclose="none" lang="python" strict> | ||
+ | # gauss elimination as seen in the classroom | ||
+ | import numpy as np | ||
+ | |||
+ | |||
+ | # A is type array from numpy | ||
+ | # remember: A[0.0] is the first element | ||
+ | # Elementary row operations: | ||
+ | |||
+ | def troca_linha(A,i,j): | ||
+ | '''Troca as linhas i e j da matriz A''' | ||
+ | buffer = A[i].copy() | ||
+ | A[i] = A[j] | ||
+ | A[j] = buffer | ||
+ | return A | ||
+ | |||
+ | def mult_linha(A,i,alfa): | ||
+ | '''Multiplica por alfa a linha i''' | ||
+ | A[i] = alfa*A[i] | ||
+ | return A | ||
+ | |||
+ | def subs_linha(A,i,k,alfa): | ||
+ | '''soma a linha i com um multiplo da linha k''' | ||
+ | A[i] = A[i] + alfa*A[k] | ||
+ | return A | ||
+ | |||
+ | # step k of gauss elimination: | ||
+ | def gauss_step(A,k): | ||
+ | '''O k-esimo passo na eliminacao de gauss''' | ||
+ | L=range(len(A)) | ||
+ | for j in L[k+1:]: | ||
+ | m=-A[j,k]/A[k,k] | ||
+ | A=subs_linha(A,j,k,m) | ||
+ | A[j,k]=-m # Aproveitamos a matriz A pra guardar o multiplicador | ||
+ | return A | ||
+ | |||
+ | # triangle form, without care and pivoting | ||
+ | def triangle_form(A): | ||
+ | '''Retorna a matriz escalonada, | ||
+ | com os multiplicadores na parte triangular inferior''' | ||
+ | L=len(A) | ||
+ | for k in range(L-1): | ||
+ | p=pivo(A,k) | ||
+ | troca_linha(A,k,p) | ||
+ | gauss_step(A,k) | ||
+ | |||
+ | return A | ||
+ | |||
+ | def pivo(A,n): | ||
+ | ''' retorna o indice de pivotacao da matriz A na coluna n, | ||
+ | a partir da linha n''' | ||
+ | l=len(A) # numero de linhas de A | ||
+ | c=len(A[0]) # numero de colunas | ||
+ | if (l<=n) or (c<=n): | ||
+ | raise ValueError("n deve ser menor que dimensao de A") | ||
+ | p=n # inicio o pivo como n, e vou aumentando | ||
+ | for k in range(n,l): | ||
+ | if abs(A[k,n]) > abs(A[p,n]): | ||
+ | p=k | ||
+ | return p | ||
+ | |||
+ | # roda um teste | ||
+ | |||
+ | A=np.array([[1,2,3], | ||
+ | [2,-1,9], | ||
+ | [3.,0., 2.]]) | ||
+ | B=triangle_form(A) | ||
+ | |||
+ | </syntaxhighlight> }} | ||
+ | |||
+ | Versão sem pivotação (não sei se precisa!) | ||
+ | |||
+ | {{ ipyin || n=6 | ||
+ | |c= <syntaxhighlight enclose="none" lang="python" strict> | ||
+ | # gauss elimination as seen in the classroom | ||
+ | import numpy as np | ||
+ | |||
+ | |||
+ | # A is type array from numpy | ||
+ | # remember: A[0.0] is the first element | ||
+ | # Elementary row operations: | ||
+ | |||
+ | def troca_linha(A,i,j): | ||
+ | buffer = A[i] | ||
+ | A[i] = A[j] | ||
+ | A[j] = buffer | ||
+ | return A | ||
+ | |||
+ | def mult_linha(A,i,alfa): | ||
+ | A[i] = alfa*A[i] | ||
+ | return A | ||
+ | |||
+ | def subs_linha(A,i,k,alfa): | ||
+ | A[i] = A[i] + alfa*A[k] | ||
+ | return A | ||
+ | |||
+ | # step k of gauss elimination: | ||
+ | def gauss_step(A,k): | ||
+ | L=range(len(A)) | ||
+ | for j in L[k+1:]: | ||
+ | m=-A[j,k]/A[k,k] | ||
+ | A=subs_linha(A,j,k,m) | ||
+ | return A | ||
+ | |||
+ | # triangle form, without care and pivoting | ||
+ | def triangle_form(A): | ||
+ | L=len(A) | ||
+ | for k in range(L): | ||
+ | if A[k,k] != 0: | ||
+ | A=gauss_step(A,k) | ||
+ | print A # for testing | ||
+ | else: print ' falhou no passo ', k | ||
+ | return A | ||
+ | |||
+ | # roda um teste | ||
+ | |||
+ | A=np.array([[1,2,3], | ||
+ | [2,-1,9], | ||
+ | [3.,0., 2.]]) | ||
+ | B=triangle_form(A) | ||
+ | </syntaxhighlight> }} | ||
+ | |||
+ | ==== Decomposição LU ==== | ||
+ | Diremos que uma matriz L é triangular inferior se L=(lij) com | ||
+ | lij=0 se i<jlii=1 | ||
+ | |||
+ | Por outro lado, a matriz U será triangular superior se U=(uij) com | ||
+ | :<math> u_{ij}=0 \text{ se } j \lt i </math> | ||
+ | Uma matriz quadrada A tem uma decomposição LU se existem uma matriz triangular inferior, L e | ||
+ | uma triangular superior U tal que temos a igualdade: | ||
+ | :<math> LU=A</math> | ||
+ | |||
+ | Uma matriz inversível tem decomposição LU se e somente se seus menores principais têm determinantes não nulos. | ||
+ | Neste caso pode-se resolver o sistema | ||
+ | :<math> Ax=b</math> | ||
+ | Resolvendo primeiro | ||
+ | :<math> Lz=b</math> | ||
+ | usando substituição de cima pra baixo, e depois, resolver | ||
+ | :<math> Ux =z</math> | ||
+ | usando substituição de baixo pra cima. | ||
+ | |||
+ | ==== Métodos Iterativos ==== | ||
+ | A idéia dos métodos iterativos é produzir uma sequência de estimativas vetoriais <math> \mathbf{x}^{(k)} </math>, que idealmente convirja para a solução <math>\mathbf{x}</math> e | ||
+ | cada passo é calculado a partir da estimativa anterior. Costumam ser bem mais rápidos no caso de matrizes muito grandes. | ||
+ | Para construir recursivamente a sequência que dá origem ao método iterativo fazemos uma decomposição da matriz <math>A</math> de coeficientes do sistema como | ||
+ | :<math> A = N - P</math> | ||
+ | Onde <math>N</math> é de uma classe de sistemas inversíveis e fáceis de resolver. Então resolver o sistema: | ||
+ | :<math> A\mathbf{x} =b </math> | ||
+ | é equivalente a resolver a equação: | ||
+ | :<math> N\mathbf{x} = b+ P\mathbf{x} \text{ ou } \mathbf{x}=N^{-1}(b+ P\mathbf{x})</math> | ||
+ | A recursão | ||
+ | :<math> N\mathbf{x}^{(k+1)} = b+ P\mathbf{x}^{(k)}</math> | ||
+ | é a que converge para a solução caso <math> ||N^{-1}P|| < 1</math> onde a norma de matrizes é induzida de uma norma em <math>\mathbb{R}^n</math>. | ||
+ | Destacamos dois casos | ||
+ | * Método de Jacobi: <math> N = \text{diag}(a_{11}, \cdots, a_{nn})</math> | ||
+ | * Método de Gauss-Seidel : <math> N = (n_{ij}) \text{ com } n_{ij} = a_{ij} \text{ se } i\geq j \\ n_{ij}=0 \text{ se } i\lt j</math> | ||
+ | |||
+ | === Método dos Mínimos Quadrados: Caso discreto === | ||
+ | Consideremos uma tabela de pontos <math> T = \{(x_0,y_0),\cdots,(x_k,y_k)\} </math>. Podemos interpretar esta tabela de duas formas: | ||
+ | 1. Pode ser um conjunto de informações aproximadas sobre uma função de determinado tipo. E neste caso procuraremos a função daquele tipo que melhor se ajuste à tabela. | ||
+ | 2. Pode ser um conjunto de informações precisas sobre uma função diferenciável. Mas não sabemos mais o tipo da função. | ||
+ | |||
+ | No primeiro caso faremos um ajuste da função para a tabela pelo '''Método dos Mínimos quadrados'''. A função ajustada não respeita, necessariamente, a tabela dada. | ||
+ | Para o segundo caso estudaremos a '''Interpolação polinomial''' | ||
+ | |||
+ | Comecemos com o método dos mínimos quadrados (MMQ). Lembremos que temos dadas uma tabela de pontos <math> T = \{(x_0,y_0),\cdots,(x_k,y_k)\} </math> e uma família de | ||
+ | funções <math>\mathcal{F}</math> onde o domínio de cada uma das funções de <math>\mathcal{F}</math> contém os pontos <math>x_i</math> da tabela <math>T</math>. | ||
+ | O resíduo quadrático de uma função <math>f</math> com relação à tabela é: | ||
+ | :<math> r(f,T)= \sum_{i=0}^k \left(y_i -f(x_i)\right)^2 </math> | ||
+ | O problema de MMQ é encontrar uma função <math> f^* \in \mathcal{F}</math> que minimize <math>r(f,T)</math> |
Edição atual tal como às 22h23min de 4 de janeiro de 2014
Conteúdo[ocultar] |
[editar] Números no Computador
Muitos dos algoritmos de cálculo numérico, por uma questão prática, deverão ser executados numa máquina real. Nestas máquinas, no entanto, a capacidade de memória para representação dos números é finita. Vários números reais (infinitos, de fato) terão a mesma representação no computador (ou calculadora), daí originando-se os erros de arredondamentos. Vamos ver qual é a técnica usada atualmente para diminuir os erros de arredondamentos.
[editar] Representação de números inteiros numa base
Seja β>1 um número natural. Então podemos representar qualquer número inteiro k como a soma k=sgn(k)∗a0β0+⋯+asβs onde cada algarismo aj representa um número natural entre 0 e β−1. Só as é diferente de zero. Esta representação é única. A representação de k na base β é k=±[as…a0]β Deixando o sinal de k de fora, para simplificar. Podemos calcular os algarismos do número daddo na base β aplicando repetidas vezes o algoritmo da divisão. Escrevendo k=a0+β(a1+β(a2+⋯+βas)⋯)) vemos que a0 é o resto da divisão k//β, a1 é o resto da divisão (k−a0)//β e assim por diante.
Exemplo: 39=[100111]2
[editar] Representação de números fracionários e decimais numa base
Seja novamente β>1 um número natural.
Se x∈(0,1) então
x=b1β+⋯+bkβk+⋯
Diremos que x=[0.b1b2…]β é a representação fracionária na base
β de x. Quando não houver dúvidas de que base se trata, omite-se a base da notação!
Exemplo: 0.9=[0.1110011001100...]2
[editar] Uma função para colocar um número decimal na forma binária
In[1]: | # -*- coding: utf-8 -*- """ |
[editar] Representação em ponto flutuante
Consideramos uma base fixa β>1. Um número real α∈R positivo pode ser escrito nesta base como: α=[ak⋯a0.b1b2⋯]β Isto significa que: α=akβk+⋯+a0+b1β+b2β2+⋯ Na equação acima, colocando βk+1 em evidência temos: α=(akβ+⋯+a0βk+1+b1βk+2+b2βk+3+⋯)×βk+1 ou ainda, lembrando da notação de um número numa base dada: α=[0.ak⋯a0b1b2⋯]β×βk+1 Esta última fórmula é importante. O número real α fica caracterizado por três dados:
- O número m=[0.ak⋯a0b1b2⋯]β∈[0.1,1) chamado de mantissa.
- O número e=k+1 chamado de expoente
- O sinal do número σ
Esta representação do número α como σm×βe chamaremos de representação normal em ponto flutuante na base β. Em geral a base fica clara pelo contexto!
[editar] Números de máquina
Continuamos com a base fixa (β), mas na representação normal em ponto flutuante vamos admitir apenas números com a mantissa limitada a D dígitos e o expoente limitado, em módulo, por um número inteiro M. O conjunto M={[0.d1⋯dD]β×βe:|e|≤M} é um conjunto de números de máquina definido pelos números (β,D,M). Este é um conjunto finito com (β−1)(β(D−1))(2M+1) elementos. Vamos agora definir a função arredondamento, que é uma função sobrejetora rd:R→M. Seja α um número real; se o expoente de α for maior que M não representamos o número. Senão tomamos sua mantissa e se o dígito bd+1≥β/2 escolhemos o menor número de máquina maior que α para representá-lo. No caso de bd+1<β/2 o representante será o maior número de máquina menor que α.
Se denotarmos por α_ o truncamento do número α, isto é, o maior número de máquina menor que α. E por ¯α o menor número de máquina maior que α. Temos que: ¯α−α_=βe−D Com isto temos uma avaliação do erro absoluto e erro relativo do arredondamento: |α−rd(α)|≤βe−D2 |α−rd(α)||α|≤β1−D2
[editar] Aritmética de números em pontos flutuantes
A extensão das operações aritméticas de soma e multiplicação de números reais faz-se pelo arredondamento: α⊕β=rd(rd(α)+rd(β)) α⊗β=rd(rd(α)×rd(β)) Estas operações deixam de ser associativas.
[editar] Aproximações usando polinômios de Taylor
Para fazer as avaliações de funções de variável real, utilizaremos apenas as operações aritméticas. Basicamente, isto significa que só usaremos polinômios. Em primeiro lugar veremos o método de avaliação de Horner.
[editar] Método de Horner
É a forma de se avaliar o polinômio num ponto dado executando o menor número de operações aritméticas. O polinômio da forma p(x)=anxn+an−1xn−1+⋯+a0 no ponto x0 é avaliado na ordem p(x)=[[[[anx0+an−1]x0+an−2]x0+⋯]x0+a0] Isto é, calculamos a sequência
- A0=an
- Ak+1=Akx0+an−k até o An que é a avaliação.
[editar] Teorema de Taylor
Teorema: Seja f:(a,b)→R uma função de classe Cr, talque exista a derivada f(r+1)(c),∀c∈(a,b). Então para todo x do intervalo, e c fixado existe ξ∈|c,x| tal que: f(x)=f(c)+f′(c)(x−c)+⋯+f(r)(c)r!(x−c)r+f(r+1)(ξ)(r+1)!(x−c)r+1
[editar] Zeros de funções
Dada uma função f:(a,b)→R, queremos encontrar um r∈(a,b) tal que f(r)=0. Um tal número será chamado de zero da função f. Para assegurar a existência de zeros no intervalo, precisamos de alguma regularidade da função. Se f é uma função contínua, uma condição suficiente para a existência do zero é que f(a)∗f(b)<0, e uma técnica para chegar ao zero é ir contraindo este intervalo, mantento a relação f(a)∗f(b)<0, até chegarmos suficientemente próximo. No método da bissecção vamos dividindo o intervalo ao meio. Se (an,bn) é o intervalo com f(an)∗f(bn)<0, definimos xn+1=(an+bn)/2 e o novo intervalo como:
- (an+1,bn+1)=(xn+1,bn) se f(an)∗f(xn+1)<0
- (an+1,bn+1)=(an,xn+1) caso contrário
O tamanho do intervalo no n-ésimo passo é |b−a|/2n. A seguir uma função em python que implementa a bissecção.
[editar] Algoritmo da bissecção
In[2]: | #define a funcao bisseccao
|
Out[2]: | | k | x0 | x1 | xmid |f(x0)*f(xmid)| | 0 | 0.000000 | 2.000000 | 1.000000 | +2.00000000 | | 1 | 1.000000 | 2.000000 | 1.500000 | -0.25000000 | | 2 | 1.000000 | 1.500000 | 1.250000 | +0.43750000 | | 3 | 1.250000 | 1.500000 | 1.375000 | +0.04785156 | | 4 | 1.375000 | 1.500000 | 1.437500 | -0.00726318 | | 5 | 1.375000 | 1.437500 | 1.406250 | +0.00245667 | | 6 | 1.406250 | 1.437500 | 1.421875 | -0.00048804 | | 7 | 1.406250 | 1.421875 | 1.414062 | +0.00000960 | | 8 | 1.414062 | 1.421875 | 1.417969 | -0.00000454 | | 9 | 1.414062 | 1.417969 | 1.416016 | -0.00000218 | | 10 | 1.414062 | 1.416016 | 1.415039 | -0.00000100 | | 11 | 1.414062 | 1.415039 | 1.414551 | -0.00000041 | | 12 | 1.414062 | 1.414551 | 1.414307 | -0.00000011 | | 13 | 1.414062 | 1.414307 | 1.414185 | +0.00000004 | |
[editar] Algoritmo de Newton
O algoritmo de Newton-Raphson usa propriedades de diferenciabilidade da função f para criar uma sequência recorrente que converge ao zero da função que atrairá um ponto x0, que é uma estimativa inicial. A fórmula para gerar a sequêmcia é: xk+1=xk−f(xk)f′(xk) Abaixo o algoritmo em python:
In[3]: | # ilustra o processo de newton-raphson def newtonRaphson(f,flinha,x0,eps=0.0001): |
Out[3]: | | k | x_k | |x_k-xk-1| | |1 | 1.4166667 | 0.0833333 |2 | 1.4142157 | 0.0024510 |3 | 1.4142136 | 0.0000021 |
[editar] Algoritmo da secante
O método da secante pode ser visto como uma adaptação do método de Newton, onde a derivada da função f é computada pela fórmula de aproximação f′(xk)∼f(xk)−f(xk−1)(xk−xk−1) definindo a sequência xk+1=xk−f(xk)(xk−xk−1)(f(xk)−f(xk−1))
O código em Python pode ser o seguinte
In[4]: | # Uma nova definição da secante usando o pseudo-código Kincaid def secante(f,x0,x1,eps=0.0001): |
Out[3]: | | k | x_k | f(xk) | |1 | 2.0000000 | 2.0000000 |1 | 1.0000000 | -1.0000000 |2 | 1.3333333 | -0.2222222 |3 | 1.4285714 | 0.0408163 |4 | 1.4137931 | -0.0011891 |5 | 1.4142114 | -0.0000060 |
[editar] Resolução de sistemas lineares
Do ponto de vista de algoritmos numéricos existem duas formas para se resolver um sistema de equações lineares da forma: a11x1+⋯+a1nxn=b1⋮an1x1+⋯+annxn=bn
Os Métodos Diretos têm, em geral, duas fases. Numa primeira fase, um sistema genérico é transformado, numa sequência finita de passos, num sistema de uma classe de sistemas, do qual se conhece um algoritmo eficiente para a solução. Na segunda fase, resolvemos o sistema gerado. O método da eliminação de Gauss (MEG) é um método direto que descreveremos a seguir.
Os Métodos Iterativos são obtidos por uma sequência de estimativas da solução. Esta sequência deve convergir para a solução, e muito raramente se obtem a solução exata. Mas tem-se um bom controle de erros. Descreveremos o método de Gauss-Seidel que ilustra esta técnica.
[editar] Método da Eliminação de Gauss
Em primeiro lugar vamos descrever os algoritmos para a resolução de sistemas triangulares. Uma matriz quadrada U=(uij) é triangular superior quando tivermos a condição uij=0 para i>j. Neste caso podemos resolver o sistema linear Ux=b,usando o algoritmo de baixo pra cima em n passos:
- Passo 1 : Encontro xn=bn/unn
- Passo k : Encontro xn−k+1=1un−k+1n−k+1(bn−k+1−∑nj=n−k+2un−k+1jxj)
A matriz L=(lij) é triangular inferior quando lij=0 e lii=1 para i<j. Para resolver os sistema Lx=b usando um algoritmo parecido com o anterior.
- Passo 1 : Encontro x1=b1/l11
- Passo k : Encontro xk=1ukk(bk−∑k−1j=1ukjxj)
No método da eliminação de Gauss (MEG), vamos transformar um sistema linear numa sistema equivalente triangular superior, isto é, quando a matriz dos coeficientes A é triangular superior. Faremos isso usando as operações elementares, que descrevemos a seguir:
- O(i,j) é a troca da linha i com a linha j
- O(i,α) é a multiplicação da linha i por um número, não nulo, α
- O(i,α,j) é a substituição da linha i pela soma desta com α multiplicado pela i−ésima linha.
O algoritmo é a aplicação sucessivas dos seguintes passos com k variando de 1 até n−1
Passo k: Caso akk≠0, faça de i=k+1 até i=nmik=aik/akk e aplique ao sistema a operação elementar O(i,mik,k).
Ao fim do passo n−1 o sistema estará triangularizado. Para evitar a possibilidade de não se triangularizar o sistema, mesmo ele sendo possível e determinado, executamos a pivotação que é o seguinte procedimento: antes da execução do passo k do MEG. Buscamos, na k−ésima coluna, a partir da k−ésima linha o índice i tal que |aik| seja o maior possível, e executamos O(i,k). Com isto garantimos a triangularização de qualquer sistema que tenha solução única.
A seguir o código em python para a eliminação de Gauss
In[5]: | # gauss elimination as seen in the classroom import numpy as np |
Versão sem pivotação (não sei se precisa!)
In[6]: | # gauss elimination as seen in the classroom import numpy as np |
[editar] Decomposição LU
Diremos que uma matriz L é triangular inferior se L=(lij) com lij=0 se i<jlii=1
Por outro lado, a matriz U será triangular superior se U=(uij) com uij=0 se j<i Uma matriz quadrada A tem uma decomposição LU se existem uma matriz triangular inferior, L e uma triangular superior U tal que temos a igualdade: LU=A
Uma matriz inversível tem decomposição LU se e somente se seus menores principais têm determinantes não nulos. Neste caso pode-se resolver o sistema Ax=b Resolvendo primeiro Lz=b usando substituição de cima pra baixo, e depois, resolver Ux=z usando substituição de baixo pra cima.
[editar] Métodos Iterativos
A idéia dos métodos iterativos é produzir uma sequência de estimativas vetoriais x(k), que idealmente convirja para a solução x e cada passo é calculado a partir da estimativa anterior. Costumam ser bem mais rápidos no caso de matrizes muito grandes. Para construir recursivamente a sequência que dá origem ao método iterativo fazemos uma decomposição da matriz A de coeficientes do sistema como A=N−P Onde N é de uma classe de sistemas inversíveis e fáceis de resolver. Então resolver o sistema: Ax=b é equivalente a resolver a equação: Nx=b+Px ou x=N−1(b+Px) A recursão Nx(k+1)=b+Px(k) é a que converge para a solução caso ||N−1P||<1 onde a norma de matrizes é induzida de uma norma em Rn. Destacamos dois casos
- Método de JacobiN=diag(a11,⋯,ann)
- Método de Gauss-Seidel N=(nij) com nij=aij se i≥jnij=0 se i<j
[editar] Método dos Mínimos Quadrados: Caso discreto
Consideremos uma tabela de pontos T={(x0,y0),⋯,(xk,yk)}. Podemos interpretar esta tabela de duas formas: 1. Pode ser um conjunto de informações aproximadas sobre uma função de determinado tipo. E neste caso procuraremos a função daquele tipo que melhor se ajuste à tabela. 2. Pode ser um conjunto de informações precisas sobre uma função diferenciável. Mas não sabemos mais o tipo da função.
No primeiro caso faremos um ajuste da função para a tabela pelo Método dos Mínimos quadrados. A função ajustada não respeita, necessariamente, a tabela dada. Para o segundo caso estudaremos a Interpolação polinomial
Comecemos com o método dos mínimos quadrados (MMQ). Lembremos que temos dadas uma tabela de pontos T={(x0,y0),⋯,(xk,yk)} e uma família de funções F onde o domínio de cada uma das funções de F contém os pontos xi da tabela T. O resíduo quadrático de uma função f com relação à tabela é: r(f,T)=k∑i=0(yi−f(xi))2 O problema de MMQ é encontrar uma função f∗∈F que minimize r(f,T)