Teoria

Introdução

Fala aí, tudo tranquilo? Vamos começar mais um assuntinho de cálculo numérico. Ainda na vibe das interpolações, de obter um conjunto de pontos que se aproxima do valor real de uma função e essas coisas todas que já estamos carecas de saber.

Veja bem, nós vimos até agora que muitos experimentos geram uma série de dados, esses dados costumam ser rearrumados e organizados pra criar um modelo, um padrão. Muitas das vezes, os erros existentes nesse processo podem afetar e MUITO a sua qualidade.

Um exemplinho disso, é que grande parte dos teoremas físicos (credo), químicos, biológicos surgiram porque alguém ficou aí testando, atéeeeeee criar um modelito que seguisse um padrão! Imagine só a trabalheira que deve ter dado para descobrir a relação lá da elétrica de V = R I .

Veja só, esses malucos (no bom sentido, é claro) encontraram uma função matemática que representasse bem os dados obtidos.

Geralmente, nós não usamos interpolação polinomial quando queremos um valor que está fora do intervalo [a,b], ouuuuuu seja, quando queremos extrapolar! Beleza?!

Pensa comigo, qual é o nosso objetivo: achar uma função que se “aproxime bem” e que nos permita extrapolar com uma certa margem de segurança. Já tá ligado em qual método vamos usar??

O método dos mínimos quadrados é MUITO usado para ajustar pontos e melhor aproximar uma função, essa melhor aproximação pode ser polinomial, exponencial, logarítmica, trigonométrica e etc.

Mínimos Quadrados

Veja bem, nós temos uma f x que nos dá o valor exato da função em um determinado ponto, certo? Aqui, nós queremos obter uma função de aproximação φ x de modo que ela nos forneça valores aproximados e estimados naquele mesmo ponto, e que tenha um erro pequeno. Então, bora entender?

O que vamos fazer é o seguinte: vamos ter uma porrada de pontos (vamos chamar de m pontos) de f x em uma tabela contidos em um intervalo x 1 , x m .Podemos ter uma disposição de pontos assim:

Analisando os pontos e a disposição de x i e f ( x i ) de i = 1   a t é   i = m , e φ ( x ) se comporta como uma reta, o que significa que ela forma um polinômio de grau 1. Então:

O grande problema de ajuste de curvas, é encontrar funções de modo que cada ponto seja mínimo e definido por:

φ x = α 1 h 1 x + α 2 h 2 x + … + α n h n x

E essa função φ x se aproxima ao máximo de f x . O método consiste em escolhermos n funções contínuas em a , b h 1 x , h 2 x , … , h n x e obter n constantes α 1 , α 2 , … α n .

Duas coisas importantes até agora. Primeiro que n < m , onde n é o número de funções h ( x ) e m é o número de pontos. Segundo que as funções h x podem ser não lineares (como já disse, podem ser exponenciais e etc), mas relaxa aí que o método para achar os coeficientes é linear haha.

Mas, como eu, um mero mortal vou escolher a melhor função que se aproxima de f x e melhor ainda, como é que eu vou definir h x ?

Geralmente, essa escolha é bem visual, nós olhamos um tal de diagrama de dispersão (tipo o gráfico com váaarios pontos que vimos ali em cima) e com ele vemos a curva que melhor se encaixa com os dados.

Vamos falar então do caso mais simples que é através de uma função linear do tipo:

φ t = α 0 + α 1 . x k

Com o objetivo de determinar valores de α 0 e α 1 que minimizem os desvios.

Já vimos como o h x , vendo que era uma reta e obedecia a equação de φ ( x ) . A questão agora é como determinar os coeficientes α 0     e   α 1 para terminar de encontrar φ ( x ) .

Pra cada ponto x k , f x k teremos uma aproximação x k , φ x k . Como queremos uma aproximação mais próxima do real, é natural querermos que o módulo da diferença f x k - φ x k , ou seja, a diferença entre o valor real e o aproximado seja o menor possível (chamamos essa diferença aí de desvio). Observação: calculamos o módulo da diferença porque teremos pontos acima e abaixo da nossa aproximação φ ( x ) (só olhar o gráfico anterior, por exemplo), logo, se não colocássemos o módulo, teriam diferenças entre a função real e a aproximada positivas e negativas, anulando umas as outras.

Mas, como o módulo é um pé no saco pra se trabalhar, esse método arrumou uma saída mais inteligente: ele busca o valor mínimo da soma dos quadrados das diferenças entre a função e a aproximação. Eita, ficou confuso? Faz o seguinte:

Pega os desvios f x k - φ x k em cada um dos m pontos da tabela e eleva ao quadrado, porque assim só se apresentam valores positivos. Depois soma a bagaça toda. É esse valor aí que o método minimiza:

min   ⁡ ∑ k = 1 m f x k - φ x k 2

Definimos h k ¯ = h k x 1 , h k x 2 , … , h k x m e f ¯ = f x 1 , f x 2 , … , f x m .

Fazendo aquela história de derivar e igualar a zero vamos acabar chegando no sistema abaixo:

a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n c 1 c 2 ⋮ c n = b 1 b 2 ⋮ b n

Que é um sistema n × n (lembrando que temos n funções h k x ). E temos que:

