Algorithmus für komplexe Potenzen von/mit komplexen Zahlen

Neue Frage »

regxy Auf diesen Beitrag antworten »
Algorithmus für komplexe Potenzen von/mit komplexen Zahlen
man verzeihe mir meine vielleicht "faule" Frage, wie ein Algorithmus für komplexe Potenzen von/mit komplexen Zahlen aussieht.
Für reelle Potenzen fand ich immerhin:

Für eine komplexe Zahl z ungleich Null (mit dem Betrag r und dem Argument Æ \varphi ) soll unter z x mit x ∈ R \;z^{x}\;{\text{mit}}\;x\in \mathbb {R} \; jede der folgenden komplexen Zahlen mit k ∈ N 0 k\in \mathbb {N} _{0} verstanden werden:r x ⋅ [ cos ⁡ ( x ( Æ + k ⋅ 2 À ) ) + i ⋅ sin ⁡ ( x ( Æ + k ⋅ 2 À ) ) ] r^{x}\cdot \left[{\cos \left(x(\varphi +k\cdot 2\pi )\right)+\mathrm {i} \cdot \sin \left(x(\varphi +k\cdot 2\pi )\right)}\right]

mist, kann das hier im Editor nicht einfügen
...
Für eine komplexe Zahl z z ungleich Null (mit dem Betrag r r und dem Argument Æ \varphi ) soll unter z x mit x ∈ R \;z^{x}\;{\text{mit}}\;x\in \mathbb {R} \; jede der folgenden komplexen Zahlen mit k ∈ N 0 k\in \mathbb {N} _{0} verstanden werden:

https://de.wikibooks.org/wiki/Komplexe_Z...Rechenverfahren


aber wie geht es, wenn "x" ebenfalls komplex ist?
Ich will dies in C programmieren, aber ohne <complex.h>, das habe ich nämlich hier im virtuellen C compiler nicht
HAL 9000 Auf diesen Beitrag antworten »

Wenn du willst, dass sich jemand WIRKLICH damit befasst, dann solltest du die obigen Hieroglyphen in was lesbares verwandeln...

-------------------------------------------------

Normalerweise versteht man unter für beliebige komplexe mit die Zahl , wobei mit der Logarithmus-Hauptwert gemeint ist.

Sofern ich das wenige lesbare bei dir oben richtig deute, möchtest du stattdessen eine "mehrwertige Potenz" betrachten, also die Menge

.

Ja, das wird bisweilen gemacht, z.B. wenn man alle Lösungen der komplexen Gleichung als "-te Wurzeln von " bezeichnet.
regxy Auf diesen Beitrag antworten »

steht im geposteten Link ganz unten vor den Übungen,aber es würde eh nichts bringen, weil die Formel ja nur für reelle Exponenten gilt und ich die für komplexe Exponenten suche, wofür ich noch nirgends eine Lösung per googeln gefunden habe (inzwischen über 2 Stunden herumgesucht).

Für den Anfang würde auch eine abgespeckte Lösung helfen für Terme wie
n^s (n aus Z, s aus C),
aber auch hier fand ich keine Formel.

Gedacht ist es zur Berechnung der zeta-Funktion als Eulerprodukt
Steffen Bühler Auf diesen Beitrag antworten »

Generell gilt:











Wie man von kartesisch zu polar umrechnet, wirst Du wissen, nehme ich an. Und Dein Compiler kennt bestimmt die atan2-Funktion.

Viele Grüße
Steffen
regxy Auf diesen Beitrag antworten »

hm , e hoch i mal irgendwas kann ich nicht ausrechnen, dazu bräuchte ich ja <complex.h>.

Ich bräuchte eine Formel, wo ich den Realteil und den Imaginärteil getrennt als reelle Zahlen im R² ausrechnen kann, scheint dann doch sehr viel komplizierter zu sein, so ähnlich wie hier beim Dividieren:


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
typedef struct {
   double real;
   double imag;
} Complex;


Complex cdiv(Complex  c1, Complex  c2)
{
    Complex c3;

    c3.real = ((c1.real * c2.real) + (c1.imag * c2.imag)) / (pow(c2.real, 2) + pow(c2.imag, 2));
    c3.imag = -1 * (((c1.real * c2.imag) - (c1.imag * c2.real)) / (pow(c2.real, 2) + pow(c2.imag, 2)));

    if(c3.imag == 0)
        c3.imag = 0;

    return c3;
}
HAL 9000 Auf diesen Beitrag antworten »

Steffen, falls du mit die Polardarstellung meinst, dann sind die letzten beiden Zeilen deiner Gleichungskette falsch. Meines Erachtens lautet dann das Potenzergebnis (nur Hauptwert)

.

P.S.: Kurz vor dem Abschicken habe ich bemerkt, dass du das Ergebnis editiert hast.
 
 
Steffen Bühler Auf diesen Beitrag antworten »

Zur Umrechnung kartesisch-polar:



