gpt4 book ai didi

c - GSL积分,错误计数

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:15 25 4
gpt4 key购买 nike

为什么这个程序错了;计算 (0, pi/2] 范围内的积分 tan(x)(计算大约 ~39),Wolfram Alpha 表示它是 ~7。

我的代码:

#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();我有错误“错误的被积函数行为”。

最佳答案

该积分没有有限值。

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到pi/2的积分

= -ln|cos(pi/2)| - (-ln|cos(0)|)
= -ln|0| + 0

但是,-ln(0) 是 undefined ,并且随着 x -> +0 接近正无穷大。数值积分算法将尝试通过对已知切片下的区域求和来近似这个无限积分,并产生错误的、大的有限结果,并禁用错误检测。通过错误检测启用,一个好的数值积分算法将正确报告错误,例如无法收敛或错误评估 integrand - 这正是您在 gsl 启用错误检测时所看到的。

Wolfram Alpha also reports an infinite value for ∫tan(x)dx at pi/2 ,所以我不确定您从哪里得到 ~7 的值。

关于c - GSL积分,错误计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com