Splines
Objetivos de Aprendizagem
- Explicar por que muitos pedaços de grau baixo evitam a oscilação de um único polinômio de grau alto, e medir a diferença na função de Runge.
- Contar as condições que definem uma spline cúbica e deduzir o sistema tridiagonal das suas segundas derivadas.
- Comparar as fronteiras natural, fixada (clamped) e not-a-knot, e prever a ordem de cada uma a partir do que ela supõe nas pontas.
- Implementar uma spline cúbica e conferi-la contra
scipy.interpolate.CubicSpline. - Reconhecer onde uma spline engana (overshoot, extrapolação, dados ruidosos) e recorrer a uma alternativa que preserva a forma.
Contexto e Motivação
polynomial-interpolation-lagrange-and-newton deixou um problema aberto: nós de Chebyshev salvam um polinômio de grau alto, mas dados reais costumam chegar numa grade que outra pessoa escolheu, e ali o polinômio diverge. Splines mantêm a grade e abrem mão da fórmula única. Usam um polinômio de grau baixo em cada intervalo entre nós e emendam os pedaços suavemente. O grau fica fixo enquanto o número de pedaços cresce, então a precisão vem de ficar pequeno e não de o grau ficar grande, e o efeito de um dado some rápido com a distância.
O nome vem da régua flexível que os desenhistas curvavam passando por pontos fixos. Splines cúbicas são um padrão comum para curvas suaves por dados porque são baratas de construir, com um único sistema tridiagonal, e baratas de avaliar.
Teoria Central
Splines lineares
Ligar os pontos com segmentos de reta dá a spline linear. Se e é a maior distância entre nós, a fórmula do erro para dois nós dá
porque em cada intervalo. O mapa dos dados para o interpolador tem número de condição absoluto 1 na norma do máximo: uma mudança de tamanho nos dados muda em exatamente nessa norma. O preço é uma quina em cada nó.
Contando as condições de uma spline cúbica
Uma spline cúbica em nós é uma função que é cúbica em cada intervalo, está em e interpola os dados. Com intervalos há coeficientes. Coincidir com os dados nas duas pontas de cada intervalo dá condições. A continuidade de e nos nós internos dá mais . São , então sobram exatamente duas condições livres, e elas são as condições de fronteira.
O sistema das segundas derivadas
Sejam , e . Em cada intervalo, é linear de a . Integrar duas vezes e impor os dados dá, em ,
Os valores e agora coincidem por construção. Exigir que concorde pelos dois lados num nó interno dá, para ,
Esse sistema é o que torna as splines práticas. Ele é tridiagonal, então se resolve em operações, não em . Com fronteira natural ou fixada ele é estritamente diagonal dominante por linhas em qualquer malha, já que , logo é invertível e dispensa pivoteamento (compare com lu-decomposition-and-partial-pivoting e com a condição de dominância em iterative-methods-jacobi-and-gauss-seidel). Numa malha uniforme com fronteira natural, ele é vezes a matriz com 4 na diagonal e 1 ao lado, cujos autovalores ficam em , então : medido , , para . Compare com as matrizes de Vandermonde da lição anterior.
Condições de fronteira
- Natural: . Não exige dado extra e afirma que não tem curvatura nas pontas.
- Fixada (clamped): e para inclinações dadas. As equações acrescentadas são e .
- Not-a-knot: é contínua em e , então os dois primeiros pedaços são uma só cúbica, e os dois últimos também. Não exige dado extra e é o padrão em
CubicSpline. - Periódica: e coincidem entre as duas pontas, para dados com .
Ordem. Se numa malha uniforme, a spline not-a-knot satisfaz para pequeno o bastante. Splines fixadas com as inclinações verdadeiras atingem a mesma ordem (Exemplo 4). A spline natural força nas pontas, então quando ali ela é só , e a perda fica nas pontas.
Curvatura mínima
Entre todas as que interpolam os dados, a spline natural minimiza . Com as duas inclinações das pontas fixadas, a spline fixada minimiza essa integral entre os interpoladores com essas inclinações. A integral só aproxima a energia de flexão de uma régua física: a curvatura verdadeira é , então as duas só concordam para inclinações pequenas.
Exemplos Resolvidos
Exemplo 1: uma spline natural à mão
Tome nós com valores . Então e , e com o sistema é
logo e . Com , os pedaços são
Em : e , mas e . A terceira derivada salta, como precisa, senão os pedaços seriam uma só cúbica. Os valores nos pontos médios são , e CubicSpline(x, y, bc_type="natural") devolve , , com exatamente esses coeficientes.
A integral de curvatura vale para esta spline. Vale para a spline not-a-knot, que em quatro pontos é a única cúbica por eles, e para a spline fixada com inclinação zero. A natural tem a menor, como o teorema exige.
Exemplo 2: implementação, conferida contra o SciPy
plaintextimport numpy as np from scipy.linalg import solve_banded def moments(t, y, slopes=None): """Segundas derivadas nos nós: natural, ou fixada se slopes=(s0, sn).""" n, h = len(t) - 1, np.diff(t) d = np.diff(y) / h up, main, lo, r = np.zeros((4, n + 1)) main[1:n] = 2 * (h[:-1] + h[1:]) lo[:n - 1] = h[:-1] up[2:] = h[1:] r[1:n] = 6 * (d[1:] - d[:-1]) main[[0, n]] = 1.0 if slopes is not None: main[0], up[1], r[0] = 2 * h[0], h[0], 6 * (d[0] - slopes[0]) main[n], lo[n - 1], r[n] = 2 * h[-1], h[-1], 6 * (slopes[1] - d[-1]) return solve_banded((1, 1), np.vstack([up, main, lo]), r)
Em 40 nós aleatórios em (intervalos de a ) com , avaliar a fórmula por partes acima em 20001 pontos difere de CubicSpline em no máximo , tanto com fronteira natural quanto com fronteira fixada nas inclinações verdadeiras.
Exemplo 3: a função de Runge
Erros máximos para em com nós, numa grade de 20001 pontos. Todas as colunas, menos a última, usam nós equiespaçados.
textn polinômio linear cúbica not-a-knot polinômio de Chebyshev 10 1.92e+00 6.74e-02 2.20e-02 1.09e-01 20 5.98e+01 4.18e-02 3.18e-03 1.53e-02 40 1.05e+05 1.40e-02 2.78e-04 2.89e-04 80 6.31e+14 3.80e-03 1.61e-05 1.02e-07
O polinômio diverge nos mesmos dados em que a spline converge. As ordens observadas da cúbica, dobrando , são , , , depois e em e : a "ordem 4" só aparece quando resolve o pico de largura cerca de . Splines não são simplesmente melhores que a interpolação de Chebyshev. Até a spline ganha, em empatam, e em o polinômio em nós escolhidos é cerca de 160 vezes melhor, porque esta é analítica e a convergência geométrica ultrapassa .
A razão da estabilidade é a localidade. Ponha no nó central e nos outros, , e registre o maior valor em cada intervalo:
textintervalo a partir do pico spline natural polinômio 1 1.37e-01 2.65e-01 2 3.66e-02 2.32e-01 3 9.81e-03 3.01e-01 5 7.05e-04 1.25e+00 9 4.41e-06 1.82e+03
Cada intervalo multiplica a spline por um fator de cerca de , o tamanho da raiz decrescente da recorrência . O polinômio cresce rumo às pontas. A constante de Lebesgue em é para a spline natural e para a not-a-knot, contra para o polinômio. Com , somar ao valor central muda a spline em e o polinômio em .
Exemplo 4: a condição de fronteira define a ordem
Erro máximo para em , onde nas duas pontas:
textn natural fixada not-a-knot 10 1.33e-03 6.96e-07 6.93e-06 20 3.34e-04 4.39e-08 4.56e-07 40 8.34e-05 2.75e-09 2.92e-08 80 2.09e-05 1.73e-10 1.85e-09 160 5.21e-06 1.08e-11 1.17e-10 ord 2.00 4.00 3.99
O erro da natural fica junto da ponta direita, em para , onde a suposição falsa custa mais. Em sobre , onde de fato vale nas duas pontas, a spline natural recupera a ordem . Aqui o erro da fixada vezes dá , perto de , para esta . A cota da spline linear é quase atingida: medido contra em .
Exemplo 5: quando não é suave
Para em , é ilimitada em , então a hipótese falha.
textn linear uniforme cúbica uniforme cúbica graduada, x_i = (i/n)^4 20 5.59e-02 3.94e-02 7.20e-03 80 2.80e-02 1.97e-02 4.50e-04 320 1.40e-02 9.85e-03 2.81e-05
Na malha uniforme as duas ordens caem para , e o grau extra quase não compra nada. Splines aceitam qualquer malha, então os nós podem ser levados para perto da singularidade, o que dá ordem com o mesmo número de nós.
Exemplo 6: overshoot e extrapolação
Tome dados em e em . CubicSpline vai de a . A suavidade a empurra para além dos dados. Agora tome uma distribuição de latência ilustrativa, com ms e frações acumuladas , , , , , , , , . Nessa grade irregular a cúbica chega a perto de ms, uma probabilidade impossível, e decresce em cerca de um terço do intervalo. PchipInterpolator continua monótono, entre e , ao custo de ser só .
Fora dos dados, uma spline é apenas sua última cúbica, e CubicSpline extrapola por padrão. Para em 11 nós de , o valor em é contra , e em é contra . Passe extrapolate=False para receber nan ali.
Equívocos Comuns e Armadilhas
- "Splines nunca oscilam." Elas evitam o crescimento de Runge, não o overshoot: o Exemplo 6 ultrapassa em cerca de do degrau.
- "A spline natural é a escolha mais natural." O nome se refere à condição, não à precisão. Ela tem ordem 2, a não ser que se anule nas pontas (Exemplo 4).
- "
bc_type='clamped'significa que as inclinações são respeitadas." No SciPy essa string significa inclinação zero nas duas pontas. Em com ela dá erro , contra combc_type=((1, 1.0), (1, np.e)). - "Uma spline interpoladora remove ruído." Ela passa por todos os pontos, com ruído e tudo. Para dados ruidosos use um ajuste: veja
least-squares-curve-fittingouscipy.interpolate.make_smoothing_spline. - "Splines sempre vencem polinômios globais." Em funções suaves com nós escolhidos, a interpolação de Chebyshev acaba ganhando (Exemplo 3).
- "Livro vs hoje." Código antigo usa
scipy.interpolate.interp1d, que o SciPy agora chama de legado. Código novo deve usarCubicSpline,PchipInterpolatoroumake_interp_spline. Com a fronteira padrão,make_interp_spline(t, y, k=3)coincide comCubicSplineaté nos dados de degrau do Exemplo 6.
Resumo
Uma spline cúbica tem coeficientes e condições de coincidência, então duas condições de fronteira a completam. As segundas derivadas resolvem um sistema tridiagonal e estritamente diagonal dominante em , com numa malha uniforme natural. Para , splines not-a-knot e fixadas atingem ordem 4, e as naturais caem para ordem 2, a não ser que se anule nas pontas. Na função de Runge o erro vai de a entre e enquanto o polinômio equiespaçado explode, porque a resposta de uma spline a um valor é multiplicada por um fator de por intervalo. Splines cúbicas ainda ultrapassam os dados e extrapolam mal: use um interpolador monótono como o PCHIP quando a forma importa, e um ajuste quando os dados têm ruído.
Documentation Links
- Driscoll and Braun: Fundamentals of Numerical Computation, 5.2 Piecewise linear interpolation
- Driscoll and Braun: Fundamentals of Numerical Computation, 5.3 Cubic splines
- Demanet (2012): MIT OpenCourseWare 18.330, Chapter 3: Interpolation
- SciPy documentation: CubicSpline
- SciPy documentation: PchipInterpolator
- SciPy documentation: interp1d
- SciPy documentation: make_interp_spline
- SciPy documentation: make_smoothing_spline