mit Betrag

und Winkel

PS: Und beim Multiplizieren komplexer Zahlen multiplizieren sich die Beträge und addieren sich die Winkel.
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von HAL 9000
Kurz vor dem Abschicken habe ich bemerkt, dass du das Ergebnis editiert hast.

Ja, aber trotzdem danke fürs Aufpassen!
regxy Auf diesen Beitrag antworten »

nochmal danke, aber das kann ich leider nicht programmieren.

ich bräuchte wie gesagt was in der Art zur getrennten Berechnung von real - und imag-Komponenten wie

code:
1:
2:
3:
4:
5:
6:
7:
Complex cpow(Complex  c1, Complex  c2) {
      Complex c3;    
      c3.real = fr(c1.real, c2.real, c1.imag, c2imag);  // fr: Funktion für den Realteil von  pow(c1,c2)    
      c3.imag = fi(c1.real, c2.real, c1.imag, c2imag); // fi: Funktion für den Imaginärteil von pow(c1,c2)    
      
      return c3;
}
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von regxy
das kann ich leider nicht programmieren.


Hast Du also keine atan2-Funktion? Die kannst Du Dir selber bauen, steht zum Beispiel in unserem Workshop.

Alles polar machen, Beträge multiplizieren, Winkel addieren und wieder kartesisch. Die Formel dafür hast Du ja schon verlinkt, aber auch die steht natürlich im Workshop.
HAL 9000 Auf diesen Beitrag antworten »

Zitat:
Original von Steffen Bühler
und Winkel

In C/C++/Java sind die Argumente gerade vertauscht: Da muss man atan2(y,x) rechnen.

In MS-Excel komischerweise ARCTAN2(x,y). Wäre schön gewesen, wenn man sich da besser geeinigt hätte. Augenzwinkern
regxy Auf diesen Beitrag antworten »

atan2 habe ich (ist in math.h enthalten), aber ich brauche eben getrennte Formeln für c3.real und c3.imag und verstehe nicht, wie ich das aus deinen Formeln isoliert herausziehen kann - komplexes rechnen ist noch etwas schwach ausgebildet...
HAL 9000 Auf diesen Beitrag antworten »

Anscheinend hast du massive Wissenslücken bei komplexen Zahlen, wenn du das aus den oben genannten Formeln nicht selbst hinkriegst. Basierend auf

Zitat:
Original von HAL 9000
.

ist das Potenzergebnis



mit den Neben- bzw. Hilfsrechnungen









Kriegst du es damit hin?
Steffen Bühler Auf diesen Beitrag antworten »

Nehmen wir die letzte Zeile meines editierten Beitrags:



Wie gesagt, die Beträge multiplizieren sich zu



und die Winkel addieren sich zu



Mit diesem Betrag und Winkel kommst Du nun auf den Real- und Imaginärteil.
regxy Auf diesen Beitrag antworten »

ist mir doch zu kompliziert, weil die C-Funktionen keine Beträge oder Quadrate von komplexen Zahlen können und auch die anderen Funktionen eine andere Syntax haben, die Verschachtelung mit den Hilfsvariablen macht es dann zu schwierig...
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von HAL 9000
In MS-Excel komischerweise ARCTAN2(x,y).

Ich denke, die Topmathematiker sind da bei MS a wengele durcheinandergekommen. Es gibt die Funktion KOMPLEXE und IMAGINÄRTEIL, die noch machen, was man vom Namen her erwartet. Aber schon die Funktion REALTEIL gibbet's nicht, die heißt IMREALTEIL. Und so weiter: IMARGUMENT, IMKONJUGIERTE, IMCOS etc.

Bei den Grundrechenarten wird's dann noch logischer: addieren macht IMSUMME (das Ergebnis), subtrahieren aber IMSUB (die Tätigkeit). Multiplizieren erledigt IMPRODUKT (das Ergebnis), dividieren dagegen IMDIV (die Tätigkeit).

Ich hatte vor ewigen Zeiten mal ein einfaches Excelprogramm zum Zwei-Ebenen-Wuchten geschrieben und kann mich gut erinnern, wie ich nach den entsprechenden Funktionen gesucht und mich anschließend über die eigenwillige Benamsung gewundert habe.
HAL 9000 Auf diesen Beitrag antworten »

Zitat:
Original von regxy
ist mir doch zu kompliziert, weil die C-Funktionen keine Beträge oder Quadrate von komplexen Zahlen können

Falls du es immer noch nicht begriffen hast: Was ich da oben hingeschrieben habe sind REIN REELLE Rechnungen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Complex cpow(Complex  c1, Complex  c2) {
      Complex c3;
      double lnr = ln(c1.real * c1.real + c1.imag * c1.imag) * 0.5;
      double phi = atan2(c1.imag, c1.real);
      double rpow = exp(lnr * c2.real - phi * c2.imag);
      double phipow = lnr * c2.imag + phi * c2.real;
      c3.real = rpow * cos(phipow);
      c3.imag = rpow * sin(phipow);
      return c3;
}
D.h., die verwendeten Bibliotheksfunktionen werden hier tatsächlich nur für reelle Argumente verwendet!
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von regxy
weil die C-Funktionen keine Beträge oder Quadrate von komplexen Zahlen können


