【问题标题】:GSL: Error reportingGSL:错误报告
【发布时间】:2011-08-08 15:31:17
【问题描述】:

我想使用 GSL 进行集成 http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html 但是,我找不到方便的方法如何集成功能

(示例中的函数 f http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html

可以向集成商报告错误。我想集成一个功能,该功能本身是由可能失败的集成产生的。这是我的示例程序

#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:在 Brian Gough 告诉我之后,我也尝试了这个变体,

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

它也没有帮助。我现在将填写一份错误报告。

【问题讨论】:

    标签: error-handling integration gsl


    【解决方案1】:

    有点老套,但我可能会让你的函数存储一些标志。当它遇到错误时,它会设置标志并为所有后续评估返回零。然后,在你集成它之后,你可以检查这个标志来查看结果是否有效。

    【讨论】:

    • 你好 Rhys,谢谢你的提示,这是同事的做法。我认为真正停止评估会更好(也涉及速度)。目前我使用 -fexception CFLAG 编译 GSL 并使用 C++ 异常处理。不过一般GSL是不支持异常的,都是C++的,所以我找了个更直接的方法。
    【解决方案2】:

    如何为函数编写一个包装器,它返回指向结构的指针,包含函数结果和错误状态?或者,如果您使用 c++,则可以使用对象进行这种封装 ....

    【讨论】:

    • 你好大卫,我只想让 gsl_integration_qags 由于 f 中报告的错误而停止...
    【解决方案3】:

    感谢 GSL 邮件列表中的 Xuebin Wu,问题得到解决:

    嗨,

    GSL_ERROR 本身就是一个宏,看起来像

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

    函数在你返回 NAN 之前已经返回,因为 GSL_ERROR 已被调用。关闭处理程序只需让第一行执行 没有。默认错误处理程序在打印后中止程序 错误信息。

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

    PS:我相信这个宏就是你需要的,

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

    以下示例显示如何以数学形式返回 NaN 使用 GSL_ERROR_VAL 宏的奇点,

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

    一切都按预期工作......

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多