elementary 设计

本页解释 elementary 门面包:它暴露了哪些解析 trait,它们的求导规则依据何在,以及它们的适用范围止于何处。

设计目标

通过恰好暴露 Dual[T] 以正确求导规则实现的那些 trait,使针对 arithmetic trait 编写的解析代码无需修改即可求导。

数学背景

每条规则都具有 f(a+bε)=f(a)+f′(a) b εf(a + b\varepsilon) = f(a) + f'(a)\,b\,\varepsilon 的形式(dual 设计 由它推导出链式法则)。所用的导数都是经典导数;对于反函数和换底的情形,它们由链式法则得出:

ddaa=12afrom (a)2=a,dda 2a=dda ealn⁡2=2aln⁡2,ddalog⁡2a=ddaln⁡aln⁡2=1aln⁡2,ddalog⁡10a=1aln⁡10,ddatan⁡a=ddasin⁡acos⁡a=cos⁡2a+sin⁡2acos⁡2a=1cos⁡2a.\begin{aligned} \frac{d}{da}\sqrt a &= \frac{1}{2\sqrt a} &&\text{from } (\sqrt a)^2 = a, \\ \frac{d}{da}\,2^a &= \frac{d}{da}\,e^{a\ln 2} = 2^a \ln 2, \\ \frac{d}{da}\log_2 a &= \frac{d}{da}\frac{\ln a}{\ln 2} = \frac{1}{a\ln 2}, &\frac{d}{da}\log_{10} a &= \frac{1}{a \ln 10}, \\ \frac{d}{da}\tan a &= \frac{d}{da}\frac{\sin a}{\cos a} = \frac{\cos^2 a + \sin^2 a}{\cos^2 a} = \frac{1}{\cos^2 a} . \end{aligned}

每个公式在 ff 可导的开定义域上成立:平方根和对数要求 a>0a > 0,正切要求 cos⁡a≠0\cos a \ne 0,而 exp⁡\exp、sin⁡\sin 和 cos⁡\cos 处处成立。

设计决策

暴露 Dual[T] 所实现的内容

门面包重新导出 Sqrt、SqrtChecked、Exponential、Logarithmic、Trigonometric 和 Constants,即在 Dual[T] 上有实例的解析 trait。arithmetic 还定义了 Hyperbolic、InverseTrigonometric、InverseHyperbolic、Cbrt 和 Power;Dual[T] 目前还没有它们的实例,因此没有重新导出。

实例需要整个 trait

trait 实例必须提供它的所有方法。Exponential 包含 exp2,而其规则需要 ln⁡2\ln 2,因此即使调用方只用到 exp,该实例也要求 T 实现 Logarithmic 和 IntegralHomomorphism。对于这种情况,固有方法 Dual::exp 只需较小的约束 Exponential + Mul。

常数的切向分量为零

π\pi、τ\tau 和 ee 不依赖于求导变量,因此 Constants 实例用 Dual::constant 嵌入它们。这是保持结构的选择:映射 T→T[ε]T \to T[\varepsilon],c↦c+0εc \mapsto c + 0\varepsilon,是环同态。

正确性与不变量

  • 每条规则都与上面的导数表一致,并在 Double 上经过测试(sin、exp 等测试位于 src/tests/dual_test.mbt)。
  • 在开定义域之外,结果沿用 T 的行为:对于 Double,ln(0) 为 −∞-\infty,切向分量为 b/0b/0;sqrt 在 00 处的切向分量为无穷大或 NaN。
  • 切向分量的误差是 T 对 f′(a)f'(a) 的实现误差再加上至多两次舍入;见 dual 设计。

被否决的方案

  • 重新导出所有解析 trait。 像 T : Hyperbolic 这样的约束对 T 能通过类型检查,却无法在 Dual[T] 处实例化,这会令人困惑。
  • 在本仓库中提供带检查的对数。 arithmetic 没有可供实现的带检查对数 trait;在本地新增一个会使错误模型产生分叉。

边界

  • 没有双曲函数、反三角函数、反双曲函数、立方根或一般幂函数的规则。
  • 除 SqrtChecked 外没有其他带检查的形式。
  • 没有分支切割或复数域语义;复变函数请参阅 luna-complex。