2014-11-17 3 views
2

Почему эта программа не так; рассчитывать интегральный загар (х) в интервале (0, р/2] (в пересчете около ~ 39), где Wolfram Alpha говорит, что ~ 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, и приближается к положительной бесконечности, как х -> +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 –

Смежные вопросы