누군가 scipy.integrate.quad가 왜 Sin (x)을 통합하는 동안 똑같이 긴 범위에 대해 다른 결과를 제공하는 이유를 설명 할 수 있습니까?

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

문제

수치 통합 방법을 사용하여 프로그램에서 임의의 (코드 코드) 기능을 수치 적으로 통합하려고합니다. Scipy의 수치 통합 패키지와 함께 Python 2.5.2를 사용하고 있습니다. 느낌을 얻기 위해 나는 죄를 통합하기로 결정 하고이 행동을 관찰했습니다.

>>> 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)

이 행동이 이상하다고 생각합니다.
1. 일반적인 통합에서 전체 사이클을 통합하면 0이됩니다.
2. 수치 적 통합에서,이 (1)은 반드시 곡선 아래의 전체 면적을 근사화 할 수 있기 때문에 반드시 그런 것은 아닙니다.

어쨌든, 1이 true라고 가정하거나 2가 참이라고 가정하면, 나는 그 행동이 일관성이 없다고 생각합니다. 통합 (-pi ~ pi 및 0 ~ 2*pi) 모두 0.0 (튜플의 첫 번째 값은 결과이고 두 번째 값은 오류입니다) 또는 2.257을 반환해야합니다.

누군가 왜 이런 일이 일어나고 있는지 설명해 주시겠습니까? 이것이 정말로 불일치입니까? 수치 방법에 대해 정말로 기본적인 것을 놓치고 있는지 누군가가 말해 줄 수 있습니까?

어쨌든 최종 응용 프로그램에서는 위의 방법을 사용하여 함수의 아크 길이를 찾을 계획입니다. 누군가이 분야에서 경험이 있다면, 파이썬 에서이 작업을 수행하는 최선의 정책에 대해 저에게 알려주십시오.

편집하다
메모
나는 이미 배열에 저장된 범위의 모든 지점에서 첫 번째 차등 값을 가지고 있습니다.
현재 오류는 허용 가능합니다.
끝 참고

나는 이것에 대해 Wikipaedia를 읽었습니다. Dimitry가 지적했듯이, 나는 아크 길이를 얻기 위해 sqrt (1+diff (f (x), x)^2)를 통합 할 것입니다. 내가 묻고 싶은 것은 - 더 나은 근사 / 모범 사례 (?) / 더 빠른 방법이 있습니까? 더 많은 컨텍스트가 필요한 경우, 원하는대로 여기에 별도로 게시/ 게시물을 게시하겠습니다.

도움이 되었습니까?

해결책

그만큼 quad 함수는 이전 포트란 라이브러리의 함수입니다. 함수의 평탄도와 기울기로 판단하여 효율성을 극대화하기 위해 수치 적분에 사용하는 단계 크기를 처리하는 방법을 통합하는 것입니다. 이것이 의미하는 바는 분석적으로 동일하더라도 한 지역과 다음 지역으로 약간 다른 답변을 얻을 수 있다는 것입니다.

의심 할 여지없이 두 통합은 0을 반환해야합니다. 1/(10 조) 인 것을 반환하는 것은 0에 매우 가깝습니다! 약간의 차이는 그 길에 기인합니다 quad 롤오버됩니다 sin 그리고 계단 크기를 변경합니다. 계획된 작업을 위해 quad 필요한 전부입니다.

편집 : 당신이하는 일에 대해 나는 생각합니다 quad 괜찮습니다. 빠르고 매우 정확합니다. 나의 마지막 진술은 당신이 실제로 꽤 잘못된 것을 찾지 않는 한 자신감을 가지고 그것을 사용하는 것입니다. 무의미한 답변을 반환하지 않으면 아마도 잘 작동 할 것입니다. 걱정 마.

다른 팁

두 답변이 효과적으로 0이기 때문에 아마도 기계 정밀도라고 생각합니다.

말의 입에서 답을 원한다면이 질문을 Scipy 토론 보드

나는 숫자 O (10^-14)가 효과적으로 0이라고 말할 것입니다. 당신의 관용은 무엇입니까?

쿼드의 기본 알고리즘이 최고가 아닐 수도 있습니다. 통합을위한 또 다른 방법을 시도하고 그것이 개선되는지 확인할 수 있습니다. 5 차 Runge-Kutta는 매우 멋진 범용 기술이 될 수 있습니다.

플로팅 포인트 숫자의 특성 일 수 있습니다. "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것".

여기에 절대 오류 추정치가 있기 때문에이 출력은 나에게 정확해 보입니다. sin (x)의 적분 값은 실제로 일반 통합 및 숫자 통합 모두에서 전체 기간 (2*pi 길이의 간격)에 대해 0의 값을 가져야하며 결과는 해당 값에 가깝습니다.
아크 길이를 평가하려면 sqrt (1+diff (f (x), x)^2) 함수에 대한 적분을 계산해야합니다. 여기서 diff (f (x), x)는 f (x)의 미분입니다. 또한보십시오 아크 길이

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

두 답변 모두 동일합니다 옳은 즉, 주어진 공차 내에서 0.

차이는 죄 (x) =-sin (-x)이 유한 한 정밀도에서도 정확히 일치한다는 사실과 비슷합니다. 유한 정밀도는 sin (x) ~ sin (x+2*pi) 만 대략 만 제공합니다. 물론 쿼드가 이것을 알아낼 수있을만큼 똑똑하다면 좋을 것입니다. 그러나 당신이 제공하는 두 간격에 대한 적분이 동일하거나 첫 번째가 더 나은 결과라는 것을 알 수있는 방법은 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top