読者の方は覚えているかも知れませんが、古いフレームワークでは、基本となる価格エンジンは仮想関数を宣言し、その具体的な内容は派生クラスで実装される仕組みを取っていました。その仕組みは、微分方程式問題の初期条件についても同様でした。(派生クラスではなく)別のオブジェクト群にカプセル化され、他の価格エンジンでも使えるようにしています。Mesher上の特定の点の、周辺ポイントの平均値を返します。Strike近辺で不自然な振動が発生する可能性があり、それを抑える為のテクニック)。)についても間違った方法ではありません。)の値を返しているだけ)なので、(純粋仮想関数とせず、ベースクラスにおいて)それをデフォールトの実装としても良かったかも知れません。(注:あるいは、平均値の計算は、やはり派生クラスを実装しようとする人の選択に任せるべきであるという意見があっても、それが間違っているとは思いません。)上記のListingには、2つの具体的な派生クラスで、仮想関数を実装している様子も含まれています。FdmLogInnerValueクラスは、対象資産が1つで、その価格の対数値のメッシュをもとに、Payoff値を計算しています。このクラスのコンストラクターは、引数として、1Payoffインスタンス、2メッシュ、および3変数が変化する方向軸を取ります。最後の引数(方向軸)は、メッシュが多次元の場合に必要になります。(注:対象資産が1つなのに、メッシュが多次元になる例としては、対象資産は株価だけでも、状態変数は、株価とそのボラティリティーの2つ、あるいは株価と金利の2つかも知れないし、あるいはそれら3つの確率変数すべてかも知れません。対象資産の価格のメッシュが1番目の次元になるとは限らないので、3の引数が必要になります。Payoffインスタンスに渡します。使えるようになれば取り除きたいと思っています。(その場合でもバスケットの総額に依存するのではありません。Payoffインスタンスに渡しています。)メソッドを呼び出しているだけです。これは最善の方法ではありません。Mesherクラスの定義の中にハードコードされており、プログラムを使ってその情報を取りだせない事です。その情報へアクセスする方法を、Mesherクラスの共通なインターフェースとして定義するのも簡単ではありません。私自身、まだ解決策を思いつきません。昔からある、こういった場合の代替法としては、このマジックナンバーに名前を付ける方法も一考かもしれません。ような名前を提供することも可能です。いった変数によい名前をつけるのも簡単ではありません。polymorphicな構造にせず、Factoryパターンの関数群に置き換えるという方向性にも反します。**********************************************************************************新しいフレームワークでは、境界条件用のインターフェースを、新たに定義していません。OperatorTraitsを使って、次のように定義されています。BoundaryConditionクラステンプレートを利用しています。ここで唯一新しいのは、(テンプレート引数として)FdmLinearOpクラスを使って、テンプレートを具体化している所だけです。新しく作られたクラス群と協働できるよう、それ用の境界条件も実装されています。FdmDirichletBoundaryクラスのインターフェースです。このコンストラクターは、引数として、1方程式の定義域を規定するMesherインスタンス、2境界におけるオプション価格、3境界値をコントロールしたい次元軸、および4境界がメッシュの上方か下方かを示す数字、を取っています。ここではコンストラクターの実装内容を示していませんが、Mesherインスタンスを使って、境界条件が適用される配列の要素を特定しています。派生させて定義しています。当然ながら新しいフレームワークで定義されたクラス群を使っています。このクラスはアメリカンオプションが行使されるのかどうかを決定します。};実装内容は、皆さんの予想通りです。(訳注:行使価値がオプション価値を上回っていれば、配列にあるオプション価値を行使価値に書き換える)。)メソッドが必要とする情報を引数で取り、メンバー変数に格納します。新しいフレームワークでは、FdmStepConditionCompositeクラスも定義しています。このクラスは便利なクラスで、Compositeパターンを使って、複数の境界条件をグループ化し、ひとつのオブジェクトのように受け渡し出来るようにしています。Utilityメソッドと共に、順番に適用していきます。StepConditionを、StepConditionsのグループに加えるメソッドなどです。)メソッドは若干異なります。集合体(Composite)を構築し、それを他の微分方程式問題でも使えるようにしています。その機能は良い事ですが、他のクラスと比べると少し特殊です。注意しておきますが、そんなに特殊という事ではありません。Swaptionsといった商品の価格エンジンでも使われている事が判ります。この機能を拡大していくのなら、このクラスの中で増殖していくのは好ましくありません。この関数を独立した関数として定義した方が、より明瞭でしょう。<ライセンス表示>QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。