使用MathNet.Numerics进行矩阵求逆

时间:2016-11-15 18:27:49

标签: c# matrix mathnet

我正在编写一些使用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

1 个答案:

答案 0 :(得分:2)

正如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)