a i j = h i ¯ , h j ¯

b i = f ¯ , h i ¯

Onde a , b é o produto escalar de a por b e a matriz A (matriz que apresenta os valores a i j ) é simétrica.

Outra característica interessante de A é que se as funções h k x forem ortogonais entre si, nossa matriz A não só é simétrica, mas também é diagonal. Como não é o foco desse curso, não vamos entrar no assunto de como descobrir se as funções são ortogonais, mas pode dar uma olhada lá no nosso material de Álgebra se ficou curioso!

Vamos resolver um exemplo pra ficar mais claro? A nossa função é tabelada pelos seguintes pontos:

Plotando esses pontos em um gráfico, temos:

Temos que o gráfico tem comportamento linear. Como o método dos mínimos quadrados, podemos usar aquele polinômio pra funções lineares, que é o que melhor se encaixa:

φ x = α 0 + α 1 . x k

Antes que a gente comece a pirar com fórmulas, vou ensinar uma tabela que vai ser o auge de cálculo numérico! Primeiro vamos calcular o valor da função em cada ponto x k . Até ai tudo bem, outro valor que precisamos x k       2   e também f ( x k   ) . x k , em CADA ponto dado E láaaaa embaixo da tabela teremos uma linha com o somatório de cada coisa.

Fica assim:

A primeira e segunda coluna são basicamente o que o exercício dá, então é só preencher x k e f ( x k   ) . Para cada linha da tabela iremos preencher também cada valor de x k elevado ao quadrado, e também cada valor de x k multiplicando pelo valor da função no ponto. Pra fazer o somatório, basta somar os valores totais de caaaaaada coluna.

Obs.: Essa é uma tabela pensando num polinômio de grau 1.

Tabelinha montada, podemos usar aquele sistema de equações de um jeitinho diferente, e se reorganizar direitinho fica com essa cara aqui:

∑ i = 1 5 x i       2 ∑ i = 1 5 x i ∑ i = 1 5 x i     5 .                   α 1                     α   0 = ∑   i = 1 5 f ( x i   ) . x i ∑ i = 1 5 f ( x i   )

Esse 5 está representando a quantidade de pontos, ok?

Fazendo a multiplicação das matrizes e reorganizando direitinho, as fórmulas para α 0   e   α 1 são:

α 0 = [ ( ∑ i = 1 5 x i       2 ) ( ∑ i = 1 5 f ( x i   ) ) ] - [ ( ∑   i = 1 5 f ( x i   ) . x i ) . ( ∑ i = 1 5 x i     ) ] 5 ∑ i = 1 5 x i       2 - ∑ i = 1 5 x i     2

α 1 = 5 ∑   i = 1 5 f ( x i   ) . x i - [ ∑ i = 1 5 x i     . ∑ i = 1 5 f ( x i   ) ] 5 ∑ i = 1 5 x i       2 - ∑ i = 1 5 x i     2

Jogando na fórmulinha aqueles valores que nós organizamos na tabela fica:

α 0 = [ 30 - 35,03 - ( - 110.10 ) ] 5 30 - 10 2 = 0,982

α 1 = [ 5 - 110 - 10 . ( - 35,03 ) ] 5 30 - 10 2 = - 3,994  

Agora só jogamos na fórmula do modelo:

φ x = α 0 + α 1 . x k

φ x = 0,982 - 3,994 . x

A e uma última coisa, se te perguntarem o erro, é só pegar esse somatório aqui:

∑ k = 1 m f x k - φ x k 2

Você pega o valor da função f x k   em cada ponto e o valor de φ x k em cada ponto.

Que foi o que o método minimizou.

Para conferir a eficiência desse método, olha como ficaram os pontos em relação à função que encontramos:

Em azul temos os pontos dados pelo problema e em vermelho temos a equação da reta que calculamos φ ( x ) .

Show? Vamos dar uma olhada no algoritmo dessa joça então!

Algoritmo

Passo 1. Dados iniciais (o que seu programa vai receber de você):

a. Vetor de valores f ¯ = f x 1 , f x 2 , … , f x m

b. Matriz com os n vetores h k ¯

Passo 2. Definimos A como uma matriz n × n cheia de zeros.

Passo 3. Definimos b como um vetor de tamanho n cheio de zeros.

Passo 4. Para i de 1 a n repita o passo 5.

Passo 5. Para j de 1 a i repita o passo 6.

Passo 6. A i j = A j i = h i ¯ , h j ¯

Passo 7. Para i de 1 a n repita o passo 8.

Passo 8. b i = f ¯ , h i ¯

Passo 9. Jogamos nossa matriz A e nosso vetor b em algum método de resolução linear e teremos como retorno o vetor dos coeficientes c .

Outro algoritmo importante que deve ser implementado é o do produto escalar. Ele é bem simples de ser implementado e muitas linguagens inclusive contam com bibliotecas com esse método já pronto para uso.

Por fim, para garantir que ninguém faça besteira com seu programa (isso inclui você mesmo haha) é interessante adicionarmos algumas medidas de segurança. Por exemplo, precisamos que n < m e que os vetores h k ¯ tenham m elementos cada. Isso impede que seu programa dê o algum problema se algum valor errado for imputado sem querer.

Algoritmo

Exercícios de Livros Relacionados