指数分布

標準形

ポアソン過程の到着時間間隔や信頼性の故障発生間隔に現れる連続確率分布。単位時間当たりの到着率や発生率を\lambdaとしたとき、時刻tを確率変数とした確率密度関数と確率分布関数は以下の形になる。

(1)    \begin{equation*} f(t) = \lambda e^{- \lambda t} \end{equation*}

(2)    \begin{equation*} F(t) = 1 - e^{- \lambda t} \end{equation*}

全事象の確率が1となることの確認

(3)    \begin{equation*} \int_0^\infty \lambda e^{- \lambda t} dt = \left[ e^{-\lambda t} \right]_0^\infty = 1 \end{equation*}

平均

(4)    \begin{eqnarray*} E(t) &=& \int_0^\infty t \lambda e^{- \lambda t} dt = \int_0^\infty x e^{-x} d \frac{x}{\lambda} \\ &=& \frac{1}{\lambda} \left( \int_0^\infty e^{-x} dx - \left[ x e^{-x} \right]_0^\infty \right) = \frac{1}{\lambda} \left[ - e^{-x} - x e^{-x} \right]_0^\infty \\ &=& \frac{1}{\lambda} \end{eqnarray*}

分散

(5)    \begin{eqnarray*} V(t) &=& \int_0^\infty t^2 \lambda e^{-\lambda t} dt - \left( \frac{1}{\lambda} \right)^2 = \frac{1}{\lambda^2} \int_0^\infty x^2 e^{-x} dx - \frac{1}{\lambda^2} \\ &=& \frac{1}{\lambda^2} \left( 2 \int_0^\infty x e^{-x} dx - \left[ x^2 e^{-x} \right]_0^\infty - 1 \right) \\ &=& \frac{1}{\lambda^2} \left( \left[ -2 e^{-x} -2x e^{-x} - x^2 e^{-x} \right]_0^\infty - 1 \right) \\ &=& \frac{1}{\lambda^2} \end{eqnarray*}

確率密度と確率分布の形状

確率密度は当然、指数関数の形状となるため、t = 0で最大値をとる単調減少関数。

このため、到着時間間隔がt以下となるような確率は、t = 0での増加率が最も大きく、その後水平に近くなっていく。

statistics-exponential-density

statistics-exponential-distribution

指数分布に関する考察

指数分布はランダムに到着する客の到着時間間隔やトランザクションの時間、信頼性における機器の故障などに現れるが、「平均発生時間間隔」があるのに何故確率密度がそれを中心とした凸型にならずに単調現象なのか、なかなかストンと胸に落ちなかった。

いろいろ考えていて、「無記憶性」の発生事象ということを考えると、次のように整理はできる。

  • 前の事象の発生と次の事象の発生に、何の因果関係もない
  • 次の瞬間、瞬間に事象が起こる率は一定
  • ということは、前の事象が起こってすぐに次の事象が起こる率\lambda \Delta tより、一定時間後に(それまで発生せず)事象が発生する確率の方が小さくなる(1 - \lambda \Delta t)^{n-1} \lambda \Delta t
  • ゆえに、確率密度は単調現象

 

 

 

ネイピア数

概要

ネイピア数(Napier’s constant)は自然対数の底で、一般に記号eで表される。オイラー数(Euler’s number)と呼ばれることもある。

(1)    \begin{equation*} e = 2.7182818284590452353602874 \cdots \end{equation*}

定義

ヤコブ・ベルヌーイによる定義。

(2)    \begin{equation*} e = \lim_{n \to \infty} \left( 1 + \frac{1}{n} \right) ^n \end{equation*}

性質

(3)    \begin{equation*} \frac{d}{dx} e^x = e_x \end{equation*}

(4)    \begin{equation*} \int e^x = e_x + {\rm const} \end{equation*}

(5)    \begin{equation*} \frac{d}{dx} \ln x = \frac{1}{x} \end{equation*}

(6)    \begin{equation*} \int \frac{dx}{x} = \ln x + {\rm const} \end{equation*}

テイラー展開

(7)    \begin{eqnarray*} e^x &=& \sum_{n=0}^{\infty} \frac{x^n}{n!} \\ &=& 1 + \frac{x}{1!} + \frac{x^2}{2!}+ \frac{x^3}{3!} \cdots \end{eqnarray*}

 

Boids 3.1 – コード説明

概要

Boids 3.1で、いよいよEnemyを導入する。大まかな流れは以下の通り。

  • Creatureクラスを継承したEnemyCreatureクラスを定義する
  • EnemyCreature特有の行動はEnemy同士の分離(separation)のみ
  • BoidCreatureはEnemyCreatureを避ける行動をとる
  • BoidCreatureの群とEnemyCreatureの群を、それぞれのClusterオブジェクトに登録。

