プログラムな日常>ウェブプログラム作品集>
無限回微分可能なスプライン
(a new class of extremely smooth spline)
param1
param2
showmesh showpts infinite 3rd hairend

 取り合えず、お絵描きソフトである。表題の通り、常に無限回微分可能な滑らかなものができる。 ブラウザからコピーし、ペイントの「透明の選択」などを併せれば、すでにある画像などへの書き込みも可能だろう。
 狙いである無限回微分可能なスプラインと併せ、3次スプラインを重ね書きでも、単独でも書ける。 3次スプラインは、末端の曲率がゼロになるのが特徴だから、違いははっきりわかると思う。
 ベジエや B-スプラインも無限回微分可能だが、指定点があさっての場所に来る。これはちゃんと指定点を通る。 機能としては、点を増やせる。すでにある区間への内挿もできる、点を移動させ、また、個別に消去することもできる。全体の消去はボタンによってもできる。
 原理の説明は詳しくしないが、簡単に言っておくと、これは、次の関数の特徴を役立てている。
         f(θ) = sin(θ)/θ
 この関数は、θ が円周率の倍数になる度にゼロになる。円周率で割ったものを Δt とすれば、正負を通じて Δt が整数の場合に関数値がゼロクロスするが、Δt=0 のときだけ特異的に1となる (Δt=0 の近傍は不安定なので、ここだけは展開式によっている)。 グラフは次のようである。

contribution to x: rough(Δt) = sin(π Δt)/(π Δt)

 これは、曲線上の点を、一連の指定点からどう決めるかという重み関数なのであるが、実際にはこれをモディファイして、波束がより集中した次のようなものを作っている。

contribution to x: middle(Δt) = exp(-Δt2/P1)*(1+P2Δt2)*sin(π Δt)/(π Δt); P1=6, P2=0.075

 このモディファイにあたっては、円や正弦波を、少ない点から近似し易いことを一つの指標にした。 円や正弦波に近いものをきれいに画くコツは、指定点の間隔を工夫する(均等に近づけるなど)ことだ。
 因みに、有名な三次スプラインも所詮は重み関数であって、それは次の形をしている。

contribution to x: 3rd spline

 以上、何れも、指定点が無限に連なる場合の一部を見た応答(重み関数)である。
 無限回微分可能なスプラインを高速道路や鉄道の設計に使った場合、3次スプラインと比べて側方加速度を十数パーセント減らせる可能性がある。

道路における変位の一例(上:3次スプライン、下:無限回微分)



道路における加速度の一例(一点鎖線:3次スプライン、実線:無限回微分)


 直ぐに確認できる javascript の受けが良さそうなので今回はそうしたが、フォームを半透明にしてトレースができるものをC#で作りたいとも思っている。

 最近、javascript の視野について整理したが、それ以前から作っていたここのページのコードは滅茶苦茶だ。 奥が深いとは言え、取り合えずそれなりに動くのが良いところで、難しいことを言うのはトラブってからでゼンゼン良いと思う。