c - Julia:调用 GSL 函数

标签 c julia gsl scientific-computing

我正在尝试使用 GSL 数值积分函数 QNG 在 Julia 中积分一个简单的函数。 C 中函数的形式为

int gsl_integration_qng (const gsl_function * f, double a, double b,
 double epsabs, double epsrel, double * result, double * abserr, size_t * neval)

我正在尝试执行以下集成

f(x) = x^2
a, b, epsabs, epsrel = 0.0, 1.0, 1.0e-2, 1.0e-2
result, abserr = 0.0, 0.0
neval =  0x123456789abcdef
0x0123456789abcdef
t = ccall( (:gsl_integration_qng, "libgsl"), Int32, 
(Ptr{Void}, Float64, Float64, Float64, Float64, Ptr{Float64}, Ptr{Float64},Csize_t), 
  &f, a, b, epsabs, epsrel, &result, &abserr, neval)

感谢任何帮助。

最佳答案

I wrote a blog post awhile ago on how to do this在不同的 GSL 集成功能上。

其要点是:

定义参数类型函数

function integrand{T,T2,T3}(x::T,dim::T2,params::T3)
  A = 1.0 / (pi * pi * pi)
  return A / (1.0 - cos(unsafe_load(x,1))*cos(unsafe_load(x,2))*cos(unsafe_load(x,3)))::Cdouble
end

然后获取指针

integrand_c = cfunction(integrand,Cdouble,(Ptr{Cdouble},Ptr{Cdouble},Ptr{Cdouble}))

然后ccall GSL 函数,并将函数指针作为参数之一。在我的例子中:

ccall((:monte_carlo_integrate,"/home/crackauc/Public/libMonte.so"),Int32,(Ptr{Void},Ptr{Cdouble},Ptr{Cdouble},Int32,Int32,Ptr{Cdouble},Ptr{Cdouble},Csize_t),integrand_c,x,y,mode,dim,xl,xu,calls)

关于c - Julia:调用 GSL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30777823/

相关文章:

通过 M<N 的 GSL 计算矩阵的零空间会产生错误

c 函数 - 调用具有无类型参数的函数,并忽略该参数

Julia - 最小二乘 - LSMR 和封闭形式的解决方案不同于真实的 `\beta`?

visual-studio-code - 在 VS code 中运行 Julia REPL 中的 md 文件

c++ - 与 C++ 共享 Julia 对象的最有效方法是什么?

c++ - 在 Windows 10 中将 GSL 库链接到 RcppGSL

c++ - C++ 中的复杂矩阵指数

ios - 如何在 Xcode 11 包管理器中处理 C 文件?

c - 如何使用系统调用Read?段错误(核心转储)错误

c - 在c中使用ARM MCU保存数据