EnemyCreatureクラスの追加

Creatureクラスを継承したEnemyCreatureクラスを追加する。そのメソッド構成は以下の通り。specificBehaviorについては、Enemyに特別な行動ルールはなく、分離(separation)のみ実装している。separation()メソッドはBoidCreatureとまったく同じロジック。

Controlerクラスの変更

パラメータ関係

Controlerクラスのパラメータ設定用setterを追加(後述)

Enemy発生用メソッドの追加

BoidCreatureクラスと同じ内容で、createEnemyCreature()メソッドを追加

generate()メソッドを変更

generate()メソッドで、Boidに加えてEnemyも指定個体数だけ発生させるよう追加。

BoidがEnemyから逃げる動作

BoidCreatureクラスに新たにavoidEnemy()メソッドを追加し、specificBehavior()でこれを呼び出すよう変更。avoidEnemy()メソッドの内容は以下の通り。

  • 基本のロジックはsepration()メソッドと同じ
  • ただし分離の相手方がEnemyの群になる
  • 敵から回避する角度は、仲間との分離の角度より大きくする(パラメータで与える)

実行部分

ページ読み込み時の実行部分は以下の通りで、2つのボタンのクリックに対する処理を定義。

  • GENERATEボタンが押された時は、BoidCreatureの群とEnemyCreatureの群を発生させる
  • START/STOPボタンが押されたときは、ControlerクラスのstartAndStop()メソッドを呼び出す

コード全体

HTML

CoffeeScript

クラス構成

Fieldクラス

Creatureクラス

BoidCreatureクラス

EnemyCreatureクラス

Clusterクラス

Controlerクラス

 


↑ Boids 3.0のコード説明へ

 

Boids 3.0 – コード説明

概要

Boids 3.xシリーズで敵(Enemy)を導入する準備として、クラス構成の改良などを行った。

Boids 2.xまではBoidだけだった生物の種類に、新たにEnemyという別の種類が加わるが、どちらについても以下の特徴は共通している。

  • 複数個体をClusterオブジェクトにまとめて扱われる
  • Field内を移動する
  • 壁との衝突を避ける

そこで、これらの特徴に関する部分をCreatureクラスから抜き出したものを新たにCreatureとしてテンプレート化し、Boid特有の動作についてはCreatureクラスを継承したBoidCreatureで実装した。

このほか、BoidとEnemy2つの群を扱うことから、Clusterで処理していた画面の消去処理を外に出すなどの変更を行っている。

Creatureクラスのテンプレート化

Boids 2.3

まず、元となったBoids 2.3のコードの構成を確認する。壁の回避、分離、結合、整列に関するメソッドを定義し、これらをmove()メソッドで呼び出している。

Boids 3.0

Boids 3.0では2.3のCreatureクラスをCreatureBoidCreatureに分け、CreatureクラスにはBoidとEnemyに共通する動作を書き、Boidに特有の動作についてはBoidCreatureのメソッドで実装した。

Creatureクラス

Creatureクラスは以下のメソッドを持っている。

wallAvoidance()
壁との衝突を回避するメソッド。
specificBehavior()
このクラスを継承するクラスごとに特有の動作を記述するためのメソッド。抽象クラスのabstractメソッドに相当し、継承したクラスにおいてその内容が実装される。
determinePosition()
上記2つのメソッドで計算された位置と速度から、次の時間ステップにおける位置を決定するメソッド。

BoidCreatureクラス

BoidCreatureクラスはCreatureクラスを継承し、specificBehavior()メソッドを実装する。

BoidCreatureクラスで分離、結合、整列に関するメソッドを定義し、specificBehavior()メソッドでそれらを呼び出している。

描画処理の変更

Boid 3.xでは、BoidとEnemyという2つの生物をそれぞれ別のClusterオブジェクトに登録して扱う。Boids 2.3までは、アニメーションフレーム再描画のための画面消去処理をClusterクラスのdraw()メソッドで行っていたが、このままだとBoid、Enemyそれぞれの描画の際に画像が消去されて、どちらか一方が画面に表示されなくなる。

そこで、画面消去処理をClusterではなくControlergenerate()メソッドとstartAndStop()メソッドに置いた。

 


↑ Boids 2.3のコード説明へ

↓ Boids 3.1のコード説明へ

 

CoffeeScript – Boids 3.x – 天敵

Boids 3.xの概要

