1

我正在将 Fortran 程序转换为 C#。这必须一点一点地完成,并在此过程中进行概念证明。

这些初始步骤之一是复制它使用的 IMSL 功能。幸运的是,它只使用了少数几个:一些微不足道的随机数生成,一些微不足道的正态分布反转,还有一个不那么微不足道的:MCHOL。

文档中:

计算实对称矩阵 A 加上对角矩阵 D 的上三角分解,其中 D 在 Cholesky 分解期间按顺序确定,以使 A + D 非负定。

例程 MCHOL 计算 A + D 的 Cholesky 分解 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

有谁知道我在这里做错了什么?我需要在这里调用不同的函数吗?

由于似乎没有快速的答案,如果我了解基础数学可能是最好的,这样我至少可以尝试弄清楚这里发生了什么。任何理论基础或指针也值得赞赏。

4

2 回答 2

2

MCHOL例程不仅仅是进行 Cholesky 分解,它正在执行 Cholesky 的步骤并跟踪让它继续运行的 D 对角线。这是一个“修改过的”Cholesky。正常 Cholesky 需要一个正定输入,而示例不是。

这是MATLAB 中的一个实现。MCHOL我会使用这个实现来构建一个 .NET 版本。

维基百科:Cholesky分解

于 2011-10-20T00:14:30.060 回答
1

在您的示例中,a(5,1)=8 应该等于 a(1,5)=18。所以你的初始矩阵不是对称的。

于 2011-10-20T11:25:43.507 回答