Entwickler-Ecke

Basistechnologien - Komplexe Zahlen in C#


kili - So 25.10.09 20:35
Titel: Komplexe Zahlen in C#
moin moin,
also ich hätte da ja gleich nochmal eine frage: könnt ihr mir sagen wie ich den bereich der komplexen zahlen einfügen kann? also für den fall, das die wuzel aus einer negativen zahl gezogen werden muss?
grüße kilian



C#-Quelltext
1:
2:
3:
4:
5:
6:
            double p = Convert.ToDouble(Console.ReadLine());
            double q = Convert.ToDouble(Console.ReadLine());
            double zahl1 = p / -2;
            double zahl2 = Math.Sqrt((zahl1 * zahl1) - q);
            double ergebnis1 = zahl1 - zahl2 ;
            double ergebnis2 = zahl1 + zahl2;


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


JüTho - So 25.10.09 21:09

Hallo,

komplexe Zahlen gibt es in NET von Haus aus nicht; die musst du selbst entwickeln. Dazu bietet sich eine Struktur an; für die Operator-Überladung siehe MSDN How to: Use Operator Overloading to Create a Complex Number Class (C# Programmers Reference) [http://winfx.msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_csref/html/c9b8d982-5112-413f-bae3-b42ae3248ddf.asp]; irgendwo gibt es dort sicher auch eine deutsche Version.

Gruß Jürgen


kili - So 25.10.09 22:03

hmm ja ich hab mir den beitrag über komplexe zahlen durchgelesen. hat mir für mein programm nur nicht wirklich weitergeholfen. naja ich werd noch ein bißchen was ausprobieren


Christian S. - So 25.10.09 22:05

Man könnte sich ja auch vorstellen, dass man wahrscheinlich nicht der Erste ist, der komplexe Zahlen nutzen will und schauen, was es da in den weiten des Internets an Klassen gibt ;-)


Kha - So 25.10.09 23:12

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
komplexe Zahlen gibt es in NET von Haus aus nicht
Jupp, noch [http://msdn.microsoft.com/en-us/library/system.numerics.complex%28VS.100%29.aspx] nicht ;) . Bis dahin lässt sich mit einer Suchmaschine wie Koders.com wie gesagt sicher eine Alternative finden, aber am verlinkten Code gibt es als Grundlage nichts auszusetzen :nixweiss: .
Ich denke eher, es ist noch nicht klar geworden, zu welchem Grad überhaupt eine Einbindung in die Sprache möglich ist. Mit impliziten Konvertierungen und eigenen Operatoren ändert sich der Code zum Glück nur minimal:


C#-Quelltext
1:
2:
3:
Complex zahl2 = Complex.Sqrt(zahl1 * zahl1 - q); // oder Complex.Pow oder ...
Complex ergebnis1 = zahl1 - zahl2;
Complex ergebnis2 = zahl1 + zahl2;


gfoidl - Mo 26.10.09 00:27

Hallo,

Zitat:
Jupp, noch nicht

Das schaut mal gut aus. Obwohl ich interessant finde dass die Wurzel-Funktion nur eine komplexe Zahl als Ergebnis liefert (anstatt 2 bei der Quadratwurzel). Aber vielleicht wird das noch ;)


mfG Günther


Kha - Mo 26.10.09 00:51

user profile icongfoidl hat folgendes geschrieben Zum zitierten Posting springen:
Obwohl ich interessant finde dass die Wurzel-Funktion nur eine komplexe Zahl als Ergebnis liefert (anstatt 2 bei der Quadratwurzel).
Darüber kann man sich natürlich streiten - aber aus welchem Grund sollte es anders sein als bei Math.Sqrt ;) ? Im Reellen wie Komplexen ist die Quadratwurzel von z mathematisch eben nicht als Lösungsmenge der Gleichung w² = z definiert, sondern als eine ganz bestimmte dieser Lösungen. Wäre sie irgendetwas Anderes als eine Funktion C -> C, dürfte schriftliche Mathematik einfach verdammt umständlich werden :D .


gfoidl - Mo 26.10.09 01:30

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Im Reellen wie Komplexen ist die Quadratwurzel von z mathematisch eben nicht als Lösungsmenge der Gleichung w² = z definiert, sondern als eine ganz bestimmte dieser Lösungen.

Die Wurzel ist schon so definiert nur wird im Reellen meist der Definitionsbereich von w auf die nichtnegative reellen Zahlen beschränkt, da die Funktion über die reellen Zahlen gesehen nicht bijektiv ist (also nicht umkehrbar) und somit das exaktere +- entfällt.
Für die komplexen Zahlen gilt ähnliches. Die 2. Wurzel ist -1 x der 1. Wurzel (und diese wird in .net 4.0 zurückgegeben).

Insofern hast du recht warum es anders sein sollte als bei bei der reellen Wurzel Math.Sqrt. In den technischen Berechnungen die ich kenne werden jedoch immer alle komplexen Wurzeln benötigt und daher hat es mich gewundert warum dann wieder selbst auf die anderen Wurzel geschlossen werden muss wenn es doch gleich implementiert werden hätte können (zB durch eine andere Methode). Glücklicherweise ist es ja nicht allzu aufwändig von einer Wurzel auf n-1 verbleibenden zu kommen ;)

Ich habe allerdings die Kernaussage deiner Antwort nicht ganz kapiert. Vielleicht wiederholt meine Antwort deine oder sie widerspricht dir ;)


mfG Günther


Kha - Mo 26.10.09 20:42

user profile icongfoidl hat folgendes geschrieben Zum zitierten Posting springen:
Die Wurzel ist schon so definiert nur wird im Reellen meist der Definitionsbereich von w auf die nichtnegative reellen Zahlen beschränkt
Ok, das war zu ungenau ausgedrückt: Erfüllt w die Gleichung, ist sie eine Wurzel von z, die Wurzelfunktion gibt aber nach Definition eine ganz bestimmte dieser Lösungen zurück, keine Menge. Wenn sich eine Methode "Sqrt" nennt, soll sie bitteschön ebenfalls eine Abbildung C -> C sein, nicht mehr und nicht weniger wollte ich sagen. Für Extension Methods ist ja immer noch genug Platz ;) .