使用MathNet.Numerics进行矩阵求逆

5
我正在编写一些使用MathNet.Numerics.LinearAlgebra的C#代码,并尝试与教科书示例匹配结果。代码的一部分对一个complex32数组"Ybus"进行反演,并将其存储在另一个数组"Zbus"中。
Matrix<Complex32> Ybus = Matrix<Complex32>.Build.Dense(numBuses, numBuses);

Matrix<Complex32> Zbus = Matrix<Complex32>.Build.Dense(numBuses, numBuses);

我的 Ybus 与书中的例子完全匹配。

Ybus = j[ -13       5      4      0
            5   -13.5    2.5      2
            4     2.5     -9    2.5
            0       2    2.5   -4.5] 

但是当我进行反转时

Zbus = Ybus.Inverse();

Zbus的结果全为NaN。
然而,从书中得出的正确结果如下:
Zbus = j[ .15     .09    .12    .11
          .09     .15    .12    .13
          .12     .12    .25    .19
          .11     .13    .19    .39] 

有人有什么想法,问题可能是什么?也许复杂矩阵的反演存在一些问题?

enter image description here

教训:不要将数组做得太大,以至于它们有很多行0或反之会崩溃 :) ... 这是正确的答案:

enter image description here


对我来说,它似乎运行良好。 我猜测你的 Ybus 不是你想象中的那样。 由于您没有展示如何填充 Ybus 或如何确定它是您所声称的,因此很难确定问题的具体原因。 - Jason Boyd
谢谢。我想我已经有足够的声望来发布一张图片,所以我只是发布了一个控制台打印数组元素的截图。奇怪...这两个数组之间唯一的区别就是反转操作。除非我的输入数组底层有什么奇怪的东西... - J. McCabe
顺便说一下,在这两种情况下,使用的是相同的方法/函数来打印数组元素,所以并不像打印格式有问题之类的... 我觉得 - J. McCabe
哎呀,对不起大家。我真是太糊涂了。我的数组大小多了一行/列,由于0行导致逆矩阵计算失败。我向大家道歉。现在已经没问题了:) - J. McCabe
1个回答

3
正如Jason所提到的,这似乎运行良好。例如:
var y = Complex32.ImaginaryOne * CreateMatrix.Dense(4, 4, new Complex32[] {-13f,5f,4f,0f,5f,-13.5f,2.5f,2f,4f,2.5f,-9f,2.5f,0f,2f,2.5f,-4.5f});
y.ToString("F3");
y.Inverse().ToString("F3");

提供以下输出,与您的书籍结果相匹配(除了书中的不良舍入):
DenseMatrix 4x4-Complex32
(0.000, -13.000)    (0.000, 5.000)   (0.000, 4.000)   (0.000, 0.000)
  (0.000, 5.000)  (0.000, -13.500)   (0.000, 2.500)   (0.000, 2.000)
  (0.000, 4.000)    (0.000, 2.500)  (0.000, -9.000)   (0.000, 2.500)
  (0.000, 0.000)    (0.000, 2.000)   (0.000, 2.500)  (0.000, -4.500)

DenseMatrix 4x4-Complex32
(0.000, 0.153)  (0.000, 0.097)  (0.000, 0.126)  (0.000, 0.113)
(0.000, 0.097)  (0.000, 0.153)  (0.000, 0.124)  (0.000, 0.137)
(0.000, 0.126)  (0.000, 0.124)  (0.000, 0.256)  (0.000, 0.197)
(0.000, 0.113)  (0.000, 0.137)  (0.000, 0.197)  (0.000, 0.393)

1
谢谢Christoph。很抱歉误报警告。我的数组大小太大了,而且零行导致了逆矩阵失败。哦,还有不良的舍入是因为我懒得为每个数字输入8位数字:) 顺便说一下,非常感谢你这个美妙的MathNet库。它对我们这些不想编写像矩阵求逆这样详细代码的工程师来说是如此巨大的帮助。 - J. McCabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接