Alguém pode explicar por que scipy.integrate.quad dá resultados diferentes para igualmente longos intervalos, integrando sin (X)?

StackOverflow https://stackoverflow.com/questions/581186

Pergunta

Eu estou tentando integrar numericamente um arbitrário de função (quando eu código conhecido) no meu programa usando métodos de integração numérica. Eu estou usando Python 2.5.2, juntamente com o pacote de integração numérica de SciPy. A fim de obter uma sensação para ela, eu decidi tentar integrar sin (x) e observou esse comportamento -

>>> from math import pi
>>> from scipy.integrate import quad
>>> from math import sin
>>> def integrand(x):
...     return sin(x)
... 
>>> quad(integrand, -pi, pi)
(0.0, 4.3998892617846002e-14)
>>> quad(integrand, 0, 2*pi)
(2.2579473462709165e-16, 4.3998892617846002e-14)

I encontrar este comportamento estranho porque -
1. No integração comum, integrando ao longo do ciclo completo dá zero.
2. Na integração numérica, isso (1) não é necessariamente o caso, porque você pode apenas ser aproximando a área total sob a curva.

Em qualquer caso, seja assumindo 1 é Verdadeiro ou assumindo 2 é verdadeiro, acho que o comportamento a ser inconsistente. Ou ambas as integrações (-pi para pi e 0 a 2 * pi) deve retornar 0,0 (primeiro valor na tupla é o resultado eo segundo é o erro) ou retornar 2.257 ...

Alguém pode explicar por que isso está acontecendo? Isso é realmente uma inconsistência? Alguém pode também dizer-me se eu estou faltando alguma coisa realmente básicas sobre métodos numéricos?

Em qualquer caso, no meu aplicativo final, eu pretendo usar o método acima para encontrar o comprimento do arco de uma função. Se alguém tem experiência nesta área, por favor avise-me sobre a melhor política para fazer isso em Python.

Editar
Nota
Já tenho os primeiros valores diferenciais em todos os pontos do intervalo armazenado em uma matriz.
erro atual é tolerável.
Nota Final

Eu li Wikipaedia sobre este assunto. Como Dimitry apontou, eu vou ser integrando sqrt (1 + diff (f (x), x) ^ 2) para obter o comprimento do arco. O que eu queria perguntar era - há uma melhor aproximação / Melhores práticas caminho / mais rápido para fazer isso (?). Se mais contexto é necessário, eu vou postá-lo contexto separadamente / post aqui, como você deseja.

Foi útil?

Solução

A função quad é uma função de uma biblioteca Fortran idade. Ele funciona através julgar pelo nivelamento e inclinação da função que está integrando como tratar o tamanho do passo será usada para a integração numérica, a fim de eficiência maximizar. O que isto significa é que você pode obter respostas ligeiramente diferentes de uma região para a próxima mesmo se eles são analiticamente o mesmo.

Sem dúvida ambas as integrações deve retornar zero. Retornando algo que é 1 / (10 trilhões) é muito próximo de zero! As ligeiras diferenças são devidas à maneira quad está rolando sobre sin e alterar os seus tamanhos de passo. Para a sua missão prevista, quad será tudo que você precisa.

EDIT: Para o que você está fazendo eu acho quad é bom. É rápido e bastante precisa. A minha declaração final é usá-lo com confiança a menos que você encontrar algo que realmente tem ido muito errado. Se ele não retornar uma resposta sem sentido, então ele provavelmente está funcionando muito bem. Não se preocupe.

Outras dicas

Eu acho que é provavelmente precisão da máquina já que ambas as respostas são efetivamente zero.

Se você quer uma resposta da boca do cavalo que eu ia postar essa pergunta na discussão scipy placa

Eu diria que um número O (10 ^ -14) é efetivamente zero. Qual é a sua tolerância?

Pode ser que o quad subjacente algoritmo não é a melhor. Você pode tentar um outro método para a integração e ver se isso melhora as coisas. A 5ª ordem de Runge-Kutta pode ser uma técnica de propósito geral muito bom.

Poderia ser apenas a natureza de números de ponto flutuante: "O que Cientista cada computador deve saber sobre ponto flutuante aritmético".

Esta saída parece correto para mim desde que você tem estimativa de erro absoluto aqui. O valor integral do sin (x) é de fato deve ter valor de zero para período integral (qualquer intervalo de 2 comprimento pi *), tanto a integração comum e numérico e seus resultados é próximo ao valor.
Para avaliar arco comprimento deve calcular integrante para sqrt (1 + dif (f (x), x) ^ 2) função, onde diff (f (x), x) é derivada de f (x). Veja também Arc comprimento

0.0 == 2.3e-16 (absolute error tolerance 4.4e-14)

Ambas as respostas são as mesmas e correta ou seja, de zero dentro da tolerância dada.

A diferença vem do fato de que o pecado (x) = - sin (-x) exatamente mesmo em precisão finita. Considerando precisão finita só dá sin (x) ~ sin (x + 2 * pi) aproximadamente. Claro que seria bom se quad foram suficientes inteligente para descobrir isso, mas realmente não tem nenhuma maneira de saber a priori que a integral ao longo dos dois intervalos que você dá são equivalentes ou que o primeiro é um resultado melhor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top