Boids 3.xでは、群として行動している集団に「敵(Enemy)」を投入する。BoidがEnemyを避けるように行動ルールを加え、群としてどのような行動パターンとなるかを確認する。

Boids 3.0 – 基本コード

敵を導入する準備として、Creatureクラスの抽象化・テンプレート化などの大幅な改定を行った。挙動はBoids 2.3と変わらない。

Boids 3.0のコード説明




Boids 3.1 – 敵の導入

このバージョンで「敵(Enemy)」を導入する。

  • Boidの群の個体数に比べて、Enemyの個体数は高々数個程度
  • Enemyは互いの衝突を分離行動によって避けるが、Boidに対しては意識しない
  • BoidはEnemyが視野に入ると回避行動をとる
    • 回避行動は分離行動より大きい角度で方向を転換させるのみ

デモンストレーションのBoidsの様子は、あたかも小魚が天敵の魚を避けるような行動パターンをとっている。BoidがEnemyを回避するのはEnemyが前方にいるときだけだが、群としての回避パターンはよく再現できている。

Boids 3.1のコード説明









WordPressでカテゴリをクリックしても表示されない

WordPressでカテゴリをクリックしても「ページが見つかりませんでした」と表示される現象が生じた。

ネット上で同様の現象が挙げられており、「タグやカテゴリをクリックすると404エラーで表示されない」というものが多かった。それらのうち以下の方法で解決したので記録しておく。

  1. ダッシュボードメニューの「設定」→「パーマリンク設定」
  2. 下部の「カテゴリーベース」が”.”となっていたのを”category”に書き換え
  3. 保存

他にもパーマリンクの設定を保存しなおすだけで直る、というのもあったが、こちらは効かなかった。

 

 

CoffeeScript – 継承・オーバーライド・super()

クラスの継承とコンストラクタ

ポイント

親クラスを継承した子クラスのコンストラクタでは、基本的にsuper()で親クラスのコンストラクタを呼び出す。

たとえば次のように親クラスParentを子クラスChildが継承した場合、子クラスに親クラスのプロパティが引き継がれている。

ところが次のように子クラスでコンストラクタを定義した場合は、親クラスのプロパティが引き継がれない。

これは子クラスのコンストラクタが親クラスのコンストラクタをオーバーライドしてしまったためで、この状態では親クラスのコンストラクタが実行されない。

そこで、子クラスのコンストラクタからsupper()で親クラスのコンストラクタを呼び出すと、親クラスのコンストラクタも実行され、プロパティが引き継がれる。

コンストラクタが引数をとる場合も、super()で親クラスのコンストラクタに合わせた引数を指定すればよい。

メソッドのオーバーライドと継承

例えば次のコードでは、親クラスのmethod()を子クラスのmethod()がオーバーライドしている。

子クラスからオーバーライドした親クラスのメソッドを呼び出したい場合は、super()を使う。

 

CoffeeScript – 抽象クラス

概要

Javaの場合だと、抽象クラスを書く場合には”abstract”宣言をして、具体のクラスで実装すべきメソッドの宣言だけを行うが、CoffeeScript/Javascriptの場合はこれと異なる。

準備

まず、同じ名前executionのメソッドを持つ2つのクラスConcrete1Concrete2を考える。メソッド名は同じだが、各クラスで処理内容は異なる。

次にexecution()について共通な2つのクラスを抽象化したAbstractクラスを導入する。

抽象クラスの導入

CoffeeScript/Javascriptではabstractキーワードがなく、abstractなメソッドも中身が空のもので定義。ただし抽象クラスのままでインスタンス化したときの注意喚起のメッセージを実装。

Javaなどでは型指定が厳格なので、異なる2つのクラスをAbstractクラスで抽象化して、同じメソッドを呼び出すことでクラスごとに特有の処理をさせる。

CoffeeScript/Javascriptでは変数の型がないため、抽象化をしなくてもメソッド名を同じにしておくだけで同じ効果を得る。ただしコンパイル時のチェックなどがない点に注意。

共通部分がある場合

以下のように、2つのクラスで共通の処理と個別の処理が混在している場合を考える。

共通の処理を各クラスごとに実装しているが、コピー/ペースト操作で行うとしてもエラーが入り込みやすく、その後の保守性も悪い。

共通部分の集約(1)

エラー回避と保守性の向上のため、共通部分を一つにまとめる。

  • 抽象クラスAbstractを導入
  • Abstractexecution()メソッドのフレームを集約
  • 共通処理部分commonExecution()Abstractのメソッドとして実装
  • 2つのクラスでAbstractを継承
  • これらの子クラスで、それぞれの個別処理部分のみを実装

