gpt4 book ai didi

julia - 在 julia : integration_qawc 中使用 GSL.jl 集成例程

转载 作者:行者123 更新时间:2023-12-03 21:55:47 24 4
gpt4 key购买 nike

类似于 GSL.jl/examples/Quadrature.jl 中给出的示例,我正在尝试集成一个函数。但是,由于此函数具有奇异性,因此我需要使用柯西权重。我的想法是使用下面的代码

using GSL
function Q(p)
ws_size = 200
ws = GSL.integration_workspace_alloc(ws_size)
f_ = x -> 1/(x+p)
f = GSL.@gsl_function(f_)
result = Cdouble[0][1]
epsrel = 1e-10
epsabs = 1e-10
abserr = Cdouble[0][1]
limit = Csize_t[0][1]
result = integration_qawc(f, 0., 1.e4, p, epsabs,epsrel,limit,ws,result,abserr)
GSL.integration_workspace_free(ws)
return result
end

但是,我得到以下错误

    UndefVarError: f_ not defined

Stacktrace:
[1] (::getfield(Main, Symbol("##117#118")))(::Float64, ::Ptr{Nothing}) at /home/varantir/.julia/packages/GSL/IVE5m /src/manual_wrappers.jl:45
[2] integration_qawc at /home/varantir/.julia/packages/GSL/IVE5m/src/gen/direct_wrappers/gsl_integration_h.jl:570 [inlined]
[3] Q(::Float64) at ./In[250]:14

[4] In[251]:1 的顶级作用域

这对我来说似乎有点奇怪,因为我清楚地定义了 f_。有什么想法吗?

最佳答案

出于一个奇怪的原因,这不会抛出错误而是抛出 0:

function Q(p)
ws_size = 200
ws = GSL.integration_workspace_alloc(ws_size)
f0(x::Float64)::Float64 = 1/(x+p)
f = GSL.@gsl_function(f0)
result = Cdouble[0][1]
epsrel = 1e-10
epsabs = 1e-10
abserr = Cdouble[0][1]
limit = Csize_t[0][1]
result = integration_qawc(f, 0., 1.e4, p, epsabs,epsrel,limit,ws,result,abserr)
GSL.integration_workspace_free(ws)
return result
end

来自 integration_qawc 的文档:

使用了 QAG 的自适应二分算法,并进行了修改以确保在奇异点 x = c 处不会发生分割。当子区间包含点 x = c 或接近它时,将使用特殊的 25 点修改 Clenshaw-Curtis 规则来控制奇点。远离奇点,该算法使用普通的 15 点高斯-克朗罗德积分法则。

使用替代方法,使用 QuadGK.jl:

using QuadGK
function G2(p)
f(x)=1/(x+p)
a = 0.0
b = 1e4
if a<-p<b
res, err = quadgk(f,a,-p,b,rtol=1e-10,atol=1e-10)
return res
else
res, err = quadgk(f,a,b,rtol=1e-10,atol=1e-10)
return res
end
end

来自 QuadGK 文档:

该算法是一种自适应 Gauss-Kronrod 积分技术:使用 Kronrod 规则(2*order+1 点)估计每个区间的积分,并使用嵌入式高斯规则估计误差(顺序点)。然后将具有最大误差的区间分割为两个区间并重复该过程,直到达到所需的误差容限。

这些正交规则最适用于每个区间内的平滑函数,因此如果您的函数具有已知的不连续性或其他奇异性,最好分割您的区间以将奇异性置于端点。例如,如果 f 在 x=0.7 处有一个不连续点,而你想从 0 积分到 1,你应该使用 quadgk (f, 0,0.7,1) 在不连续点分割区间。被积函数永远不会在区间的端点处精确求值,因此只要奇点是可积的(例如,log(x)1/sqrt(x) 奇点)。

默认顺序为 7,等同于 GSL 集成。

关于julia - 在 julia : integration_qawc 中使用 GSL.jl 集成例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224242/

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