elementary の設計

このページでは elementary ファサードについて、どの解析的トレイトを公開するか、その微分規則がどう正当化されるか、そしてどこまでを扱うかを説明します。

設計目標

Dual[T] が正しい微分規則で実装しているトレイトをちょうど公開することで、arithmetic のトレイトに対して書かれた解析的なコードを変更なしで微分可能にします。

数学的背景

すべての規則は 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] が実装するものを公開する

ファサードは、Dual[T] 上にインスタンスを持つ解析的トレイトである Sqrt、SqrtChecked、Exponential、Logarithmic、Trigonometric、Constants を再エクスポートします。arithmetic は Hyperbolic、InverseTrigonometric、InverseHyperbolic、Cbrt、Power も定義していますが、Dual[T] はまだそれらのインスタンスを持たないので、再エクスポートしません。

インスタンスにはトレイト全体が必要

トレイトインスタンスはそのすべてのメソッドを提供しなければなりません。Exponential には exp2 が含まれ、その規則には ln⁡2\ln 2 が必要なので、呼び出し側が exp しか使わない場合でも、インスタンスには T 上の Logarithmic と IntegralHomomorphism が必要です。その場合のために、固有メソッド Dual::exp はより小さな境界 Exponential + Mul を持っています。

定数の接成分は 0

π\pi、τ\tau、ee は微分変数に依存しないので、Constants インスタンスはそれらを Dual::constant で埋め込みます。これは構造を保つ選択です。写像 T→T[ε]T \to T[\varepsilon]、c↦c+0εc \mapsto c + 0\varepsilon は環準同型です。

正しさと不変条件

  • 各規則は上記の導関数表と一致し、Double でテストされています(src/tests/dual_test.mbt の sin、exp など)。
  • 開定義域の外では、結果は T に従います。Double では ln(0) は接成分 b/0b/0 を持つ −∞-\infty であり、00 での sqrt は無限大または NaN の接成分を持ちます。
  • 接成分の誤差は、T による f′(a)f'(a) の実装の誤差に高々 2 回の丸めを加えたものです。dual の設計 を参照してください。

却下した代替案

  • すべての解析的トレイトを再エクスポートする。 T : Hyperbolic のような境界は T については型検査を通りますが、Dual[T] でインスタンス化できず、混乱を招きます。
  • このリポジトリでのチェック付き対数。 arithmetic には実装すべきチェック付き対数のトレイトがなく、ローカルに追加するとエラーモデルが分岐してしまいます。

境界

  • 双曲線関数、逆三角関数、逆双曲線関数、立方根、一般のべき乗の規則はありません。
  • SqrtChecked 以外のチェック付き形式はありません。
  • 分岐切断や複素領域の意味論はありません。複素関数については luna-complex を参照してください。