2016-11-15 8 views
5

Я пишу код C#, который использует MathNet.Numerics.LinearAlgebra, и пытается сопоставить результаты с примером учебника. Одна часть кода делает инверсию complex32 массива «Ybus», и сохраняет его в другом массиве «Zbus»:Matrix Inverse с помощью 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», или как вы определили, что это то, что вы утверждаете, трудно сказать, в чем проблема. –

+0

Спасибо. Наверное, у меня достаточно репутации, чтобы опубликовать изображение, поэтому я просто разместил скриншот консольной печати элементов массива. Странно ... Единственное различие между двумя массивами - это инверсная операция. Если есть что-то странное под капотом моего массива ввода. –

+0

И btw, тот же метод/функция используется в обоих случаях для печати элементов массива, поэтому не похоже, что есть проблема с форматом печати или чем-то еще ... I думаю –

ответ

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

Thanks Christoph. Извините за ложную тревогу. Мой размер массива был слишком большим, а ряд нулей вызвал ошибку инверсии. О, и плохое округление было мне слишком ленив, чтобы набирать 8 цифр для каждого номера :) Кстати, большое спасибо за эту замечательную библиотеку MathNet. Это такая огромная помощь для инженеров, которые не хотят писать подробный код для таких вещей, как инверсия матрицы. –