上次我不得不处理这些事情,最简单的方法就是对过零点定义的间隔进行简单的整合。在大多数情况下,这是相对稳定的,如果被积函数接近零,则合理快速地做到。
作为玩耍的起点,我已经加入了一些代码。当然你需要处理收敛检测和错误检查。这不是生产代码,但我想也许它提供了一个起点。它使用gsl。
在我的iMac上,此代码每次迭代大约需要2μs。通过在间隔中包含硬编码表格,它不会变得更快。
我希望这对你有一些用处。
#include <iostream>
#include <vector>
#include <gsl/gsl_sf_bessel.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_sf.h>
double f (double x, void * params) {
double y = 1.0/(1.0 + x) * gsl_sf_bessel_J0 (x);
return y;
}
int main(int argc, const char * argv[]) {
double sum = 0;
double delta = 0.00001;
int max_steps = 1000;
gsl_integration_workspace * w = gsl_integration_workspace_alloc (max_steps);
gsl_function F;
F.function = &f;
F.params = 0;
double result, error;
double a,b;
for(int n=0; n < max_steps; n++)
{
if(n==0)
{
a = 0.0;
b = gsl_sf_bessel_zero_J0(1);
}
else
{
a = n;
b = gsl_sf_bessel_zero_J0(n+1);
}
gsl_integration_qag (&F, // function
besselj0_intervals[n], // from
besselj0_intervals[n+1], // to
0, // eps absolute
1e-4,// eps relative
max_steps,
GSL_INTEG_GAUSS15,
w,
&result,
&error);
sum += result;
std::cout << n << " " << result << " " << sum << "\n";
if(abs(result) < delta)
break;
}
return 0;
}
的可能的复制[在c贝塞尔函数集成++/Fortran的](https://stackoverflow.com/questions/29145922/integration-of-bessel-functions-in-c-fortran) – Beginner
是对问题关于整合还是关于bessel功能?你确定没有分析解决方案,你不是吗? – DrSvanHay
@DrSvanHay我的知识没有解析解决方案,所以问题是关于整合。当然,如果你们中的任何人都知道分析解决方案,那将是非常棒的 – johnhenry