elementary 设计
本页解释 elementary 门面包:它暴露了哪些解析 trait,它们的求导规则依据何在,以及它们的适用范围止于何处。
设计目标
通过恰好暴露 Dual[T] 以正确求导规则实现的那些 trait,使针对 arithmetic trait 编写的解析代码无需修改即可求导。
数学背景
每条规则都具有 的形式(dual 设计 由它推导出链式法则)。所用的导数都是经典导数;对于反函数和换底的情形,它们由链式法则得出:
每个公式在 可导的开定义域上成立:平方根和对数要求 ,正切要求 ,而 、 和 处处成立。
设计决策
暴露 Dual[T] 所实现的内容
门面包重新导出 Sqrt、SqrtChecked、Exponential、Logarithmic、Trigonometric 和 Constants,即在 Dual[T] 上有实例的解析 trait。arithmetic 还定义了 Hyperbolic、InverseTrigonometric、InverseHyperbolic、Cbrt 和 Power;Dual[T] 目前还没有它们的实例,因此没有重新导出。
实例需要整个 trait
trait 实例必须提供它的所有方法。Exponential 包含 exp2,而其规则需要 ,因此即使调用方只用到 exp,该实例也要求 T 实现 Logarithmic 和 IntegralHomomorphism。对于这种情况,固有方法 Dual::exp 只需较小的约束 Exponential + Mul。
常数的切向分量为零
、 和 不依赖于求导变量,因此 Constants 实例用 Dual::constant 嵌入它们。这是保持结构的选择:映射 ,,是环同态。
正确性与不变量
- 每条规则都与上面的导数表一致,并在
Double上经过测试(sin、exp等测试位于src/tests/dual_test.mbt)。 - 在开定义域之外,结果沿用
T的行为:对于Double,ln(0)为 ,切向分量为 ;sqrt在 处的切向分量为无穷大或 NaN。 - 切向分量的误差是
T对 的实现误差再加上至多两次舍入;见 dual 设计。
被否决的方案
- 重新导出所有解析 trait。 像
T : Hyperbolic这样的约束对T能通过类型检查,却无法在Dual[T]处实例化,这会令人困惑。 - 在本仓库中提供带检查的对数。
arithmetic没有可供实现的带检查对数 trait;在本地新增一个会使错误模型产生分叉。
边界
- 没有双曲函数、反三角函数、反双曲函数、立方根或一般幂函数的规则。
- 除
SqrtChecked外没有其他带检查的形式。 - 没有分支切割或复数域语义;复变函数请参阅 luna-complex。