2016-11-15 536 views
5

我在写一些使用MathNet.Numerics.LinearAlgebra的C#代码,并尝试将结果与教科书示例进行匹配。代码的一部分确实在另一个数组“Zbus”一complex32阵列“YBUS”,并将其存储的反转:使用MathNet.Numerics的矩阵求逆

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

+0

这似乎为我工作的罚款。我的猜测是你的'Ybus'不是你想象的那样。既然你没有说明你是如何填充'Ybus'的,或者你是如何确定这是你所声称的,那么很难说这个问题到底是什么。 –

+0

谢谢。我想我有足够的声望发布图片,所以我刚刚发布了阵列元素的控制台打印的屏幕截图。奇怪...这两个数组之间的唯一区别是逆运算。除非在输入数组的底层有什么奇怪的东西。 –

+0

顺便说一句,在这两种情况下使用相同的方法/函数来打印数组元素,所以它不像打印格式或其他问题。认为 –

回答

2

正如贾森所说,这似乎工作得很好。例如:

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

谢谢克里斯托夫。抱歉虚惊一场。我的数组大小太大,并且零行导致反转失败。哦,而且四舍五入的结果是我懒得为每个数字键入8位数字:)顺便说一句,非常感谢这个美妙的MathNet库。对于我们不想为矩阵求逆等东西编写详细代码的工程师来说,这是一个巨大的帮助。 –