Quadrados Mı́nimos Paulo J. S. Silva 3 de junho de 2016 1 Introdução Um dos temas principais de problemas numéricos é a obtenção de funções, ou leis, que ajustem dados experimentais. Por exemplo, imagine que temos dados experimentais de um fenômeno que pode ser explicado por um polinômio do segundo grau. Mesmo que o fenômeno seja perfeitamente explicável por esse tipo de função os erros de medidas nunca vão nos permitir observar exatamente o gráfico da verdadeira função. Vamos simular isso no código abaixo. In [ ]: using PyPlot # Uma funç~ ao do segundo grau. lei(x) = π*x.^2 + 2.0.*x + 1.73 # Vamos simular medidas reais de valores da funç~ ao introduzindo um erro aleatório # em [-5, 5]. n_pontos = 500 x = linspace(-4, 4, n_pontos) medida = lei(x) + 10*(rand(n_pontos) - 0.5) scatter(x, medida) Ao observar a figura acima podemos ter a intruição que o valor medido vem de fato de um polinômio do segundo grau. Mas como descobrir qual é esse polinômio. Ou seja, como recuperar os coeficientes a2 = π, a1 = 2, a0 = 1.73? Este é o assunto dessa parte do curso. 2 Modelando o problema de ajuste polinômios de grau 2 Vamos tentar achar uma formulação matemática razoável para o problema e depois resolvê-lo. O que temos são medidas com erros de função p cujo o formato geral conhecemos p(x) = a2 x2 + a1 x + a0 , para coeficientes a2 , a1 , a0 que não conhecemos. Desejamos descobrir os valores dos seus coeficientes a2 , a1 e a0 . A informação que temos disponı́vel são medidas (xi , yi ), i = 1, . . . , m e que yi = p(xi ) mais algum tipo de ruı́do aleatório. Note que se não houvesse o ruı́do aleatório, isso é se tivéssemos o valor exato do polinômio desejado a solução seria simples. Bastaria pegar três pontos do plano e encontrar o (único) polinômio do segundo grau que passa por eles. Veremos como fazer esse isso na próxima parte do curso. Note que quaisquer que fosse os três pontos escolhidos irı́amos obter o mesmo polinômio. No caso de erros de medidas na função fica impossı́vel usar a ideia acima já que o polinômio iria mudar um pouco dependendo de quais três pontos fossem escolhidos. Nesse caso, uma ideia razoável nesse caso é procurar qual o polinômio do segundo grau que melhor se “encaixa” a todos os dados ao mesmo tempo. Como fazer isso matematicamente? Dado um i = 1, . . . , m, o erro de uma função p com respeito ao valor medido em um único ponto xi é |p(xi ) − yi |. 1 Para levar em consideração todos os pontos, os erros em todos eles devem ser combinados de alguma forma. Uma maneira natural é pensar em dois vetores do Rm . O primeiro representa os valores medidos y = (y1 , y2 , . . . , ym ) e o segundo a função p nos respectivos pontos p = (p(x1 ), p(x2 ), . . . , p(xm )). O que gostarı́amos é que y = p mas devido aos erros isso é impossı́vel. Podemos então buscar os coeficientes a2 , a1 e a0 que minimizem a distância entre y e p, já que isso leva em conta todas as coordenadas. Ou seja queremos encontrar os coeficientes para os quais kp − yk2 é o menor possı́vel. Uma coisa interessante é que minimizar a norma euclidiana ou o seu quadrado dá a mesma resposta. Já a norma euclidiana ao quadrado tem a vantagem de ser diferenciável o que poderemos explorar ao resolver o problema. Chegamos finalmente ao seguinte problema: Encontre coeficientes a2 , a1 , a0 de modo que ao definirmos a função p(x) = a2 x2 + a1 x + a0 o valor de m X (p(xi ) − yi )2 = kp − yk2 (1) i=1 seja o menor possı́vel. 3 Ajuste linear de curvas Uma observação importante é que o fato da função que desejamos ajustar aos dados medidos ser um polinômio de grau 2 desempenhou um papel secundário na dedução do problema final acima. A mesma ideia poderia ser aplicada para ajustar um polinômio de grau 5, por exemplo. Mais ainda se função que desejamos ajustar é uma soma de senos e cossemos como c0 sin(x) + c1 cos(x) + c2 sin(2x) + c3 cos(2x) o mesmo problema faz sentido e a modelagem é basicamente a mesma. De uma maneira geral, considere que temos n funções φ1 , φ2 , . . . , φn que acreditamos que se se combinam de forma linear para definir uma função φ. Isto é, acreditamos que φ tem a forma φ(x) = c1 φ1 (x) + c2 φ2 (x) + . . . + cn φn (x) usando um vetor de coeficientes c = (c1 , c2 , . . . , cn ) ∈ Rn . Considere também que temos um conjunto de medidas (xi , yi ), i = 1, . . . , m que representam, aproximadamente, avaliações da função φ com o formato acima. Podemos então desejar encontrar os coeficientes que definem a função φ que melhor se ajusta aos dados no sentido de minimizar kφ − yk2 , em que y é o vetor de medidas y = (y1 , y2 , . . . , ym ) e φ o vetor da função φ(·) avaliado nos pontos xi , i = 1, 2, . . . , m: φ(x1 ) c1 φ1 (x1 ) + c2 φ2 (x1 ) + . . . + cn φn (x1 ) φ(x2 ) c1 φ1 (x2 ) + c2 φ2 (x2 ) + . . . + cn φn (x2 ) φ= = . .. .. . . φ(xm ) c1 φ1 (xm ) + c2 φ2 (xm ) + . . . + cn φn (xm ) Escolhemos o critério de minimizar a norma euclidiana elevada ao quadrado por que assim a função que desejamos minimizar é diferenciável. Obtemos assim o problema de encontrar um vetor de coeficientes c = (c1 , c2 , . . . , cn ) tal que ao definirmos a função φ(x) = c1 φ1 (x) + c2 φ2 (x) + . . . + cn φn (x) o valor de m X (φ(xi ) − yi )2 = kφ − yk2 i=1 2 (2) seja o menor possı́vel. Para sermos capaz de realizar essa tarefa temos que entender como a expressão acima varia com os coeficientes no vetor c. Para isso vamos usar um pouco de notação matricial. Se olharmos a segunda fórmula acima e tentarmos entender o que ela diz colocando c em destaque temos: c1 φ1 (x1 ) φ2 (x1 ) . . . φn (x1 ) φ(x1 ) φ(x2 ) φ1 (x2 ) φ2 (x2 ) . . . φn (x2 ) c2 (3) φ= .. . = .. .. .. .. .. . . . . . . cn φ1 (xm ) φ2 (xm ) . . . φn (xm ) φ(xm ) {z } | {z } | {z } | Φ φ c Como sugerido acima, podemos definir a matriz Φ como a matriz acima, ou seja a matriz que contém na primeira coluna a função φ1 avaliada nos pontos x1 , x2 , . . . , xm , depois na segunda coluna a função φ2 avaliada nos mesmos pontos e assim sucessivamente. Com isso podemos escrever essa última expressão na forma compacta φ = Φc. Assim, a função que queremos minimizar pode ser escrita tornando explı́cita sua dependência no vertor de coeficientes como f (c) = kΦc − yk2 = (Φc − y)t (Φc − y) = ct Φt Φc − 2ct Φt y − y t y. Como desejamos minimizar a função f : Rn → R podemos usar os nossos conhecimentos de cálculo. Em primeiro lugar, observe que a função cresce de forma quadrática com c, logo para c grande ela passará a crescer até infinito se a norma de c crescer indefinidamente. Logo ela atinge mı́nimo. Agora, sabemos de cálculo que os candidatos a ponto de mı́nimo devem obedecer à esquação ∇f (c) = 0. Precismos descobrir como calcular a derivada de f . Para isso observe as seguintes regras de derivação que são facilmente demonstradas a partir das respectivas fórmulas. 1. Se g(c) = ct Ac, para alguma matriz quadrada A, então ∇g(c) = 2Ac. 2. Se h(c) = ct b = bt c, para algum vetor b, então ∇h(c) = b, um vetor constante. 3.1 Equações normais Aplicando as regras de cálculo acima para obter o gradiente de f : ∇f (c) = 2Φt Φc − 2Φt y. Assim a equação que caracteriza o mı́nimo é 0 = ∇f (c) = 2Φt Φc − 2Φt y. Ou escrevendo de uma forma mais simples, eliminando a constante 2, Φt Φc = Φt y. Um sistema de equações lineares em c com n equações e n incógnitas que aprendemos a resolver anteriormente. Esse tipo de sistema é conhecido como equação normal associada ao problema de quadrados mı́nimos. Em particular se a matriz do sistema Φt Φ for inversı́vel sabemos que haverá uma única solução que será necessariamente então o mı́nimo da função f . Nos problemas que vamos enfrentar é natural imaginar que a matriz Φt Φ é inversı́vel. Isso somente não ocorrerá se uma das funções φ1 , φ2 , . . . , φm for redundante (poder ser vista como uma combinação linear das outras, pelo menos nos pontos x1 , x2 , . . . , xn .). Para ver isso é necessário usar um pouco de álgebra linear, fugindo um pouco do escopo de curso introdutório. Estamos prontos para resolver o problema do inı́cio da discussão e usar o vetor medida para tentar recuperar a função lei. Vamos começar criando a matriz Φ. 3 In [ ]: # Constroi uma matriz concatenando uma coluna de 1’s de dimens~ ao adequada, o vetor x e depois o Φ = [ones(n_pontos) x x.^2]; In [13]: # Resolve a equaç~ ao normal Φ’Φ c = Φ’ medida, usando o operador \ de Julia c = (Φ’*Φ) \ (Φ’*medida) Out[13]: 3-element Array{Float64,1}: 1.71444 1.97455 3.13709 Veja como os valores se aproximam dos valores originais que eram 1.73 para o termos constante, 2 para o coeficiente de x e π para o coeficiente associado a x2 . Outra coisa interessante de fazer é mostrar o gráfico da função final obtida e mostrar como ele se ajusta bem nos pontos medidos. In [27]: # Define a funç~ ao φ a partir dos coeficientes calculados e das funç~ oes originais 1, x, e x^2. phi(x) = c[1].*1 + c[2].*x + c[3].*x.^2 # Plota os pontos medidos e o gráfico da funç~ ao obtida. scatter(x, medida) plot(x, phi(x), linewidth=4, color="r", label="φ") legend() Out[27]: PyObject <matplotlib.legend.Legend object at 0x7f87ba988650> 4 In [ ]: In [ ]: 5