GSL :

2011-04-19 5 views
0

내가 통합 그러나 http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html 의 GSL을 사용하려면보고 오류, 내가 어떻게 통합 기능 더 편리한 방법을 찾을GSL :

가 오류를보고 할 수 있습니다 (예 http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html의 함수 f) 통합 자에게. 나는 그 자체가 실패 할 수있는 통합으로부터 오는 기능을 통합하고 싶다. 이 출력 상태 = 0 상태의 결과로 내 샘플 프로그램

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

double f (double x, void * params) { 
    GSL_ERROR("test error",GSL_FAILURE); 
    return 0.0; 
} 



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

double result, error; 

gsl_function F; 
F.function = &f; 

gsl_set_error_handler_off(); 
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, 
        w, &result, &error); 

printf ("status   = %d\n", status); 
status = GSL_FAILURE; 
printf ("status   = %d\n", status); 


gsl_integration_workspace_free (w); 

return 0; 
} 

= -1 나는 통합 오히려 중지하고 내 오류 코드를 반환해야한다고 생각

입니다. 이것을 어떻게 할 수 있습니까?

도움 주셔서 감사합니다.

2011-04-27 : 브라이언 고프는 나에게 말했다 후 나는 또한,이 변형을 시도

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

double f (double x, void * params) { 
    GSL_ERROR("test error",GSL_FAILURE); 
    return GSL_NAN; 
} 



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

double result, error; 

gsl_function F; 
F.function = &f; 

gsl_set_error_handler_off(); 
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, 
        w, &result, &error); 

printf ("status   = %d\n", status); 
status = GSL_FAILURE; 
printf ("status   = %d\n", status); 


gsl_integration_workspace_free (w); 

return 0; 
} 

가 도움이되지 않았다. 이제 버그 보고서를 작성하겠습니다.

답변

3

감사를 할 수있다 GSL_ERROR 가 호출 된 때문에, NAN을 반환하기 전에이 기능은 이미 반환

 gsl_error (reason, __FILE__, __LINE__, gsl_errno); 
     return gsl_errno; 

같은 매크로, 그것은 보인다. 핸들러를 끄면 첫 번째 행은 아무 것도 수행하지 않습니다. . 기본 오류 처리기는 오류 메시지를 인쇄 한 후 프로그램을 중단합니다.

나는 버그라고 생각하지 않습니다. 어쩌면 자신의 오류 처리기 을 작성하여 문제를 해결할 수 있습니다. 예를 들어 "goto"를 사용하여 gsl_integration_qags를 뛰어 넘거나 일부 글로벌 변수를 설정하여 통합 결과가 잘못되었음을 나타낼 수 있습니다.

PS : 나는,이 매크로는 당신이 필요로하는 무엇이라고 생각

매크로 : GSL_ERROR_VAL (이유, gsl_errno, 값) 이 매크로는 GSL_ERROR과 동일하지만 대신 값의 사용자 정의 값 을 반환 에러 코드. 부동 소수점 값을 반환하는 수학 함수 에 사용할 수 있습니다.

다음의 예는

if (x == 0) 
    { 
    GSL_ERROR_VAL("argument lies on singularity", 
        GSL_ERANGE, GSL_NAN); 
    } 

그래서 내가

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

double f (double x, void * params) { 
// return GSL_NAN; 
    GSL_ERROR_VAL ("argument lies on singularity", GSL_ERANGE, GSL_NAN); 
} 



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

double result, error; 

gsl_function F; 
F.function = &f; 

gsl_set_error_handler_off(); 
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000, 
        w, &result, &error); 

printf ("status   = %d\n", status); 
status = GSL_FAILURE; 
printf ("status   = %d\n", status); 


gsl_integration_workspace_free (w); 

return 0; 
} 

에 따라 코드를 조정의 GSL_ERROR_VAL 매크로를 사용하여 수학 특이점에서 NaN의를 반환하는 방법을 보여줍니다 모든 것이 예상대로 작동합니다. ..

0

약간 hackish,하지만 아마도 당신의 함수를 몇 가지 플래그를 저장해야 겠어. 오류가 발생하면 플래그를 설정하고 모든 후속 평가에 대해 0을 리턴합니다. 그런 다음 통합 한 후이 플래그를 검사하여 결과가 유효한지 확인할 수 있습니다.

+0

안녕하세요 Rhys, 힌트를 주셔서 감사합니다, 동료가하는 방식입니다. 나는 평가를 정말로 멈추는 것이 더 좋을 것이라고 생각한다. 현재 -fexception CFLAG로 GSL을 컴파일하고 C++ 예외 처리를 사용합니다. 그러나 일반적으로 GSL은 예외를 지원하지 않으며 C++이기 때문에 좀 더 직접적인 방법으로 검색했습니다. – 7asd23hasd

0

함수 결과 및 오류 상태를 포함하는 구조체에 대한 포인터를 반환하는 함수의 래퍼를 작성하는 것은 어떻습니까?

안녕하세요,

GSL_ERROR 자체입니다 : 당신이 C의 ++를 사용하는 경우 또는,이 캡슐은 .... 물체의 사용으로 문제가 해결 된 GSL의 메일 링리스트에서 Xuebin 우에

+0

안녕 데이비드, 난 그냥 그 오류로 인해 gsl_integration_qags 중지 f를 원한다 ... – 7asd23hasd

관련 문제