Use o botão abaixo para reportar erros ou dar sugestões.

Cálculo Numérico - Versão Python

7.2 Ajuste linear geral


O problema geral de ajuste linear consiste em dada uma família F gerada pelo conjunto de m funções {f1(x),f2(x),,fm(x)} e um conjunto de n pares ordenados {(x1,y1), (x2,y2), , (xn,yn)}, calcular os coeficientes a1, a2, , am tais que a função dada por

f(x) = j=1ma jfj(x) = a1f1(x) + a2f2(x) + + amfm(x) (7.21)

minimiza o resíduo

R = i=1n f(x i) - yi 2. (7.22)

Aqui, a minimização é feita por todas as possíveis escolhas dos coeficientes a1, a2, , am.

Com o objetivo de tornar a desenvolvimento mais claro, vamos escrever R como a soma dos resíduos parciais:

R = i=1nR i,ondeRi := f(xi) - yi 2. (7.23)

Do fato que f(xi) = j=1ma jfj(xi), temos que cada resíduo pode ser escrito como

Ri = j=1ma jfj(xi) - yi 2. (7.24)

A fim de encontrar o ponto de mínimo, resolvemos o sistema oriundo de igualar a zero cada uma das derivadas parciais de R em relação aos m coeficientes aj, isto é, devemos resolver: R a1 = 2 i=1nRi a1 = 2 i=1n j=1ma jfj(xi) - yi f1(xi) = 0, (7.25) R a2 = 2 i=1nRi a2 = 2 i=1n j=1ma jfj(xi) - yi f2(xi) = 0, (7.26) (7.27) R am = 2 i=1n Ri am = 2 i=1n j=1ma jfj(xi) - yi fm(xi) = 0. (7.28)

Dividindo cada equação por 2 e escrevendo na forma matricial, obtemos Ma = w, onde a matriz M é dada por: M = i=1nf 1(xi)2 i=1nf 2(xi)f1(xi) i=1nf m(xi)f1(xi) i=1nf 1(xi)f2(xi) i=1nf 2(xi)2 i=1nf m(xi)f2(xi) i=1nf 1(xi)f3(xi) i=1nf 2(xi)f3(xi) i=1nf m(xi)f3(xi) i=1nf 1(xi)fm(xi) i=1nf 2(xi)fm(xi) i=1nf m(xi)2 . (7.29)

E os vetores a e w são dados por: a = a1 a2 a m ew = i=1nf 1(xi)yi i=1nf 2(xi)yi i=1nf 3(xi)yi i=1nf m(xi)yi . (7.30)

Agora, observamos que M = V T V e w = V T y, onde a matriz V é dada por:

V = f1(x1) f2(x1) fm(x1) f1(x2) f2(x2) fm(x2) f1(x3) f2(x3) fm(x3) f1(xn) f2(xn) fm(xn) (7.31)

e y é o vetor coluna y = (y1,y2,,yN).

Assim, o problema de ajuste se reduz a resolver o sistema linear Ma = w, ou V T V a = V T y. Este sistema linear tem solução única se a matriz M for inversível. O teorema a seguir mostra que isto acontece sempre a matriz V possui posto m, ou seja, o número de linhas linearmente independentes for igual ao número de colunas.1

Teorema 7.2.1. A matriz M = V T V é quadrada de ordem m e é inversível sempre que o posto da matriz V é igual a número de colunas m.

Demonstração. Para provar que M é inversível, precisamos mostrar que se v é um vetor de ordem m e Mv = 0, então v = 0. Suponha, então, que Mv = 0, isto é, V T V v = 0. Tomando o produto interno da expressão V T V v = 0 com v, temos:
0 = V T V v,v = V v,V v = V v2 (7.32)

Portanto Mv = 0 implica obrigatoriamente V v = 0. Como o posto de V é igual ao número de colunas, v precisar ser o vetor nulo.

Observação 7.2.1. Este problema é equivalente a resolver pelo métodos dos mínimos quadrados o seguinte sistema linear:

f1(x1) f2(x1) fm(x1) f1(x2) f2(x2) fm(x2) f1(x3) f2(x3) fm(x3) f1(xn) f2(xn) fm(xn) a1 a2 a m = y1 y2 y3 y n (7.33)

