2022/09/19 17:16 更新
クロソイド曲線の計算
821 いいね ブックマーク
目次

前提知識

クロソイド曲線とは、曲率を一定割合で変化させて描かれる曲線である。曲率半径と始点からの曲線長をそれぞれ$\displaystyle R$と$\displaystyle L$としたとき、両者の積は一定となる。

本項では、数値計算式として偶数項を$x_n$、奇数項を$y_n$とする母数列$c_n$がが成り立つことを示す。

$\begin{aligned} x & = A\sqrt{2\tau} \sum^{\infty}_{k=0} x_k = A\sqrt{2\tau}\sum^{\infty}_{k=0} c_{2k}\\ y & = A\sqrt{2\tau}\sum^{\infty}_{k=0} y_k = A\sqrt{2\tau}\sum^{\infty}_{k=0} c_{2k+1}\\ c_{n+1} & = \dfrac{(-1)^n(2n+1)\tau}{(2n+3)(n+1)}c_n, \quad c_0 = 1 \end{aligned}$

クロソイド曲線$(x,y)$の計算

無限級数展開

クロソイド曲線上の任意の点 P$(x,y)$は、クロソイドパラメータ$A$と接線角$\tau$で表されているが、(7)式のままでは具体的に値を計算できない。いったん被積分関数を無限級数にした後に積分する。無限級数の形にすることによってコンピュータ上で正確に値を計算可能になる。

$\begin{array}{cl} x & = \dfrac{A}{\sqrt2} \displaystyle\int^\tau_0 \dfrac{\cos\tau}{\sqrt{\tau}}d\tau = \dfrac{A}{\sqrt2{}} \int^\tau_0 \tau^{ -1/2 } (1 - \dfrac{\tau^2}{2!} + \dfrac{\tau^4}{4!} - \dfrac{\tau^6}{6!} \dots) d\tau; \hspace{0.5cm} //\cos\tau\text{を展開} \\ \\ & = \dfrac{A}{\sqrt2{}} \displaystyle\int^\tau_0 (\tau^{-1/2} - \frac{\tau^{3/2}}{2!} + \frac{\tau^{7/2}}{4!} - \frac{\tau^{11/2}}{6!} \dots )d\tau; \hspace{1cm} //因子\tau^{-1/2}を掛ける \\ \\ & = \dfrac{A}{\sqrt2{}} \left(2\tau^{1/2} - \dfrac{2\tau^{5/2}}{5\cdot2!} + \dfrac{2\tau^{9/2}}{9\cdot4!} - \dfrac{2\tau^{13/2}}{13\cdot6!} + \dots +\dfrac{(-1)^{n-1} 2\tau^{(4n-3)/2}}{(4n-3)\cdot(2n-2)!}+ \dots\right); //積分 \\ \\ & = A\sqrt{2\tau}\left(1 - \dfrac{\tau^2}{5\cdot 2!} + \dfrac{\tau^4}{9\cdot4!} - \dfrac{\tau^6}{13\cdot6!} + \dots +\dfrac{(-1)^{n-1} \tau^{2(n-1)}}{(4n-3)\cdot(2n-2)!}+ \dots\right); // 2\tau^{1/2}を抽出 \\ \\ & = A\sqrt{2\tau}\left(\displaystyle\sum^{\infty}_{n=1}\dfrac{(-1)^{n-1} \tau^{2(n-1)}}{(4n-3)\cdot(2n-2)!}\right) \\ \\ \end{array}$

