Polynomial Shaping Functions

Polynomial Shaping Functions - Golan Levin and Collaborators ノート。区間 \({[0, 1]}\) を定義域とする多項式整形関数が紹介されている。

Blinn-Wyvill Approximation to the Raised Inverted Cosine

\[y = \frac{4}{9} x^6 - \frac{7}{9} x^4 + \frac{12}{9} x^2.\]
  • 秒間数百万回もの \(\cos\), \(\sin\) の演算が必要な場合に、より単純な近似式で代用して計算コストの削減を図りたい。その例として、Blinn-Wyvill 多項式近似による Raised Inverted Cosine がある。

  • この近似多項式には次のような性質がある。

    • \(x = 0, 1\) で導関数の値がゼロとなる(要確認)。

    • \(x = 0.5\) で値が 0.5 となる(要確認)。

    • 比較的効率的に計算できる。

    • オリジナルの Raised Inverted Cosine とは異なり、無限の導関数がない。

  • この関数は、速度や演算能力に制限のある小型マイクロプロセッサーで有用だ。

実装の急所:

  • \(x^2\), \(x^4\), \(x^6\) をこの順に計算すること。直前に得たべき乗の値を乗算する。

感想:

  • 余弦関数だが Inverted であるので、原点での値が 1 ではなく 0 となる。

  • おそらく定義域 \({[0, \pi/2]}\) が正規化されている。

Double-Cubic Seat

\[\begin{split}y = \begin{cases} b - b \left(1 - \dfrac{x}{a}\right)^3,& 0 \le x < a,\\ b + \left(1 - b\right)\left(\dfrac{x - a}{1 - a}\right)^3, & a \le x \le 1. \end{cases}\end{split}\]

このシート状の関数は、三次多項式二つを結合して形成される。部分曲線同士は制御座標 \({(a, b)}\) において水平方向に接続するように変曲点を持つ。

実装の急所:

  • 引数は (float x, float a, float b) となる。

  • 引数 a, b のチェックをする必要があるだろう。

  • 本文では関数 pow でべき乗を計算しているが、自然数乗だから演算子 * のほうがいい可能性がある?ここは別途調査したい。

Double-Cubic Seat with Linear Blend

\[\begin{split}y = \begin{cases} bx - (1 - b) a \left(1 - \left(1 - \dfrac{x}{a}\right)\right)^3,& 0 \le x < a,\\ bx + \left(1 - b\right)\left(a + \left(1 - a\right)\left(\dfrac{x - a}{1 - a}\right)^3\right), & a \le x \le 1. \end{cases}\end{split}\]
  • 前項関数の改良版で、単位正方形の対角線に沿った変曲点の位置を単一の変数で制御する。

  • それに加え、この曲線を恒等関数 \({y = x}\) と混合するためにもう一つ変数がある。ここでは、変数 b を使用してこの混合量を制御し、変曲点近傍の曲線の傾きを変える効果がある。

  • 変曲点付近の平坦化を調整できるので、等間隔のデータを拡大する際などに便利だ。

実装の急所は前項と同じ。

感想:

  • おぼえにくい。

Double-Odd-Polynomial Seat

\[\begin{split}y = \begin{cases} b - b \left(1 - \dfrac{x}{a}\right)^{2n + 1},& 0 \le x < a,\\ b + \left(1 - b\right)\left(\dfrac{x - a}{1 - a}\right)^{2n + 1}, & a \le x \le 1. \end{cases}\end{split}\]
  • 先述の Double-Cubic Seat 関数は、任意の奇数整数の指数を使用する形式に一般化できる。

  • 三次関数や五次関数などの奇数次数の多項式は、シート状の曲線を作るのにひじょうに自然な形で適している。

    • 引数 a によって恒等関数とパラメトリックに混合される。

    • \({(0, 0)}\)\({(1, 1)}\) を通過する。

    • 中間点 \({(0.5, 0.5)}\) を対称的に通過する。

    • 比較的効率的に計算することができる。

実装の急所

  • 引数リストは (float x, float a, float b, int n) のようになる。

  • 引数 n は、点 \({(a, b)}\) 付近の台地状区間の平坦さ、つまり幅を制御する。

  • n の範囲は 1 からだいたい 20 までの整数の集合が良いとある。

Symmetric Double-Polynomial Sigmoids

\[\begin{split}y = \begin{cases} \dfrac{(2x)^{2n} }{2}, & 0 \le x \lt 0.5,\\ 1 - \dfrac{(2x - 2)^{2n} }{2}, & 0.5 \le x \lt 1. \end{cases}\end{split}\]
\[\begin{split}y = \begin{cases} \dfrac{(2x)^{2n + 1} }{2}, & 0 \le x \lt 0.5,\\ 1 + \dfrac{(2x - 2)^{2n + 1} }{2}, & 0.5 \le x \lt 1. \end{cases}\end{split}\]

単位正方形の中心に対称的な多項式のペアを結合することで sigmoid パターンを生成する。これらの方程式の指数 n は、つぶれた値と盛り上がった値を分ける壁の急峻さを制御する。

  • 整数 n の推奨範囲は 1 から約 10 だ。

  • これらの中では二次の sigmoid が Raised Inverted Cosine に最も近い。 2.8 パーセント以内で近似している。

ここで紹介する対称二重多項式 sigmoid は、0 と 1 に平らな接線を持つ S 字型をしており(関数名に含まれる sigmoid という言葉は元々「\(\varsigma\) に似たもの」を意味する)、\({f(0.5) = 0.5}\) という特別な性質がある。偶数べき sigmoid と奇数べきの場合とでは、少し異なる方程式のペアが必要になる。

Quadratic Through a Given Point

\[y = \left(\frac{1 - b}{1 - a} - \frac{b}{a}\right) x^2 - \frac{1}{a} \left(a^2 - \left(\frac{1 - b}{1 - a} - \frac{b}{a}\right) - b\right)x.\]

この関数は、単位正方形内の点 \({(a, b)}\) を通り、座標軸に揃う放物線を定義する。

意味不明:単位正方形内のすべての点が \((0, 0)\)\((1, 1)\) の位置を通る曲線になるとは限らない。