Observação 7.2.2. O caso de ajuste de um reta para um conjunto de pontos é um caso particular de ajuste linear.


PIC

Figura 7.2: Gráfico da solução do problema apresentado no Exemplo 7.2.1.


Exemplo 7.2.1. Encontre a reta que melhor se ajusta aos pontos dados na seguinte tabela:

i 1 2 3 4 5






x i 0,01 1,02 2,04 2,95 3,55
yi 1,99 4,55 7,20 9,51 10,82

Solução. O problema consiste em ajustar uma função da forma f(x) = a1 + a2x no conjunto de pontos dados. Notamos que f(x) é uma função da família gerada pelo conjunto de funções {f1(x) = 1,f2(x) = x}. Então, aplicando o procedimento acima, temos que o vetor dos coeficientes a = (a1,a2) é solução por mínimos quadrados do sistema linear V a = y, onde:

V = f1(x1) f2(x1) f1(x2) f2(x2) f1(x3) f2(x3) f1(x4) f2(x4) f1(x5) f2(x5) = 1 0,01 1 1,02 1 2,04 1 2,95 1 3,55 . (7.34)

Ou seja, é a solução do sistema V T V a = V T y dado por

5 9,57 9,57 26,5071 a1 a2 = 34,07 85,8144 (7.35)

A solução desse sistema é a1 = 1,9988251 e a2 = 2,5157653. A Figura 7.2, apresenta um gráfico dos pontos e da reta ajustada.


PIC

Figura 7.3: Gráfico da solução do problema apresentado no Exemplo 7.2.2.


Exemplo 7.2.2. Encontre a função f(x) = a1 sen (πx) + a2 cos(πx) que melhor se ajusta pelo critérios dos mínimos quadrados aos seguintes pontos dados

i 1 2 3 4 5






x i 0,00 0,25 0,50 0,75 1,00
yi - 153 64 242 284 175

Solução. Pelo procedimento visto nesta seção, temos que os coeficientes a1 e a2 são dados pela solução por mínimos quadrados do seguinte sistema linear V a = y

a1 sen (πx1) + a2 cos(πx1) = y1 a1 sen (πx2) + a2 cos(πx2) = y2 a1 sen (πx3) + a2 cos(πx3) = y3 a1 sen (πx4) + a2 cos(πx4) = y4 a1 sen (πx5) + a2 cos(πx5) = y5 (7.36)

cuja matriz de coeficientes V é:

V = sen (0) cos(0) sen (0,25π) cos(0,25π) sen (0,5π) cos(0,5π) sen (0,75π) cos(0,75π) sen (π) cos(π) (7.37)

Então, a solução por mínimos quadrados é

a = (V T V )-1V T y = 244,03658 -161,18783 . (7.38)

Ou seja, f(x) = 244,03658 sen (πx) - 161,18783 cos(πx) é a função ajustada ao conjunto de pontos dados. A Figura 7.3 apresenta o gráfica de f(x) e dos pontos dados.

Em Python, podemos computar os coeficientes da função f(x) da seguinte forma:

>>> xi = np.array([0,0.25,0.5,0.75,1])  
>>> yi = np.array([-153,64,242,284,175])  
>>> V = np.array([np.sin(np.pi*xi),np.cos(np.pi*xi)]).transpose()  
>>> a = ((np.linalg.inv((V.transpose()).dot(V))).dot(V.transpose())).dot(yi)

Observação 7.2.3. Em Python, quando resolvemos um sistema Ax = b usando

>>> x = np.linalg.inv(A).dot(b)

estamos computando a inversa da matriz A e multiplicando por b. Dde forma mais eficiente, podemos usar a função numpy.linalg.solve, digitando:

>>> x = np.linalg.solve(A,b)

Isto requer que a matriz A seja quadrada e de posto completo. Alternativamente, para obtermos a solução por mínimos quadrados, podemos usar a função numpy.linalg.lstsq. Neste caso, digitamos:

>>> np.linalg.lstsq(A,b)

7.2.1 Ajuste polinomial


O ajuste polinomial é o caso particular do ajuste linear para funções polinomiais, isto é, funções do tipo

p(x) = a1 + a2x + + amxm-1. (7.39)

Neste caso, a matriz V associada ao ajuste dos pontos {(x1,y1), (x2,y2), (x3,y3), , (xn,yn)} é dada por:

V = 1 x1 x12 x 1m-1 1 x2 x22 x 2m-1 1 x3 x32 x 3m-1 1 xn xn2 x nm-1 (7.40)

Então, os coeficientes ai, i = 1, 2,,m, são dados pela solução do sistema linear V T V a = vT y:

n j=1nx j j=1nx jm-1 j=1nx j j=1nx j2 j=1nx jm j=1nx jm-1 j=1nx jm j=1nx j2m-1 V TV a1 a2 a p+1 a = j=1ny j j=1nx jyj j=1nx jm-1y j V Ty (7.41)


PIC

Figura 7.4: Gráfico da solução do problema apresentado no Exemplo 7.2.3.


Exemplo 7.2.3. Entre o polinômio de grau 2 que melhor se ajusta aos pontos dados na seguinte tabela:

i 1 2 3 4 5






x i 0,00 0,25 0,50 0,75 1,00
yi - 153 64 242 284 175

Solução. Um polinômio de grau 2 pode ser escrito na seguinte forma:

p(x) = a1 + a2x + a3x2. (7.42)

Assim, o problema se resume em encontrarmos a solução por mínimos quadrados do seguinte sistema linear:

a1 + a2x1 + a3x12 = y 1 a2 + a2x2 + a3x22 = y 2 a3 + a2x3 + a3x32 = y 3 a4 + a2x4 + a3x42 = y 4 a5 + a2x5 + a3x52 = y 5 (7.43)

Ou, escrita na forma matricial, V a = y, onde:

V = 1 x1 x12 1 x2 x22 1 x3 x32 1 x4 x42 1 x5 x52 (7.44)

A solução por mínimos quadrados é, então:

a = (V T V )-1V T y = -165,37143 1250,9714 -900,57143 (7.45)

Ou seja, o polinômio de grau 2 que melhor ajusta os pontos dados no sentido de mínimos quadrados é p(x) = -165,37143 + 1250,9714x - 900,57143x2. A Figura 7.4 mostra o gráfico do polinômio ajustado e os pontos dados.

Em Python, podemos computar os coeficientes do polinômio p(x) da seguinte forma:

>>> xi = np.array([0,0.25,0.5,0.75,1])  
>>> yi = np.array([-153,64,242,284,175])  
>>> V = np.array([xi**2,xi**1,xi**0]).transpose()  
>>> a = ((np.linalg.inv((V.transpose()).dot(V))).dot(V.transpose())).dot(yi)

Para fazermos o gráfico do polinômio e dos pontos, digitamos:

>>> xx = np.linspace(-0.25,1.25)  
>>> plt.plot(xi,yi,’ro’,xx,np.polyval(a,xx),’b-’)  
>>> plt.grid();plt.show()

Exercícios


E 7.2.1. Encontre o polinômio p(x) = a1 + a2x + a3x2 que melhor se ajusta no sentido de mínimos quadrados aos pontos:

i 1 2 3 4





x i - 1,50 - 0,50 1,25 1,50
yi 1,15 - 0,37 0,17 0,94

Resposta. a1 = -0,67112, a2 = -0,12123, a3 = 0,73907.

E 7.2.2. Encontrar a parábola y = ax2 + bx + c que melhor aproxima o seguinte conjunto de dados:

i 1 2 3 4 5






x i 0,01 1,02 2,04 2,95 3,55
yi 1,99 4,55 7,20 9,51 10,82

Resposta. y = -0,0407898x2 + 2,6613293x + 1,9364598.

E 7.2.3. Dado o seguinte conjunto de dados

xi 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0












yi 31 35 37 33 28 20 16 15 18 23 31

a)
Encontre a função do tipo f(x) = a + b sen (2πx) + c cos(2πx) que melhor aproxima os valores dados.
b)
Encontre a função do tipo f(x) = a + bx + cx2 + dx3 que melhor aproxima os valores dados.

Resposta. a) a = 25,638625, b = 9,8591874, c = 4,9751219; b)a = 31,475524, b = 65,691531, c = -272,84382, d = 208,23621.

Creative Commons License Este texto é disponibilizado nos termos da licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC-BY-SA 3.0). Página gerada em 15/5/2019 às 15:24:50.

Informe erros ou edite você mesmo!