Sowas schreibt man ja auch selbst:

code:
1:
2:
3:
4:
5:
double betrag(double realteil, double imaginaerteil)
{
   return sqrt(realteil*realteil+imaginaerteil*imaginaerteil);
}


Beim Quadrieren quadriert sich der Betrag und der Winkel verdoppelt sich.
regxy Auf diesen Beitrag antworten »

ach so, ja klar, ich habe es jetzt so gemacht:
code:
1:
2:
3:
long double Betrag(Complex c)  {	
   return sqrt(c.real*c.real + c.imag*c.imag);
}


jetzt müsste ich es schaffen.... smile

dachte ich ....
aber die verschachtelten phi, r~, ln(r) und was zu welchem der beiden c1, c2 für welche Komponente gehört macht es zu wirr...
regxy Auf diesen Beitrag antworten »

Zitat:
Original von HAL 9000
Falls du es immer noch nicht begriffen hast: Was ich da oben hingeschrieben habe sind REIN REELLE Rechnungen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Complex cpow(Complex  c1, Complex  c2) {
      Complex c3;
      double lnr = ln(c1.real * c1.real + c1.imag * c1.imag) * 0.5;
      double phi = atan2(c1.imag, c1.real);
      double rpow = exp(lnr * c1.real - phi * c2.imag);
      double phipow = lnr * c2.imag + phi * c2.real;
      c3.real = rpow * cos(phipow);
      c3.imag = rpow * sin(phipow);
      return c3;
}
D.h., die verwendeten Bibliotheksfunktionen werden hier tatsächlich nur für reelle Argumente verwendet!


aha, habe jetzt erst den editierten Artikel gesehen, das macht es jetzt tatsächlich absolut klar und praktisch nutzbar!
Vielen, vielen Dank!
HAL 9000 Auf diesen Beitrag antworten »

Du bist ein hoffnungsloser Fall: Selbst beim KOMPLETTEN Code nörgelst du noch rum - grauenhaftes Verhalten. Finger1
regxy Auf diesen Beitrag antworten »

wieso nörgeln? im Gegenteil, ich habe mich doch sehr herzlich bedankt!

bei c1=(2;0) und c2=(3;0)
kommt dann
real 8
imag 1
heraus, stimmt das? (ich hätte imag 0 erwartet)
HAL 9000 Auf diesen Beitrag antworten »

Ich bezog mich auf diese Nörgelei:

Zitat:
Original von regxy
aber die verschachtelten phi, r~, ln(r) und was zu welchem der beiden c1, c2 für welche Komponente gehört macht es zu wirr...
regxy Auf diesen Beitrag antworten »

das war kein Nörgeln sondern Eingestehen meines Scheiterns beim Codieren.
ich verstehe leider nicht viel von komplexen Zahlen (außer dass sie 2 Komponenten haben) und daher macht mir das Rechnen mit ihnen jenseits vom Addieren zu einem großen Problem, und dann erst recht das Kodieren, da schwirrt mit zu schnell der Schädel...Aber nochmals vielen Dank für deinen Code!
HAL 9000 Auf diesen Beitrag antworten »

Vielleicht solltest du es erstmal mit etwas einfacherem probieren - sowohl bei den komplexen Zahlen (nicht gleich die Zetafunktion) also auch beim Programmieren.
regxy Auf diesen Beitrag antworten »

das Programmieren an sich ist nicht das Problem, wenn die Formel wirklich klar ist, und das war sie mir noch nicht, daher kam ich mit den vielen verschachtelten Koeffizienten und Termen durcheinander.

Aber zurück zur obigen Frage:

bei c1=(2;0) und c2=(3;0) kommt mit deinem Algorithmus
real 8
imag 1
heraus, stimmt das? (ich hätte imag 0 erwartet)
HAL 9000 Auf diesen Beitrag antworten »

Nein,es kommt heraus - du hast dich verrechnet.

EDIT: Ah, Ok, ich hab mich an einer Stelle im Code vertippt - da musste c2.real statt c1.real hin. Aber mit diesem Vertipper wäre das falsche Ergebnis 4 statt 8+i herausgekommen.
regxy Auf diesen Beitrag antworten »

ln() kennt C nicht, ich habe daher log() verwendet.
Dann gabs aber noch beim editieren einen c+p-Fehler, und mein "Virtual C" hier hat leider eine sehr unübersichtliche IDE.
... jap, jetzt kommt hier auch 8;0
HAL 9000 Auf diesen Beitrag antworten »

log ist Ok, in C/C++ ist das der natürliche Logarithmus, ja.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »