Calcular

13

A função tem singularidade próxima de . Porém, essa singularidade pode ser levantada: para , deve-se ter , pois E, portanto, No entanto, a forma não é apenas definida em , também é numericamente instável nas proximidades desse ponto; a fim de avaliar para muito pequena numericamente, pode-se utilizar uma expansão de Taylor, ou seja, um truncamento da série de energia acima mencionado.x = 0 x = 1 f ( x ) = 1 e x = k = 0 x kf:x(ex1)/xx=0x=1f(x)=1(ex-1)/x=k=1x k - 1

ex=k=0xkk!
(ex-1)/xx=0
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x

P : A função tem um nome? Em outras palavras, isso é um problema comum?f

P : Alguém conhece uma biblioteca C / C ++ que lida bem com essa situação, ou seja, usa a expansão de Taylor de um grau apropriado próximo de 0 e a outra representação longe de zero?

anônimo
fonte

Respostas:

19

Possivelmente, pode-se começar com a função que faz parte do padrão C99, e calcula e x - 1 com precisão próximo de x = 0 .expm1ex1x=0

n00b
fonte
17

Esta é uma instância de erro de cancelamento. A biblioteca padrão C (a partir de C99) inclui uma função chamada expm1que evita esse problema. Se você usar em expm1(x) / xvez de (exp(x) - 1.0) / x, não terá esse problema (veja o gráfico abaixo). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </code>

Os detalhes e a solução desse problema específico são discutidos detalhadamente na Seção 1.14.1 de Precisão e estabilidade de algoritmos numéricos . A mesma solução também é explicada na página 19 do artigo de W. Kahan, intitulado Quão fúteis são as avaliações irracionais do arredondamento na computação em ponto flutuante? . A implementação real da expm1biblioteca GNU C é diferente da abordagem descrita nas referências acima e está completamente documentada no código fonte .

Juan M. Bello-Rivas
fonte
1
Obrigado, é exatamente o que eu precisava! Infelizmente, só posso aceitar uma resposta ...
anonymous
Claro! Nenhum problema :-)
Juan M. Bello-Rivas
3

Para responder à sua primeira pergunta, não, a função não tem um nome (pelo menos não é amplamente conhecido).

Como outros já mencionaram, a melhor maneira de calcular a função é tratar vários casos especiais. É assim que qualquer biblioteca calcularia a função.

  1. Caso 0: x = 0, retorne 1.
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. Caso mais: retorno expm1(x)/x.

Você pode ser mais sofisticado e, caso especial, mais coisas com a série Taylor truncada, mas provavelmente não vale a pena. De fato, não está totalmente claro que o caso 1 precise ser tratado separadamente, pois, como k20 apontou, o cancelamento é seguro. No entanto, lidar com isso separadamente me deixaria mais confiante.

Victor Liu
fonte
2

Lembro que essa pergunta foi feita anteriormente neste site e, surpreendentemente, a resposta é que você só precisa igualar a igualdade exata de zero em casos especiais. Os erros são cancelados perto de zero. Eu não tenho o link.

Sim, esta resposta estava completamente errada. Não sei ao certo por que foi tão votado, provavelmente porque foi declarado com tanta autoridade. Encontrei o link que tinha em mente. Estava na troca de pilha matemática aqui , não na troca de pilha scicomp. A expm1fórmula de cancelamento de erro-free é fornecida na resposta por JM e usa uma u = exp(x)transformação.

k20
fonte
xdx(edx-1)/dx(1+dx-1)/dx1
1
dx1+dx=1
0

Para responder à primeira pergunta e fornecer um método (provavelmente numericamente ineficiente) para a segunda, observe que esse é o inverso da função geradora dos números de Bernoulli .

Nikolaj-K
fonte
Essa é uma conexão interessante, obrigado por apontar isso. Infelizmente, acredito que a soma tripla tornará isso proibitivamente caro. Além disso, não está claro imediatamente onde truncar cada soma para obter a precisão desejada.
anônimo
@ anonymous: Que soma tripple você quer dizer? Você não precisa dos polinômios de Bernoulli, apenas dos números de Bernoulli, e pode listá-los com antecedência. Mas sim, ainda não é para ser melhor do que a série Taylor.
Nikolaj-K
Você pode computar isso com antecedência, se estiver claro que você só precisa de um número finito fixo para qualquer entrada.
anônimo
@ anonymous: Bem, sim, assim como você listaria os coeficientes de Taylor com antecedência.
Nikolaj-K