読者です 読者をやめる 読者になる 読者になる

倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

反復条件 IterationCondition

今回は反復条件

反復条件は、当然のことながら反復シミュレーションにとって必須コンポーネントです。 反復条件は、前回までに出てきた PhysicalSystem, ObservableSet とは異なり、どんな物理シミュレーションでも基本的には同じような条件を使うことになると思います。 したがって、Groops ではいくつかのよく使いそうな反復条件はデフォルトでサポートし、簡単な設定で使用できるようにします。 もちろん、独自の Java クラスを作成すれば、任意の反復条件も使えるようにしますが。

IterationCondition インターフェース


基本的には IterationCondition インターフェースの実装クラスを作成する必要はありませんが、Groops の反復シミュレーションの流れとも関係するので、少しこのインターフェースについて説明していきます。 IterationCondition インターフェースは以下のような宣言になってます:

public interface IterationCondition extends SimulationComponent{

    OutputTiming getDefaultOutputTiming();
    boolean continueIteration(DataStore data);
}
  • スーパーインターフェースの SimulationComponent は後で少し触れます。
  • getDefaultOutputTiming() メソッドは後日。
  • continueIteration() メソッドは反復を続行するかどうかを評価して boolean 値を返します。 メソッドの引数にある DataStore クラスは ObservableSet クラスの observe() メソッドの引数にもあった、データを格納しておくための型です。

IterationCondition インターフェースで胆となるのは continueIteration() メソッドです。 このメソッドによって IterativeSimulator オブジェクト(反復シミュレーションを表す型)は反復を繰り返すか、反復を止めてシミュレーションを終了するかを判断します。 もう少し具体的に言うと、反復シミュレーションは以下のような while 文による反復のようなことを行っています(※以下のコードはあくまでイメージです)*1

IterationCondition ic = ...
DataStore store = ...

while(ic.continueIteration(store)){
    // 状態更新
}

状態更新」の部分では、物理系を表す PhysicalSystem オブジェクトの evolve() メソッドが呼ばれていると思ってください。 データの出力等は省略してます。 さて、この「while 文による反復」では、分かりやすさはありますが柔軟性がかなり欠如してます。 そこで、反復 (Iteration) と状態更新 (State Evolution) の前後でフックとなるメソッド

  • onIterationStart() / onIterationEnd()
  • onEvolutionStart() / onEvolutionEnd()

を定義して、以下のような反復を行います:

IterationCondition ic = ...
DataStore store = ...

ic.onIterationStart()
while(ic.continueIteration(store)){
    ic.onEvolutionStart()
    // 状態更新
    ic.onEvolutionEnd()
}
ic.onIterationEnd()

もしくは、伝統的な for 文を使えば以下のようにも書けます:

IterationCondition ic = ...
DataStore store = ...

for(ic.onIterationStart(); ic.continueIteration(store); ic.onEvolutionEnd()){
    ic.onEvolutionStart()
    // 状態更新
}
ic.onIterationEnd()

上記で定義した「フックとなるメソッド」は IterationCondition インターフェースのスーパーインターフェース SimulationComponent に定義してあり、次回やる予定の DataOutputter インターフェースでも使えるようにしています。 ともかく、IterativeSimulator の反復シミュレーションの流れはデータ出力などでも少々気にする必要があるので頭の隅に残しておいてください

サポート予定の反復条件


ここでは、Groops によってデフォルトでサポートする予定の反復条件を見ていきます。 もちろん、他にあった方が良さそうな反復条件は追加していきますが。 反復条件には大きく分けて次の2種類があると考えています:

  • 単体で使用できる反復条件
  • 他の反復条件から(論理演算などによって)計算する反復条件

それぞれを見ていきましょう。

単体で使用できる反復条件

まずは単体で使用できる反復条件。 まぁ、普通に使うのはコレかと。 とりあえずよく使うのは

  • 指定した回数だけ反復を行う count
  • 物理量(観測可能量)の値によって反復を行うかどうか評価する observe

でしょう。

タイプ 説明 プロパティ プロパティの説明
count 回数を指定して反復 total int 反復回数
observe 観測量の値によって反復 continueWhile Closure 条件を満たしている場合に反復
continueUntil Closure 条件を満たすまで反復
none 反復しない
once 1度だけ反復

各欄の値(特に「タイプ」と「プロパティ」)はそのうちやるシミュレーション記述子を書く際に使います。

他の反復条件から計算する反復条件

次は他の反復条件から計算する反復条件です。 基本的には論理演算なんですけどネ。

タイプ 説明 子要素の個数 プロパティ プロパティの説明
not 子要素の否定 1個
and 子要素の論理積 1個以上
or 子要素の論理和 1個以上
xor 子要素の排他的論理和 2個
delay 遅延 1個 millis long 待ち時間(ミリ秒)

delay は GUI で視覚化する際に使えるかなと思ってますが、どうなることやら。 次回はデータ出力を行う DataOutputter。 それが済めば、そろそろ動くサンプルを書きたいね。

計算物理学入門

計算物理学入門

  • 作者: ハーベイゴールド,ジャントボチニク,Harvey Gould,Jan Tobochnik,鈴木増雄,石川正勝,溜渕継博,宮島佐介
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • クリック: 5回
  • この商品を含むブログ (45件) を見る

*1:プッシュ・シミュレーションの場合。