2011-04-19 212 views
0

我想用GSL整合 http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html 不过,我觉得没有简便的方法如何综合功能GSL:错误报告

可以报告错误(在本例中http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html函数f)给集成商。我想集成一个本身可能导致失败的集成的函数。这是我的示例程序

#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; 
} 

导致输出 状态= 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邮件列表的问题就解决了:

嗨,

GSL_ERROR本身宏,它看起来像

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

该函数返回前南,因为GSL_ERROR 被称为已经返回。关闭处理程序只需让第一行不做任何事。默认错误处理程序在打印 错误消息后中止程序。

我不认为这是一个错误。也许你可以编写自己的错误处理程序 来解决你的问题。例如,您可以使用“goto”跳出 gsl_integration_qags,或者设置一些全局变量以指示 积分结果不正确。

PS:我认为这个宏是你需要什么,

宏:GSL_ERROR_VAL(原因,gsl_errno,值) 这个宏是一样的GSL_ERROR但返回的值用户定义的值 ,而不是一个错误代码。它可以用于返回浮点值的数学函数 。

下面的例子演示了如何在使用GSL_ERROR_VAL宏观数学 奇点返回NaN时,

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; 
} 

调整的代码,一切正常。 ..

0

有点骇人听闻,但我可能会让你的功能存储一些标志。遇到错误时,它将设置标志并为所有后续评估返回零。然后,在集成它之后,您可以检查该标志以查看结果是否有效。

+0

你好莱斯,谢谢你的提示,那是一个同事这样做的方式。我认为真正停止评估会更好(也关于速度)。目前,我使用-fexception CFLAG编译GSL并使用C++异常处理。但是,通常GSL不支持异常,它们是C++,所以我寻找更直接的方法。 – 7asd23hasd 2011-04-19 16:07:03

0

如何为返回指向结构的函数的函数编写包装,包含函数结果和错误状态?或者,如果您使用C++,这种封装可以与使用对象做出....

+0

大卫您好,我只是希望gsl_integration_qags停止,因为f中报告的错误... – 7asd23hasd 2011-04-19 16:04:32