操作)、3次元のインデックスと同期がとれるようになっています。(ここまでくると“一本化した配列”については、もっと短い名前をつけるべきかもしれません)。これは、Iteratorsに、たとえ、座標のインデックス情報を持っておらず(訳注:座標を格納する配列coordinates_がNullの場合)、それをインクリメントできなかったとしても、sentinel値(配列のサイズの見張り役)の機能を与えています。8.21にその実装内容の一部を示します)。(多次元の配列を一本の配列に並び替えた時の、要素間の間隔)に基づいて行われます。前に使ったのと同じ例を使って説明します。場合を考えてください。(先ほどの例で3次元の配列を一本に並べる際、第1次元のインデックスから順番に番号づけしていった事を思い出して下さい)。あった場合、一本化した配列の中では、この2つの要素は第1次元の要素数とちょうど同じだけ離れています。なる事がわかるでしょう。なる事もわかるでしょう。Library)を使っていますが、実際に計算式をコード化してもそれ程難しくなかったでしょう。計算されたので、これを使って、Iteratorと協働しながら、いくつかのメソッドを実装できます。構文を書く事ができます。(訳注:coordinates(座標)のこと)から、一本化した配列のインデックスへの変換機能を提供しています。)といった他のメソッド群は、すこし高いレベルでの動作を行います。(すなわちiterator)を返します。このメソッドをオーバーロードしたもので、同様な動作を2つの方向で行うメソッドもありますが、その中味は同じ動作のメソッドを2回続けて呼び出しているだけです。FdmMesherクラスのインターフェースの意味が判ってくるでしょう。Iteratorを取り、2番目の引数として多次元メッシュ上の移動方向を取ります。Iteratorを生成する事ができます。(注:メッシュの中の各ポイントは、計算しようとしている金融商品の価格が格納されている配列と一対一で対応しています。Iteratorは(インデックスと、格納されている値の)いずれかを表示できます。Operator(差分演算子)について説明します。古いフレームワークと同様、最も基本的な差分演算子は、ひとつの変数軸に沿った1階と2階の微分を表現するものです。この場合、“基本的”というのは必ずしも“単純な”という事を意味しません。2階微分(差分)の式も、同様に長くなります。いった形になるでしょう。ような2種類の異なる方向に沿った3点のステンシルを使って説明しましょう。1階と2階の差分演算子はいずれも、TripleBandLinearOpクラスと呼ばれる同じクラスのインスタンスとして表現されます。retVal;}TripleBandLinearOpクラスの基本的な定義は、TridiagonalOperator(古いフレームワークで説明したのを覚えているでしょうか)のそれに良く似ています。下記の式で表現できます。TripleBandLinearOpクラスは、この考え方を、多次元に拡大したものです。使えば、差分演算子が作用する様子は、次のような線形結合で表現できます。両隣の要素の線形結合で表現され、この表現方法がすべての要素について成立しています。(注:境界にある要素の表現方法については飛ばしますが、存在していない側の隣の要素を無視する事によって、簡単に対応できます。2次元の行列で表現でき、その行列の要素として値が詰まっているのは、3本の斜め方向のバンド(帯)だけになります。そこからこのクラス名を取っています。ここで水平方向を第1次元、垂直方向を第2次元の軸と仮定し、インデックスの順番が水平方向では左から右へ、垂直方向では上から下へ進んでいくとします。(a)の場合は、中心の点の両隣は、1列に並べ替えた配列上も隣同士であり、Operator(差分演算子)を行列で表現すると三重対角行列になります。(b)の場合は、中心点の上下の点は、1列に並べ替えた配列上では、第1次元の配列の要素数分だけ離れています。nullではありません)から、相当離れた所にあります。)以外にも、いくつかのメソッドが含まれています。)メソッドと同じように、Operatorが作用する配列が未知数の場合、連立方程式を解く形で解を導出します。scheme(陽的解法)より安定的で、場合によっては計算速度もより速くできます)。Operatorを生成する事ができます。(コードの内容をチェックし、どれがどれに該当するかは、読者の方におまかせします。)コンストラクターは、Operatorを使用可能な状態に持って行く為に、かなりの量の事前計算を行います。)の呼び出しを2回行うことによって為されています。loopでコード化できます。]は、Operatorが作用する配列です。Operator(3バンド差分演算子)を使った方程式をコードで表現したものになります。加えて、計算スピードアップを図ろうと試みました。これによって計算速度の向上は見られませんでした。場合によってはパフォーマンスを落としたりしました。したら、(#pragma文を加えなくとも)コンパイラーが既に並列処理の為の最適化を行っていたのかも知れませんし、何も加えない方が、コンパイラーがよりうまく機能していたのかも知れません。この点については、私自身全くの初心者なので、興味のある読者の方に調べて頂ければと思います。値を代入していきます。TridiagonalOperatorで使われているものと同じです。1次のオーダーにできます。sweepしていく必要があります。正しい順番とは指示された次元の軸に沿ってという事です。上記の図をもう一度見て下さい。sweepできません。従って、(a)の例では動作しますが、(b)の例では動作しません。その問題を解決する為、2つめの一本化された配列インデックスを用意しています。場合を考えてみましょう。軸に沿って差分を計算したいとします。spacing配列を作る事です。方向の隣りあう要素になります。)メソッドが正しく動作します。sweepしていきます。与え、それを使えば、引数として渡された配列の要素にアクセス出来ます。新しいフレームワークでは、TripleBandLinearOpクラスに基づいて、与えられた次元方向への、汎用的な1階と2階の差分演算子を定義しています。見て判る通り、極めて単純です。各項の係数)を代入しています。いうクラスも新しいフレームワークの中で定義されています。このクラスは前に説明で使ったステンシルにおける(c)のケースに対応しています。2005.<ライセンス表示>QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。