0

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

(示例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:在 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;
}

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

4

3 回答 3

4

感谢 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 (reason, gsl_errno, value) 此宏与 GSL_ERROR 相同,但返回用户定义的 value 值而不是错误代码。它可用于返回浮点值的数学函数。

以下示例显示如何使用 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;
}

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

于 2011-04-28T16:48:42.553 回答
0

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

于 2011-04-19T14:12:30.870 回答
0

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

于 2011-04-19T14:19:57.150 回答