2016-11-15 539 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庫。對於我們不想爲矩陣求逆等東西編寫詳細代碼的工程師來說,這是一個巨大的幫助。 –