2016-11-15 2 views
5

Ich schreibe einen C# -Code, der MathNet.Numerics.LinearAlgebra verwendet, und versuche, Ergebnisse mit einem Lehrbuchbeispiel zu vergleichen. Ein Teil des Codes hat eine Umkehrung eines complex32 Array „YBUS“ und speichert sie in einem anderen Array „ZBUS“:Matrix Inverse mit MathNet.Numerics

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

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

Mein YBUS entspricht genau dem Beispiel in dem Buch.

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

Aber wenn ich eine Umkehrung tun

Zbus = Ybus.Inverse(); 

die Ergebnisse ZBUS sind alle NaN

während das richtige Ergebnis aus dem Buch wie folgt aussieht:

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

Jedermann haben Sie irgendwelche Ideen, was das Problem sein könnte? Vielleicht hat die Inversion einer komplexen Matrix einige Probleme?

enter image description here

Lektion gelernt: nicht Ihre Arrays zu groß machen, so dass sie Reihen von 0'en oder die inversen wird die Luft sprengen :) ... Hier ist die richtige Antwort:

enter image description here

+0

Es scheint gut für mich zu arbeiten. Meine Vermutung ist, dass dein 'Ybus' nicht das ist, was du denkst. Da Sie nicht zeigen, wie Sie "Ybus" bevölkern oder wie Sie festgestellt haben, dass es das ist, was Sie behaupten, ist es schwer zu sagen, was das Problem genau ist. –

+0

Danke. Ich schätze, ich habe genug Reputation, um ein Bild zu veröffentlichen, also habe ich gerade einen Screenshot des Konsolenabdrucks der Elemente des Arrays gepostet. Seltsam ... der einzige Unterschied zwischen den beiden Arrays ist die Inverse Operation. Es sei denn, es ist etwas seltsam unter der Haube meines Eingabe-Array .. –

+0

Und übrigens, die gleiche Methode/Funktion wird in beiden Fällen verwendet, um die Array-Elemente zu drucken, so ist es nicht wie ein Problem mit dem Druckformat oder etwas ... Ich denke –

Antwort

2

Wie Jason erwähnt, scheint dies gut zu funktionieren. Zum Beispiel:

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

Bietet die folgende Ausgabe, Ihr Buch Treffer zu (mit Ausnahme der schlechten Runden im Buch):

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

Danke Christoph. Entschuldigung für den Fehlalarm. Meine Array-Größe war zu groß und die Reihe der Nullen verursachte die Inverse zum Fehlschlagen. Oh, und die schlechte Rundung war, dass ich zu faul war, 8 Ziffern für jede Nummer einzugeben :) Übrigens, vielen Dank für diese wundervolle MathNet-Bibliothek. Es ist eine große Hilfe für uns Ingenieure, die nicht den detaillierten Code für Dinge wie Matrixinversion schreiben wollen. –

Verwandte Themen