$\begin{array}{cl} y & = \dfrac{A}{\sqrt{2}} \displaystyle\int^\tau_0 \dfrac{\sin\tau}{\sqrt{\tau}}d\tau = \dfrac{A}{\sqrt2{}} \int^\tau_0 \tau^{ -1/2 } (\tau - \dfrac{\tau^3}{3!} + \dfrac{\tau^5} {5!} - \dfrac{\tau^7}{7!} \dots) d\tau; \hspace{0.5cm} //\sin\tau\text{を展開} \\ \\ & = \dfrac{A}{\sqrt2{}} \displaystyle\int^\tau_0 (\tau^{1/2} - \frac{\tau^{5/2}}{3!} + \frac{\tau^{9/2}}{5!} - \frac{\tau^{13/2}}{7!} \dots )d\tau; \hspace{1cm} //因子\tau^{-1/2}を掛ける \\ \\ & = \dfrac{A}{\sqrt2{}} \left(\dfrac{2}{3}\tau^{3/2} - \dfrac{2\tau^{7/2}}{7\cdot3!} + \dfrac{2\tau^{11/2}}{11\cdot5!} - \dfrac{2\tau^{15/2}}{15\cdot7!} + \dots +\dfrac{(-1)^{n-1} 2\tau^{(4n-1)/2}}{(4n-1)(2n-1)!}+ \dots\right); //積分 \\ \\ & = A\sqrt{2\tau}\left(\dfrac{\tau}{3} - \dfrac{\tau^3}{7\cdot 3!} + \dfrac{\tau^5}{11\cdot5!} - \dfrac{\tau^7}{15\cdot7!} + \dots +\dfrac{(-1)^{n-1} \tau^{2n-1}}{(4n-1)(2n-1)!}+ \dots\right); // 2\tau^{1/2}を抽出 \\ \\ & = A\sqrt{2\tau}\left(\displaystyle\sum^{\infty}_{n=1}\dfrac{(-1)^{n-1} \tau^{2n-1}}{(4n-1)\cdot(2n-1)!}\right) \end{array}$

これで、$x, y$どちらも無限級数で表せたのでコンピュータで計算可能になった。

また、これらに$(3)式\tau=\dfrac{L}{2R}と(4)式L=\sqrt2\tau$式を代入すると、クロソイド曲線ではお馴染みの計算式であることがわかる。

$x = L\left(1 - \dfrac{L^2}{40R^2} + \dfrac{L^4}{3456R^4} - \dfrac{L^6}{599040R^6} +\dots\right), y = \dfrac{L^2}{6R}\left(1 - \dfrac{L^2}{56R^2} + \dfrac{L^4}{7040R^4} - \dfrac{L^6}{1612800R^6} + \dots \right)$

数値計算上の工夫

一般に無限級数で表現される一般項をそのままコンピュータで計算する際には次の課題がある。

  • 6 乗 7 乗など高次の項は整数値がコンピュータ上で扱える最大値を超えてしまい誤った数値になる
  • 級数は小さい順に加えないと誤差が大きくなる
  • 級数を有限項で打ち切る場合は、精度評価しておく必要がある

したがって、こうした無限級数の計算では、一般項そのものを計算するのではなく、隣接二項間漸化式を利用して各項を逐次計算する。各項は十分小さな値になったところで計算を終了すれば良い。この方針でクロソイド曲線を求めるアルゴリズムを以下に示す。

無限級数における係数数列の共通化

クロソイド曲線$(x,y)$の共通項の各項を要素とする数列をそれぞれ$x_n, y_n$とすると、$x, y$の式は次のようになる。

$\begin{array}{cll} x = & A\sqrt{2\tau}(x_1+ x_2 + x_3 + \cdots), & x_n = \left\{ 1, -\dfrac{\tau^2}{5\cdot2!}, \dfrac{\tau^4}{9\cdot4!}, -\dfrac{\tau^6}{13\cdot6!}, \cdots \right\} \\ \\ y = & A\sqrt{2\tau}(y_1+ y_2 + y_3 + \cdots), & y_n = \left\{ \dfrac{\tau}{3}, -\dfrac{\tau^3}{7\cdot3!}, \dfrac{\tau^5}{11\cdot5!}, -\dfrac{\tau^7}{15\cdot7!}, \cdots \right\} \end{array}$

さらに偶数項を$x_n$奇数項目を$y_n$とする新しい数列$c_n$を考えると、$x, y$は次のようになる。

$\begin{array}{c} x = A\sqrt{2\tau}(x_1+ x_2 + x_3 + \cdots) = A\sqrt{2\tau}(c_0 + c_2 + c_4 + \cdots) \\ \\ y = A\sqrt{2\tau}(y_1+ y_2 + y_3 + \cdots) = A\sqrt{2\tau}(c_1 + c_3 + c_5 + \cdots) \\ \\ c_n = \left\{ 1, \dfrac{\tau}{3}, -\dfrac{\tau^2}{5\cdot2!}, -\dfrac{\tau^3}{7\cdot3!}, \dfrac{\tau^4}{9\cdot4!}, \dfrac{\tau^5}{11\cdot5!}, -\dfrac{\tau^6}{13\cdot6!}, -\dfrac{\tau^7}{15\cdot7!}, \cdots \right\} \end{array}$

