atan2



  • Hallo an alle Mitglieder hier!

    Ich habe eine Frage bezüglich der im Header "math.h" definierten Funktion atan().

    Ich schreibe ein Programm, welches die Grundrechenarten auf zwei komplexe zahlen z1 und z2 ausführt.

    Der Einfachheit wegen gehe ich für die Multiplikation und Division den Weg über die Polarform einer komplexen Zahl.

    Hierbei ist es von Vorteil, den Phasenwinkel φ einer komplexen Zahl über den atan2 zu bestimmen, da ich mir so um die Vorzeichen der Argumente bzw. über die Lage des komplexen Zeigers (Quadranten) keine Gedanken machen muss.

    So sollte mir doch die Zeile

    double Phasenwinkelz1=atan2(z1.imag, z1.real)*180/PI;
    

    nach dieser Überlegung den Winkel zwischen komplexem Zeiger und der positiv reellen Achse gegen den Uhrzeigersinn gemessen liefern.

    Dies klappt auch, sofern der Zeiger der komplexen Zahl z1 im 1. oder im zweiten Quadranten liegt. Liegt er aber im dritten oder im 4. Quadranten, so wird der Winkel mit dem Uhrzeigersinn gemessen; ich bekomme also einen vom Betrage her falschen und vorzeichenbehafteten Winkel.

    Nun könnte ich ja mit einer bedingten Anweisung die Argumente z1.real und z1.imag auf ihre Vorzeichen prüfen lassen und zu dem Ergebnis, welches der atan2 mir liefert, ∏ für den 3.Quadranten bzw. 2*∏
    für den 4. Quadranten hinzuaddieren und dann die Umwandlung in das Gradmaß vornehmen.

    Dies widerspricht aber meiner Vorstellung, nach welcher der atan2 mir gerade dieses abnimmt .... oder abnehmen sollte.
    Zudem würde der Code ja auch nicht gerade sehr übersichtlich werden, da ich dies dann ja für zwei komplexe Zahlen z1 und z2 machen müßte.

    Ich poste euch hier einmal die komplette Funktion für die Multiplikation:

    void  MUL(komplex z1, komplex z2)
    {
    	komplex Z;
    
    	double Betragz1 = sqrt(pow(z1.real,2) + pow(z1.imag,2));  	
    
    	double Betragz2 = sqrt(pow(z2.real,2) + pow(z2.imag,2)); 	
    
    	double Phasenwinkelz1 = atan2(z1.imag, z1.real) * 180/PI;
    
    	double Phasenwinkelz2 = atan2(z2.imag, z2.real) * 180/PI;
    
    	double BetragZ = Betragz1 * Betragz2;
    
    	double PhasenwinkelZ = Phasenwinkelz1 + Phasenwinkelz2;
    
    	Z.real = BetragZ * cos(PhasenwinkelZ);
    
    	Z.imag = BetragZ * sin(PhasenwinkelZ);
    
    	printf("\nBetrag z1 = %.2f Phasenwinkel z1 = %.2fdeg" , Betragz1, Phasenwinkelz1);
    
    	printf("\n%.2f%+.2fj\n\n", Z.real, Z.imag);
    
    }
    

    Da ich bis heute noch nicht wusste, dass der atan2 das Problem ist, taucht hier jeder Schritt als einzelne Anweisung auf. So habe ich den Fehler aufspühren können ... ja, dazu gibt es eigentlich den Debugger 🙄. Aus diesem Grund fällt der Funktionskörper vllt noch etwas zu kompakt aus.

    Ich würde mich über eure Hilfe freuen und bedanke mich schon einmal im Voraus.

    PS: Ich habe genau dieses Problem ursprünglich im Beitrag "Programmieraufgabe" verfasst. Nachdem ich es dort "ausgeschnitten" und einen eigenen Beitrag hier erstellte, habe ich am Ursprungsort lediglich "verlegt" eingetragen. Der jeweilige Moderator sollte den Beitrag dort löschen, da ich es selber ja nicht kann.

    Vielen Dank!!! 😉



  • Xenomorph schrieb:

    ...
    Hierbei ist es von Vorteil, den Phasenwinkel φ einer komplexen Zahl über den atan2 zu bestimmen, da ich mir so um die Vorzeichen der Argumente bzw. über die Lage des komplexen Zeigers (Quadranten) keine Gedanken machen muss.
    ...

    Xenomorph schrieb:

    ...
    Dies widerspricht aber meiner Vorstellung, nach welcher der atan2 mir gerade dieses abnimmt .... oder abnehmen sollte.
    ...

    Hi Bruder !
    Das eine ist, was man sich vorstellt zu bekommen; das andere, was man bekommt. 😃
    atan2 liefert dir die Werte von -∏ bis ∏
    Na, klingelts ?



  • Big Brother schrieb:

    Hi Bruder !
    Das eine ist, was man sich vorstellt zu bekommen; das andere, was man bekommt. 😃
    atan2 liefert dir die Werte von -∏ bis ∏
    Na, klingelts ?

    Hi, BB!
    😮 Also doch! Ich dachte es mir anhand der Ergebnisse, die ich erhalte bereits. 😮

    Dann ist der atan2 also nicht die Art von Wunderwaffe, für die ich ihn vorschnell hielt!!!

    Danke für deine schnelle Antwort, BB!


Anmelden zum Antworten