Julia 中偏微分方程求解的有限差分算子(DiffEqOperators 备选方案)

Finite difference operators for PDE solving in Julia (DiffEqOperators alternative)

提问人:NMP 提问时间:11/15/2023 更新时间:11/15/2023 访问量:24

问:

过去,我使用 DiffEqOperators.jl 来解决非均匀网格上的偏微分方程,但现在这个包已经存档,我正在努力寻找提供相同功能的替代方案。

我有一个类似福克-普朗克的方程

du(x,t)/dt = d[B(x)u(x,t)]^2/dx^2 + C*delta(x-z)

边界内的 delta 函数使这变得有些复杂。

我使用的是 Chris Rackauckas 在本概述 https://nextjournal.com/sosiris-de/pde-2018 中概述的线方法。基本上,我会取一个(非均匀)网格(长度的一维向量),我可以直接获得所需阶数的微分算子。有了这个,我可以计算所有点,以获得每个网格点的微分(其中是 $z$ 处的增量函数的一些表示)。然后,我可以用 OrdinaryDiffEq 来发展。dx_iLΔ = CenteredDifference(2, order, dx_i, L)Δ*B*u_idu_i .= Δ*B*u_i + C*deltaZ_ideltaZ_i

如果我理解正确的话,现在建议将 MethodOfLines.jl 包用于这种类型的离散化和随后的 MOL 演化,但是我发现它既不像我以前的“手动”实现那样性能也不准确(尽管这可能只是我滥用了它),并且更愿意实现我自己的离散化。

因此,我的问题是,是否仍然有一个包实现了有限差分运算符 - 在非均匀网格和(某种程度上)任意顺序 - 可以应用于我只在我选择的网格点上具有值的函数。dx_i

我已经查看了 FiniteDifferences.jl 和 FiniteDiff.jl,但它们似乎需要函数形式,为此我需要执行额外的插值步骤。f(x)

例如,在 FiniteDiff.jl 中计算导数时,调用

FiniteDiff.finite_difference_derivative(
    f,
    x          :: AbstractArray{<:Number},
    fdtype     :: Type{T1} = Val{:central},
    returntype :: Type{T2} = eltype(x),      # return type of f
    fx         :: Union{Nothing,AbstractArray{<:Number}} = nothing,
    epsilon    :: Union{Nothing,AbstractArray{<:Real}} = nothing;
    [epsilon_factor])

(或潜在的就地或缓存形式),它计算 的导数,它必须是一个函数;而我的解决方案仅在网格点处有值。FiniteDifferences.jl 包也是如此。也许我在这里遗漏了什么?fu_ii

Julia PDE 微分方程.JL 有限差分

评论


答: 暂无答案