この新しい数列$c_n$の隣接二項漸化式を求めるために$c_{n+1}とc_n$の商である数列$\dfrac{c_{n+1}}{c_n}$を考える。

$\displaystyle \frac{c_{n+1}}{c_n} = \left\{ \frac{\tau}{3\cdot1}, -\frac{3\tau}{5\cdot2}, \frac{5\tau}{7\cdot3}, -\frac{7\tau}{9\cdot4}, \frac{9\tau}{11\cdot5}, -\frac{11\tau}{13\cdot6}, \frac{13\tau}{15\cdot7}, \dots \right\} = \frac{(-1)^n(2n+1)\tau}{(2n+3)(n+1)}$

したがって数列$c_n$は、隣接二項間漸化式として$c_{n+1} = \dfrac{(-1)^n(2n+1)\tau}{(2n+3)(n+1)}c_n$ であることがわかった。

この漸化式を用いると初項$c_0=1$を与えるだけで数列$c_n$ の各項が求められ、計算過程において、数列$c_n$の元になった数列$x_n,y_n$を交互に計算していることがわかる。

$\begin{array}{cccl} c_0 =& 1 &=& 1 && &=& x_1\\ & \\ c_1 =& (-1)^0 \dfrac{\tau}{3\cdot1}c_0 &=& \dfrac{\tau}{3}\cdot1 &=& \dfrac{\tau}{3} & = & y_1\\ & \\ c_2 =& (-1)^1 \dfrac{3\tau}{5\cdot2}c_1 &=& -\dfrac{3\tau}{5\cdot2!}\cdot \dfrac{\tau}{3} &=& -\dfrac{\tau^2}{5\cdot2!} &=& x_2\\ & \\ c_3 =& (-1)^2 \dfrac{5\tau}{7\cdot3}c_2 &=& \dfrac{5\tau}{7\cdot3} \cdot -\dfrac{\tau^2}{5\cdot2!}&=& - \dfrac{\tau^3}{7\cdot3!} &=& y_2\\ & \\ c_4 =& (-1)^3 \dfrac{7\tau}{9\cdot4}c_3 &=& -\dfrac{7\tau}{9\cdot4} \cdot - \dfrac{\tau^3}{7\cdot3!}&=& \dfrac{\tau^4}{9\cdot4!} &=& x_3 \\ \dots \end{array}$

数列$c_n$の漸化式から$x_1\rightarrow y_1 \rightarrow x_2 \rightarrow \dots$と順番に計算できる。これらを$x, y$に交互に足し合わせることで目的の$(x,y)$の理論式である(7)式に一致する。この時、$y_n$が十分小さくなるまで繰り返せば良い。

$\begin{array}{cl} x & = A\sqrt{2\tau}(c_0 + c_2 + c_4 + \cdots) = A\sqrt{2\tau}(x_1 + x_2 + x_3 + \cdots) \\ & \\ & = A\sqrt{2\tau}\left(1 - \dfrac{\tau^2}{5\cdot 2!} + \dfrac{\tau^4}{9\cdot4!} - \dfrac{\tau^6}{13\cdot6!} + \dots +\dfrac{(-1)^{n-1} \tau^{2(n-1)}}{(4n-3)(2n-2)!}+ \dots\right) \\ & \\ y & = A\sqrt{2\tau}(c_1 + c_3 + c_5 + \cdots) = A\sqrt{2\tau}(y_1 + y_2 + y_3 + \cdots) \\ & \\ & = A\sqrt{2\tau}\left(\dfrac{\tau}{3} - \dfrac{\tau^3}{7\cdot 3!} + \dfrac{\tau^5}{11\cdot5!} - \dfrac{\tau^7}{15\cdot7!} + \dots +\dfrac{(-1)^{n-1} \tau^{2n-1}}{(4n-1)(2n-1)!}+ \dots\right) \\ \end{array}$


おわりに

本稿では、クロソイド曲線の描画に必須な各点の座標値を得るために、無限級数展開から共通の母数列を設けて統一的な$(x, y)$の計算を示した。