提问人:NMP 提问时间:11/15/2023 更新时间:11/15/2023 访问量:24
Julia 中偏微分方程求解的有限差分算子(DiffEqOperators 备选方案)
Finite difference operators for PDE solving in Julia (DiffEqOperators alternative)
问:
过去,我使用 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_i
L
Δ = CenteredDifference(2, order, dx_i, L)
Δ*B*u_i
du_i .= Δ*B*u_i + C*deltaZ_i
deltaZ_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 包也是如此。也许我在这里遗漏了什么?f
u_i
i
答: 暂无答案
评论