2014-11-17 6 views
2

왜이 프로그램이 잘못 되었습니까? 범위의 적분 황갈색 (X) (0 카운트 PI/2 (약 계산 ~ 39) 볼프람 알파는 말한다 여기서 ~ 7GSL 적분, 불량 수

내 코드 :.

#include <stdio.h> 
#include <math.h> 
#include <gsl/gsl_integration.h> 

double f (double x, void * params) { 
    double alpha = *(double *) params; 
    double f = tan(x); 
    return f; 
} 

int 
main (void) 
{ 
    gsl_integration_workspace * w 
    = gsl_integration_workspace_alloc (1000); 

    double result, error; 
    double expected = -4.0; 
    double alpha = 1.0; 
    gsl_function F; 
    F.function = &f; 
    F.params = &alpha; 
gsl_set_error_handler_off(); 

    gsl_integration_qag (&F, 0, M_PI/2, 0, 1e-6, 1000, 1, 
         w, &result, &error); 

    printf ("result   = % .18f\n", result); 
    printf ("exact result = % .18f\n", expected); 
    printf ("estimated error = % .18f\n", error); 
    printf ("actual error = % .18f\n", result - expected); 
    printf ("intervals = %d\n", w->size); 

    gsl_integration_workspace_free (w); 

    return 0; 
} 

난 gsl_set_error_handler_off을 삭제 한 경우() ;.. 내가 적분 유한 값이 없음을

답변

2

오류 "나쁜 적분 동작을"했다 그래서

tan(x) = sin(x)/cos(x) 

tan(pi/2) = 1/0 = undefined. 

따라서 숫자의 적분은 함수의 범위가 infinite이므로 범위가 벗어나야합니다.

당신은 해석이를 볼 수 있습니다

∫tan(x)dx 
= ∫sin(x)/cos(x)dx 
Define u=cos(x). Then du=-sin(x)dx, so 
∫sin(x)/cos(x)dx 
=-∫(-sin(x))/cos(x)dx 
=-∫1/u*du 
=-ln|u| + C 
=-ln|cos(x)| + C 

을 따라서, 적분을 0에서 파이로/2

= -ln|cos(pi/2)| - (-ln|cos(0)|) 
= -ln|0| + 0 

그러나, -ln (0) undefined이며, X 같은 양의 무한대에 접근 -> +0. 수치 적분 알고리즘은 알려진 슬라이스 아래에서 영역을 합산하여이 무한 적분을 근사화하려고 시도하고 오류 검출 이 비활성화 된 잘못된 큰 유한 결과를 생성합니다.. 오류 감지 이 활성화 된 경우 좋은 수치 적분 알고리즘은 수렴 오류 또는 integrand의 오류 평가와 같은 오류를 올바르게보고합니다. 오류 감지를 활성화하면 정확하게 gsl으로 표시됩니다.

Wolfram Alpha also reports an infinite value for ∫tan(x)dx at pi/2, 그래서 ~ 7 값을 얻지 못했습니다.

+1

고맙습니다. 나는 위젯을 http://www.wolframalpha.com/widgets/view.jsp?id=b20fa060328b0cdf51b464ee37efe182 또는 사이트 http://www.integral-calculator.com/#와 같이 사용했습니다. 결과는 7.1355입니다. –