komplexe Zahlen (UDF)

  • Inspiriert von der "Geburtstagsansprache" von Oscar poste ich jetzt einfach mal meine UDF für komplexe Zahlen, an der ich in den letzten Wochen gearbeitet habe, vielleicht findet ja jemand Verwendung dafür. :D


    Verwendung:
    Momentan stehen neben den Grundrechenarten +, -, *, / und ^ die Funktionen Sqrt, Exp, Log, Sin, Cos, Tan, Cot, Sec, Csc zur Verfügung. Um diese von den "normalen" Funktionen unterscheiden zu können beginnen sie mit einem c, aus Sqrt(-1) wird also cSqrt(-1). Die Parameter der Funktionen sind eigentlich mit c(Realteil, Imaginärteil) erstellte komplexe Zahlen (Arrays), man kann aber auch problemlos reelle Zahlen als Parameter übergeben (wie in dem Beispiel im vorherigen Satz).


  • Moin,


    Ich finde die Sache sehr schön, auch wenn ich selbst noch nach einer Verwendung suchen muss :D

    lg
    M

  • So kann man das natürlich auch machen. :D


    Mit Structs statt Arrays und dem ternären Operator in der cToString Funktion würde die UDF um einiges besser aussehen, aber bis zur nächsten Stable verzichte ich darauf lieber... Über den Sinn lässt sich natürlich auch streiten, aber vielleicht will ja hier jemand die Lösungsformel für Polynome 3. Grades in AutoIt implementieren. :D

  • Dann stell mal schnell in Trac einen Feature Request ;)

  • Hallo,


    also komplexe Zahlen sind in der Elektrotechnik und im Maschinenbau extrem wichtig. Und wer schon einmal probiert hat, Berechnungen für die Wechselstromtechnik zu programmieren, wird um die komplexen Zahlen gar nicht herum kommen. Mir ging es ähnlich, deshalb hab ich auch eine UDF für komplexe Zahlen entwickelt. allerdings hab ich auch structs verwendet. Aber am Ende muss jeder selber entscheiden was und wie er es nutzen möchte.



    PS: Die Erklärungen/Kommentare sind nicht vollständig.


    Gruß der Strahleman 8)

  • Ah.. Komplexe Zahlen, das hatte ich in der Abiturstufe als Kurs belegt.


    Feine Lösungen.
    Strahlemann, deines erschlägt einen ja fast mit seiner Komplexität - Respekt :thumbup:
    Eines mal als Tipp von einem alten Funktions-Junkie ;)
    - SetError und in der Folgezeile erst den Return ist selten erforderlich
    Da SetError als 3-ten Parameter einen Returnwert enthält, funktioniert "Return SetError(iErr, iExt, iReturn)" super.
    - Gerade bei solch umfangreicher Funktionssammlung nach Vereinfachungen schauen. Du verwendest in der Mehrzahl der Funktionen
    If Not _CmplxCheck($cmp) Then
    If IsNumber($cmp) Then
    $cmp = _Cmplx($cmp, 0)
    Else
    SetError(1)
    Return 0
    EndIf
    EndIf
    Was hältst du hier von:
    ; == dafür nur:
    If Not __Check($cmp) Then Return SetError(1,0,0)

    Func __Check(ByRef $_cmp)
    If Not _CmplxCheck($_cmp) Then
    If Not IsNumber($_cmp) Then Return False
    $_cmp = _Cmplx($_cmp, 0)
    EndIf
    Return True
    EndFunc

    Spart dir 7 Zeilen Code je Aufruf. Bei dem Umfang haut das ganz schön rein. ;)

  • Hi BugFix,


    ja danke für die Hinweise, die Änderungen werde ich auf jeden Fall aufnehmen. Vereinfachen ist immer so eine lästige Arbeit - vor allem wenn man sich freut, dass die Funktionen endlich laufen ;)
    Mal sehen wann ich Zeit hab das einzupflegen. Dann werde ich die neue UDF auch nochmal einstellen.


    Gruß der Strahleman 8)

  • Es hat mir keine Ruhe gegeben.
    Ich wollte die UDF natürlich auch so einfach wie möglich gestalten, somit hier jetzt die vereinfachte Version.
    Außerdem ist mir aufgefallen, dass ich auf eine andere UDF verweise bzw. auf Funktionen aus einer anderen UDF. Hab die benötigten Funktionen jetzt direkt in die Complex-UDF eingegeben.


    Falls Interesse besteht stelle ich die Datei und eine Beispieldatei zum Download bereit:
    Complex
    autoit.de/wcf/attachment/23748/


    Complex Beispiele
    autoit.de/wcf/attachment/23747/

  • allerdings hab ich auch structs verwendet.

    Das bietet sich natürlich besonders an, wenn man eine der aktuellen Beta-Versionen benutzt:$c = cmplx(1, 2)
    $a = $c.re
    $b = $c.im
    Bei meiner UDF für Vektoren (welche ich bei Gelegenheit vervollständigen und posten werde) habe ich das auch so gemacht, da es eigentlich gar nicht übersichtlicher geht. Ist dann aber leider auf die Beta beschränkt.


    Du verwendest in der Mehrzahl der Funktionen [...]
    Spart dir 7 Zeilen Code je Aufruf. Bei dem Umfang haut das ganz schön rein.

    Cool, dann habe ich sogar intuitiv mal was richtig gemacht. :D

  • Nach einer anständigen Analyse der ToString Funktion konnte ich sie mal vernünftig verkürzen :D
    Die alte (aus meinem ersten Post) hat 249 Byte, die neue noch 132 ;)

    Man sieht: nahezu keinerlei Redundanzen, eine viel kürzere Version ist also nicht möglich :)


    Sinnlose Optimierungen FTW !
    lg
    M

  • Hey James,
    deine komplexe Zahlen UDF erinnerte mich direkt an ein vor langer Zeit geschriebenes Programm von mir über die Mandelbrotmenge.


    Da ich seit langer Zeit kein AutoIt mehr angerührt habe kitzelte es mir doch ein bisschen in den Fingerspitzen und ich habe das ganze mal als Funktion mit deinen Funktionen umgesetzt:

    ;Parameter:
    ; c - Komplexe Zahl (Koordinaten die geprüft werden sollen)
    ; max - Maximale Anzahl an Iterationen (bzw in dem Fall Rekursionen)
    ; zOld - Nicht verändern
    ; actual - Nicht verändern
    Func Mandelbrot($c, $max = 20, $zOld = 0, $actual = 0)
    If ($max >= $actual) Then
    $zActual = cAdd(cMul($zOld, $zOld), $c)
    If (cAbs($zActual) < 2) Then
    Return Mandelbrot($c, $max, $zActual, $actual + 1)
    Else
    Return cAbs($zActual)
    EndIf
    Else
    Return cAbs($zOld)
    EndIf
    EndFunc ;==>Mandelbrot


    Normalerweise ist die Berechnung Iterativ, da ich aber schulisch (in Delphi :thumbdown: ) so oft rekursiv arbeite habe ich es auch mal hier rekursiv versucht und geschafft :D.
    Lange Rede kurzer Sinn. Die Funktion prüft ob eine Koordinate im komplexen Koordinatensystem (oder wie man das nannte) auch wirklich zur Mandelbrotmenge gehört.
    MfG - Xorianator

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Sehr schön.
    Gut, dass du mich daran erinnert hast, das wollte ich auch schon lange mal programmieren.


    Ich habe das jetzt einfach mal als iterative Funktion umgesetzt und ein bisschen GDI+ drumherum gepackt. Die Performance ist wirklich schlecht, aber das kann man ja bei Gelegenheit ändern.

  • Die Performance erinnert mich ja schon fast an das Programm was ich vor 2 Jahren geschrieben habe :D
    Aber schön gemacht, auf jedenfall ;)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal