2016-11-15 16 views
5

Piszę kod C#, który używa MathNet.Numerics.LinearAlgebra i próbuje dopasować wyniki z przykładu podręcznikowego. Jedna część kodu robi inwersję o complex32 tablicy „Ybus” i przechowuje go w innej tablicy „Zbus”:Macierz odwrotna za pomocą MathNet.Numerics

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

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

My Ybus Zastępuje dokładnie przykład w książce.

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

Ale kiedy zrobić inwersję

Zbus = Ybus.Inverse(); 

wyniki Zbus są NaN

natomiast poprawny wynik z książki wygląda następująco:

Zbus = j[ .15  .09 .12 .11 
      .09  .15 .12 .13 
      .12  .12 .25 .19 
      .11  .13 .19 .39] 

Każdy masz jakieś pomysły na temat problemu? Może inwersja złożonej matrycy ma pewne problemy? dowiedział

enter image description here

Lekcja: Nie używaj zbyt duże tablice tak, że mają rzędy znaków 0 lub odwrotności będzie wysadzić :) ... Tutaj jest prawidłowa odpowiedź:

enter image description here

+0

Wydaje się działać dobrze dla mnie. Domyślam się, że twój "Ybus" nie jest taki, jak myślisz. Ponieważ nie pokazujesz, w jaki sposób wypełniasz 'Ybus' lub jak ustaliłeś, że to jest to, co twierdzisz, trudno jest dokładnie określić problem. –

+0

Dzięki. Wydaje mi się, że mam dość reputacji, by opublikować zdjęcie, dlatego właśnie opublikowałem zrzut ekranu wydruku konsoli elementów tablicy. Dziwne ... jedyną różnicą między tymi dwiema tablicami jest operacja Inverse. Chyba że pod maską mojej tablicy wejściowej jest coś dziwnego ... –

+0

A przy okazji ta sama metoda/funkcja jest używana w obu przypadkach do drukowania elementów tablicy, więc nie ma problemu z formatem drukowania lub czymś ... myśl –

Odpowiedz

2

Jak wspomniał Jason, wygląda na to, że działa dobrze. Na przykład:

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"); 

Zapewnia następujące dane wyjściowe, dopasowując swój wynik księgowy (z wyjątkiem złej zaokrągleniem w książce):

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

Dzięki Christoph. Przepraszamy za fałszywy alarm. Mój rozmiar tablicy był zbyt duży, a rząd zer spowodował niepowodzenie odwrotności. Aha, i złe zaokrąglenie było dla mnie zbyt leniwym, aby wpisać 8 cyfr dla każdej liczby :) Przy okazji, dziękuję bardzo za tę wspaniałą bibliotekę MathNet. Jest to ogromna pomoc dla inżynierów, którzy nie chcą pisać szczegółowego kodu dla takich rzeczy jak inwersja macierzy. –

Powiązane problemy