2017-08-30 42 views
0

我需要整合这种振荡功能: enter image description here建议整合贝塞尔函数在C++

在那里我有贝塞尔函数是振荡的,而F是不是很振荡。我正在寻找最精确/准确的方法来在C++中执行此操作。但愿这应该是一个已经存在的实现,我可以如图书馆等使用通过......

的GSL库可能是一个选项,但请,即使在这种情况下,你能推荐我这许多例程avaialble是对我最有用?

编辑: 我知道这 possibly duplicate question

存在的,但我没有看到一个明确的答案在那里。另外,一个Fortran库对我来说不会有好处,除非它有某种包装。

+0

的可能的复制[在c贝塞尔函数集成++/Fortran的](https://stackoverflow.com/questions/29145922/integration-of-bessel-functions-in-c-fortran) – Beginner

+0

是对问题关于整合还是关于bessel功能?你确定没有分析解决方案,你不是吗? – DrSvanHay

+0

@DrSvanHay我的知识没有解析解决方案,所以问题是关于整合。当然,如果你们中的任何人都知道分析解决方案,那将是非常棒的 – johnhenry

回答

1

上次我不得不处理这些事情,最简单的方法就是对过零点定义的间隔进行简单的整合。在大多数情况下,这是相对稳定的,如果被积函数接近零,则合理快速地做到。

作为玩耍的起点,我已经加入了一些代码。当然你需要处理收敛检测和错误检查。这不是生产代码,但我想也许它提供了一个起点。它使用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; 
}