Dado um conjunto de pontos em , eu gostaria de calcular exatamente. é o polinômio de Lagrange em relação aos pontos com como nó, ou seja, Como esse é um polinômio de grau , eu poderia usar qualquer quadratura gaussiana antiga de grau suficiente. Isso funciona bem se não for muito grande, mas gera resultados com erros de arredondamento para grande . [ - 1 , 1 ] ∫ 1 - 1 L i ( x )L i x j x i L i ( x ) = ∏ j ≠ i x - x j
nnn
Alguma idéia de como evitar isso?
quadrature
integration
Nico Schlömer
fonte
fonte
Respostas:
O cálculo de∫1−1Lk(x)dx
para os polinômios de Lagrangeeuk definidos em uma grade arbitráriaxk, k = 0 , … , n
pode ser realizado pelas duas etapas a seguir:
Calcule os pesos de quadratura de Clenshaw-CurtisWcck na grade extrema de Chebyshev yk para k = 0 , … , n :
yk= cos( k πn)Wcck= ckn( 1-∑j = 1⌊ n / 2 ⌋bj4 j2- 1porque( 2 πjkn) ))
ondebk: = 1 parak = n / 2 , caso contráriobk: = 2 eck: = 1 parak = 0 ouk = n , caso contráriock: = 2 . Veja o artigo de Waldvogel (2006) para mais detalhes.
Transformar os pesosWcck à rede arbitrária xk, k = 0 , … , n , através da matriz de transformação M para obter os pesos pretendidos Wk ,
Wk= ∑jMk jWccj
onde
Mj k = L j( yk).
Em princípio, este é apenas quadratura Clenshaw-Curtis com os valores da função da grelha arbitráriaxk , mas obtidos através de transformação com base (para um refernce geral em Clenshaw-Curtis, ver por exemplo o papel Trefethen).
O algoritmo parece bastante estável, principalmente quando comparado à abordagem de Vandermonde, conforme fornecida na resposta de @Kirill : embora siga as mesmas idéias - gere os pesos de quadratura em uma base conhecida e depois se transforme na nova grade - poderia ter sido esperado, já que a transformação em termos da matriz de Vandermonde é geralmente altamente mal condicionada.
Exemplo: Geração de pesos de quadratura de Legendre-Lobatto
Consideramos o exemplo da regra de quadratura de Legendere-Lobatto e comparamos a precisão com a abordagem monomial. Como referência, usamos os pesos em quadraturaWPernak obtidos pelo algoritmo Golub-Welsch para diferentes n e calculamos o erro acumulado
ϵn= ∑k = 1n( wk- wPernak)2
Aqui está o resultado:
Um observa que os pesos de quadratura de Clenshaw-Curtis são perfeitamente estáveis em toda a faixa considerada de pontos de grade e reproduzem os pesos de Legendre até a precisão da máquina ( ϵ√~ 1015 ).
Exemplo: Geração de fórmulas de quadratura de Newton-Cotes
Consideramos a geração da fórmula de quadratura de Newton-Cotes em grades igualmente espaçadas. Novamente, espera-se um mau condicionamento, pois, em suma, para interpolação polinomial, as grades igualmente espaçadas são baaad.
Na figura a seguir, calculei a soma absoluta dos pesos∑Eu| WEu| / N .
Até, digamos, 50 pontos de grade, o resultado da abordagem monomial e Clenshaw-Curtis concorda. Depois disso, Clenshaw-Curtis se torna melhor - pelo que vale a pena. Uma interpretação direta é que a grade igualmente espaçada arruina tudo para, digamos,n > 10 . Por volta de n = 50 , no entanto, a condição da matriz de Vandermonde revida e leva a um resultado ainda pior.
Exemplo: quadratura de Guass-Patterson
Este exemplo é devido ao @ NicoSchlömer. Eu não conhecia essas regras até agora, então peguei as abscissas dessa implementação e apliquei a abordagem de Vandermonde e a de Clenshaw-Curtis transformada (onde, como acima, a abordagem de Vandermonde está usando o algoritmo de Björk-Pereyra).
Conforme sugerido no comentário, calculei o erro de integrar uma função constante porϵ = 1n∣∣∣2 - ∑i = 1nWEu∣∣∣,
com o seguinte resultado:
A partir dessa imagem, a abordagem transformada de Clenshaw-Curtis parece muito mais eficiente que a abordagem de Vandermonde (pelo menos na aritmética de precisão finita). Ainda assim, Clenshaw-Curtis divide a partir do índice 7, portanto outros métodos devem ser usados.
fonte
Resultado:
Se
X
não for positivo como neste teste, parece que os erros relativos são da mesma ordem que com uma resolução linear regular.fonte
V.main(32)
produz uma resposta sensata em cerca de um segundo no meu laptop (enquanto uso apenas um pouco de memória). Os números nem são tão grandes, o maior numerador tem 54 dígitos, então eu suspeito que algo está errado para você. Você pode postar uma essência, porque estou curioso para ver como ela falha?Float64
parad
: verifique com@show typeof(d)
. Deixe-me saber se você encontrar mais problemas com ele.Calcule os produtos dos nominadores e denominadores primeiro e depois divida uma vez. Os dois produtos devem ser da mesma ordem de grandeza, para que não haja erros de arredondamento significativos. Além disso, você obtém o benefício adicional de maior velocidade, devido ao número reduzido de cálculos de ponto flutuante.
fonte