Concrete1Concrete2Abstractを継承したことによって2つの具象クラスがAbstractクラスのexecute()メソッドも継承され、具象クラスでexecute()メソッドを呼ぶと、Abstractexecute()メソッドが実行される。

その後、共通部分のcommonExecution()Abstractのメソッドが呼ばれ、specificExecution()については、各具象クラスでオーバーライドされたメソッドが呼ばれる。

共通部分の集約(2)

各具象クラスでexecution()のから書いていくこともできるが、この場合は共通処理が一括してsuper()で実行されるため、「共通の前処理と後処理の間に各クラス独自の処理を置きたい」という場合には適さない。

 

 

三角関数 – 加法定理

加法定理の一覧

(1)   \begin{eqnarray*} \sin ( \alpha \pm \beta) &=& \sin \alpha \cos \beta \pm \cos \alpha \sin \beta \\ \cos ( \alpha \pm \beta ) &=& \cos \alpha \cos \beta \mp \sin \alpha \sin \beta \end{eqnarray*}

導出

第1ステップ – 等式の一つを導出

まず、以下のような図を考える。

math_trigonometry_additiontheorem_1

ABの長さを余弦定理で表す。

(2)   \begin{equation*} ( \cos \alpha - \cos \beta )^2 + ( \sin \alpha - \sin \beta )^2 = 1^2 + 1^2 - 2 \cos (\alpha - \beta) \end{equation*}

これより以下を得るが、これは加法定理のうちの一つに対応している。

(3)   \begin{equation*} \cos (\alpha - \beta) = \cos \alpha \cos \beta + \sin \alpha \sin \beta \end{equation*}

なお上式は、cosの性質からαとβの大小関係に関わらず成り立つ。

第2ステップ – 符号の反転

式(3)でβ → – βと置くと以下を得る。

(4)   \begin{equation*} \cos (\alpha + \beta) = \cos \alpha \cos \beta - \sin \alpha \sin \beta \end{equation*}

第3、4ステップ – cosからsinへの変換と符号の反転

式(3)でα → α+π/2と置くと以下を得る。

(5)   \begin{eqnarray*} \cos \left( \alpha + \frac{\pi}{2} - \beta \right) &=& \cos \left( \alpha + \frac{\pi}{2} \right) \cos \beta - \sin \left( \alpha + \frac{\pi}{2} \right) \sin \beta \\ - \sin ( \alpha - \beta ) &=& - \sin \alpha \cos \beta + \cos \alpha \sin \beta \\ \sin ( \alpha - \beta ) &=& \sin \alpha \cos \beta - \cos \alpha \sin \beta \end{eqnarray*}

また上式においてβ → – βと置くと以下を得る。

(6)   \begin{eqnarray*} \sin ( \alpha + \beta ) &=& \sin \alpha \cos \beta + \cos \alpha \sin \beta \end{eqnarray*}

これで加法定理に関する4つの式が得られた。

一般角への拡張

αやβが第3象限、第4象限にあるときは、それらからπ/2、πを減じて冒頭の図に対応させ、式変形をすることで同じ解を得る。

例えば下図のように、αが第3象限、βが第1象限にあるケースを考える。

math_trigonometry_additiontheorem_2

ここでα = α’ + π/2と置けば、α’について加法定理が成り立つことが分かっているので、

(7)   \begin{eqnarray*} \sin ( \alpha ' \pm \beta) &=& \sin \alpha ' \cos \beta \pm \cos \alpha ' \sin \beta \\ \cos ( \alpha ' \pm \beta ) &=& \cos \alpha ' \cos \beta \mp \sin \alpha ' \sin \beta \end{eqnarray*}

αとα’の関係より、

(8)   \begin{eqnarray*} \sin \left( \alpha - \frac{\pi}{2} \pm \beta \right) &=& \sin \left( \alpha - \frac{\pi}{2} \right) \cos \beta \pm \cos \left( \alpha - \frac{\pi}{2} \right) \sin \beta \\ \cos \left( \alpha - \frac{\pi}{2} \pm \beta \right) &=& \cos \left( \alpha - \frac{\pi}{2} \right) \cos \beta \mp \sin \left( \alpha - \frac{\pi}{2} \right) \sin \beta \end{eqnarray*}

これらより、以下の下方定理がこのケースについて成り立つことが示される。

(9)   \begin{eqnarray*} - \cos ( \alpha \pm \beta) &=& - \cos \alpha \cos \beta \pm \sin \alpha \sin \beta \\ \sin ( \alpha \pm \beta ) &=& \sin \alpha \cos \beta \pm \cos \alpha \sin \beta \end{eqnarray*}