Fortran プログラムを C# に変換しています。これは、途中で概念実証を行いながら、少しずつ行う必要があります。
これらの最初のステップの 1 つは、使用する IMSL 機能を複製することです。幸いなことに、いくつかの選択されたもののみを使用します。いくつかの自明な乱数生成、いくつかの自明な正規分布反転だけでなく、それほど自明ではない 1 つの MCHOL も使用します。
ドキュメントから:
実対称行列 A と対角行列 D の上三角分解を計算します。D は、A + D を非負定値にするために、コレスキー分解中に順次決定されます。
ルーチン MCHOL は、A + D のコレスキー分解 (RTR) を計算します。ここで、A は対称であり、D は、A + D が非負定値となるような十分に大きな対角要素を持つ対角行列です。このルーチンは、Gill、Murray、および Wright (1981 年、108 ~ 111 ページ) によって説明されたルーチンに似ています。ただし、ここでは A + D が特異であることを許可します。
(リンク先に詳細とサンプルがあります)。
概念実証のために、MCHOL ドキュメントのサンプルで提供されている結果を複製できるようにする必要があります。サンプルから次のマトリックスを渡します。
DATA (A(1,J),J=1,N)/36.0, 12.0, 30.0, 6.0, 18.0/
DATA (A(2,J),J=1,N)/12.0, 20.0, 2.0, 10.0, 22.0/
DATA (A(3,J),J=1,N)/30.0, 2.0, 29.0, 1.0, 7.0/
DATA (A(4,J),J=1,N)/6.0, 10.0, 1.0, 14.0, 20.0/
DATA (A(5,J),J=1,N)/8.0, 22.0, 7.0, 20.0, 40.0/
そして、見返りとして次のものを取得します。
6.000 2.000 5.000 1.000 3.000
0.000 4.000 -2.000 2.000 4.000
0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 3.000 3.000
0.000 0.000 0.000 0.000 2.449
これまでのところ、Math.NETを使用してみましたが、正定値ではないため、この例の行列では実行されません。
ALGLIB の一部、特にspdmatrixcholeskyも試しました。うまくいくように見えますが、マトリックスの一部に対してのみです:
6 2 5 1 3
12 4 -2 2 4
30 2 0 1 7
6 10 1 14 20
8 22 7 20 40
ここで私が間違っていることを誰かが知っていますか? ここで別の関数を呼び出す必要がありますか?
簡単な答えはカードにないように見えるので、基礎となる数学を理解して、少なくともここで何が起こっているのかを理解しようとするのが最善かもしれません. 理論的な根拠や指針も高く評価されています。