有限差分
概述
本包用于数值计算导数、梯度、雅可比矩阵、海森矩阵等。 该库旨在为最终用户提供可用的接口,同时最大化速度, 并针对数组类型和稀疏性进行特化。 包含以下内容:
- 完全无分配的 mutable 形式,以支持快速数组操作
- 完全非 mutating 形式,以支持静态数组
- 用于高效计算稀疏雅可比矩阵的着色向量
- 在有限差分允许的范围内,兼容 GPU。
如果你想要最快的版本,请创建一个缓存,并在不同的 x 值(或不同的 f 函数)上
重复调用差分函数;
如果你想要一个快速且粗略的数值答案,请直接调用差分函数。
对于使用自动微分的类似稀疏微分,请参阅 SparseDiffTools.jl。
FiniteDiff.jl 与 FiniteDifferences.jl
FiniteDiff.jl 和 FiniteDifferences.jl 是类似的库:两者都通过数值方法计算近似导数。 你绝对应该使用其中之一,而不是使用遗留的 Calculus.jl 有限差分,或自行重新实现。 在未来某个时间点,它们可能会合并,或者其中一个可能依赖于另一个。 目前,它们的区别如下:
- FiniteDifferences.jl 基本上支持任何类型,而 FiniteDiff.jl 仅支持数组类类型
- FiniteDifferences.jl 支持高阶近似
- FiniteDiff.jl 经过精心优化以最小化内存分配
- FiniteDiff.jl 支持着色向量以高效计算稀疏雅可比矩阵
总体结构
该库的总体结构如下。你可以直接调用差分 函数,这将分配一个临时缓存来解决问题。 为了使重复调用不产生内存分配,你可以调用缓存 构建函数。每个缓存构建函数有两种可能性: 一种是你提供原型数组,它生成缓存 变量;另一种是完全无分配的版本,你提供缓存 变量。总结如下:
- 只想快速求导?只计算一次?调用差分函数。
- 打算多次计算导数但没有现成的缓存数组 可用?使用分配式缓存,然后将其传入差分 函数(这将仅在缓存构建时分配一次)。
- 从你自己的算法中拥有缓存变量并希望 在差分函数中重用它们?使用无分配式缓存构建 并将缓存传入差分函数。
有关 API 的详细信息,请参阅文档。
函数定义
在所有函数中,inplace 形式为 f!(dx,x),而 out of place 形式为 dx = f(x)。
Coloring vectors
允许向 Jacobian 例程提供 Coloring vectors,这些是用于构建 Jacobian 的方向导数。例如,通过使用
colorvec=repeat(1:3,N÷3),仅需 4 次 f 调用即可计算出一个精确的
NxN 三对角 Jacobian。有关自动生成稀疏矩阵的 coloring
vectors 的信息,请参阅 SparseMatrixColorings.jl 和
现已弃用的 SparseDiffTools.jl。
Contributing
- 请参阅 SciML ColPrac: Contributor's Guide on Collaborative Practices for Community Packages 以获取有关 PR、issue 以及其他与向 SciML 贡献相关事项的指南。
- 请参阅 SciML Style Guide 了解常见的编码实践和其他风格决策。
- 有几个社区论坛:
- Julia Slack 中的 #diffeq-bridged 和 #sciml-bridged 频道
- Julia Zulip 中的 #diffeq-bridged 和 #sciml-bridged 频道
- 在 Julia Discourse forums 上
- 另请参阅 SciML Community page